の結果が である理由(cons (list 1 2) (list 3 4))
は((1 2) 3 4)
?
なぜ結果の長さが 3(3 要素) なのか不思議です。私の直感では、それ
(list 1 2)
はリストであり、リストで(list 3 4)
もあると思います。プロシージャを使用cons
すると、結果は各要素がリストの 2 つの要素になるはずですが、結果は期待どおりではありません。
理由を教えてもらえますか?ありがとう。
(list a b c)
は、定義上、 と同等(cons a (list b c))
です (または、変換を続ける場合は(cons a (cons b (cons c nil)))
.
したがって、 と書くと、これは、 または(cons 1 (list 3 4))
と同等です。(cons 1 (cons 3 (cons 4 nil)))
(list 1 3 4)
ここで、 に置き換える1
と(list 1 2)
、次のようになります:(cons (list 1 2) (cons 3 (cons 4 nil)))
または同等の(list (list 1 2) 3 4)
(または、完全に書き出された(cons (cons 1 (cons 2 nil)) (cons 3 (cons 4 nil)))
)。
ここでの鍵は、それcons
が ではなくappend
、list
(すべての要素を同等に扱う) ではないということです: リストを扱う場合、それは本質的に非対称です。左のスポットは要素 (「ヘッド」) を保持します。右のものはリストの残りを保持します (「テール」)。