2012-01-11 5 views
3

私のリストを逆転されていない、と私はLispはテストするためにCLISPを使用して、私はLispでのいくつかの宿題をやっている

(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にで実行していますLispのが、このコードはまったくthelistを逆転されていない、私の出力は次のようになります。

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

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

私のコードの最初の行は、なぜそれが最初のprint文のために逆転されていない(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)**それはリストを返すとき、実際にはコード内の別の場所に行くからです(つまり、reverse-all)? – ToastyMallows

+0

ええ、 'thelist'を出力します。その場合、'(reverse(first thelist)) 'の結果となります。 –

+1

本当にありがとうございました。 – ToastyMallows

関連する問題