2012-01-11 4 views
3

내 목록을 반대하지 않습니다, 나는리스프는 테스트 CLISP을 사용하여, 나는 리스프에서 숙제를하고 있어요

(defun myreverse (thelist) 

(reverse thelist) 
(print thelist) 

(if (equal thelist nil) 
    nil 
    (if (consp (first thelist)) 
      (cons (myreverse (reverse (first thelist))) 
       (myreverse (reverse (rest thelist)))) 
      (cons (first thelist) (myreverse (rest thelist)))))) 

나는 새로운 종류의이야이 코드를로드하고 CLISP에서의 실행 해요 리스프하지만이 코드는 모든 thelist 반전되지 않으며, 내 출력은 다음과 같습니다

[18]> (myreverse '(a (b c) d)) 

(A (B C) D) 
((B C) D) 
(C B) 
(B) 
NIL 
(D) 
NIL 
(A (C B) D) 

내 코드의 첫 번째 줄, 왜 첫 번째 인쇄 문 반전되지 (reverse thelist)라고? 내가 놓친 게 있니?

+1

'(null thelist)'는 Common Lisp에서'(equal thelist nil)'보다 관용적이다. –

답변

4

필자는 (역순) 부작용이 없으므로 원래 목록을 역으로 만들지는 않겠지 만 역순으로 새 목록을 반환합니다. 이것은 Common Lisp에서는 그리 자연스럽지 않지만 Scheme에서 기대됩니다. 그럼에도 불구하고, 여기에 문서가있다. http://www.lispworks.com/documentation/HyperSpec/Body/f_revers.htm#reverse

+0

아아, 그렇다면 ** (B C) **는 목록을 반환 할 때 실제로 코드의 다른 부분 (즉, 역방향 모두)으로 이동하기 때문에 ** (B C) **를 뒤집습니까? – ToastyMallows

+0

그래, 단지'thelist'를 출력합니다.이 경우'(reverse (first thelist)) '의 결과 일 것입니다. –

+1

정말 고마워요. 정말 많이 혼란 스러웠습니다. – ToastyMallows