7

SICP 演習 2.26 では、このスキーム コードが与えられます。

(define x (list 1 2 3))
(define y (list 4 5 6))

次に、このコンス コールが与えられます。

(cons x y)

結果としてリストのペアが生成されると予想して((1 2 3) (4 5 6))いましたが、インタープリターは ((1 2 3) 4 5 6) ...4 つの要素を持つリストを返します。最初の要素はリストです。y の扱いが異なるのはなぜですか? 説明のために他のSICPの回答を調べてみましたが、満足のいくものを見つけることができませんでした. では、Scheme/Lisp の専門家は、短所のこの側面に光を当てることができますか? 洞察をお寄せいただきありがとうございます。

4

6 に答える 6

14

'((1 2 3) 4 5 6)実際にはリストのペアです。別の書き方を次に示します。

'((1 2 3) . (4 5 6))

ただし、プリンターはできる限りドット ペア表記を回避するため、代わりに最初の表現が取得されます。ルールは次のとおりです。

'(x . (xs ...))
=>
'(x xs ...)

xおよびxs. _ ここで、x = '(1 2 3)xs = '(4 5 6)、つまり を取得します((1 2 3) 4 5 6)


コンスとドット ペア表記がどのように関連しているかを確認するために、問題を単に'(1)とに短縮してみましょう'(6)。それらのペアを構築する最低レベルの方法は次のとおりです。

(cons (cons 1 '()) (cons 6 '()))

ここで'()は、nil、または空のリストです。これを文字通りドット ペア表記に変換すると、次のようになります。

'((1 . ()) . (6 . ()))

ただし、プリンターは可能な限りドット ペア表記を折りたたむため、代わりに次のようになります。

'((1 . ()) . (6 . ()))
=>
'((1) . (6))    ; <-- x=1, xs=nothing; x=6, xs=nothing
=>
'((1) 6) ; <-- x=1, xs=6
于 2010-05-27T14:24:07.973 に答える
10

cons最初の引数をリストの先頭として使用し、2 番目の引数を末尾として使用します。

(1 2 3)結果のリストの先頭を構成する最初の listと(4 5 6)、リストの末尾として使用される 2 番目の list を指定します。したがって、 で終了し((1 2 3) 4 5 6)ます。

左から右への櫛としてのリストのことで、空のリスト (ここで表されoます) で終わり、それらがどのように組み合わされるかを確認します。

 X=      Y=
 /\      /\
1 /\  + 4 /\    
 2 /\    5 /\  
  3  o    6  o

次に、以下を構築します。

 /\
X  Y

取得:

  /\
 /\ \
1 /\ \
 2 /\ \
  3  o/\
     4 /\
      5 /\
       6  o

これは((1 2 3) 4 5 6括弧で表した場合です。そして、これは一対のリストです。

于 2010-05-27T14:19:31.610 に答える
2

ねえ、私はあなたがそれをこのように考えることができると思います;

nil がある場合は常に、次のように一対の括弧が必要です。

(cons 1 (cons 2 nil))--> (リスト 1 2)

(let ((x (リスト 1 2 3)) (y (リスト 4 5 6))))

1.(cons xy)--> (cons (cons 1 (cons 2 (cons 3 nil))) (cons 4 (cons 5 (cons 6 nil)))) ここで、最初の nil はペアの終わりを表しますこれは括弧で表現できます。一方、2 番目の nil は、別の括弧のペアを使用するペア全体の終わりを表します。したがって、((1 2 3) 4 5 6)

2.(list xy)-> (cons x (cons y nil); x には nil が含まれていることがわかっているため、(1 2 3) である必要があります。2 番目の部分には 2 つの nil が含まれているため、((1 2 3) (4 5 6));

最も内側の nil は、最も外側の括弧を意味します。

それが役立つことを願っています。

于 2011-03-17T09:17:19.610 に答える
1

Emacs Lisp チュートリアルの図は、 Lispを学習するときに特に役立ちました。

于 2010-06-11T13:57:27.983 に答える
0

これを読んでください:http://en.wikipedia.org/wiki/Cons

于 2010-05-27T14:20:08.177 に答える
0

try (list xy) common lisp で動作するはずですが、Scheme については知りません

于 2010-05-27T14:21:55.427 に答える