consを使用して要素をリストに結合する方法とconsを使用してリストをSchemeの要素に結合する方法の違いは何ですか?Schemeの要素に対する対決リストをリストするコンス要素
さらに、コンスはどのくらい正確に機能しますか?それはリストの最後または最初に要素を追加しますか?
ありがとうございます!
consを使用して要素をリストに結合する方法とconsを使用してリストをSchemeの要素に結合する方法の違いは何ですか?Schemeの要素に対する対決リストをリストするコンス要素
さらに、コンスはどのくらい正確に機能しますか?それはリストの最後または最初に要素を追加しますか?
ありがとうございます!
プリミティブcons
は、単純に2つのものを張り合わせていますが、そのうちのいくつかはリストと見なされるという事実は付随的です。例えば、これは動作し、(もコンスセルとして知られている)ペアを作成します。
(cons 1 2)
=> '(1 . 2) ; a pair
、cons
への第2引数はリストであることを起こる場合、その結果は、新たなになりますリストの最初の引数はcons
になり、古いリストの先頭に追加されます。言い換えれば:
(cons 1 '(2 3))
=> '(1 2 3) ; a list
(cons 1 (cons 2 '()))
=> '(1 2) ; a list
(cons 1 '())
=> '(1) ; a list
をしかしcons
への第2引数はないリストであれば、結果はちょうどペア、または次のようになります。それは空の場合でも、あなたがリストを必要とするリストを作成しますそれはリスト検討する必要があるとして、それは'()
で終わらないことを意味不適切なリスト、:
(cons '(1 2) 3)
=> '((1 2) . 3) ; a pair, not a list
(cons 1 (cons 2 3))
=> '(1 2 . 3) ; an improper list
だけ明確にするには、リストの末尾に要素を追加するcons
を使用することはできません。
(cons 3 '()) ; list is '(3)
(cons 2 (cons 3 '())) ; list is '(2 3)
(cons 1 (cons 2 (cons 3 '()))) ; list is '(1 2 3)
: - リストを構築するための通常の方法は、先頭位置に逆に要素を追加し、右から左から起こっているあなたは、リスト
'(1 2 3)
を構築したいと言う、あなたは
cons
するため
3 2 1
の要素を持っていますあなたが最後に一つの要素を追加する必要があり、それらのまれな機会のための
受け取るあなたがappend
を使用することができ、(それほど一般的にやって私を信じて、あなたは、アルゴリズムの間違ったを考えていることを意味します)二つのリストを引数として:
(append '(1 2 3) '(4))
=> '(1 2 3 4)
@ÓscarLópezの答えexplaこれはかなりうまくいく。 Lispファミリの言語では、 'cons 'を_list_オペレーションと考えるのは妥当ではないことに気づくと便利です。 Lisp言語は通常、本物のデータ型として_cons cells_を持っています。次に、_intensionalデータ型としてリストを実装します。私たちがリストと呼ぶものは、convention_byのリストです。私はこのことを[初期の解答](http://stackoverflow.com/a/19126410/1281433)で述べていますが、どのようにして細胞を補完して_implement_リストにすることができるのかを記述していますが、どのようにして細胞が他の構造木。 –
@JoshuaTaylorページが見つかりません。 –
@hanQiu質問が削除されたと思います。しかし、SOの文書には、同じアイデアをカバーするセクションがあります:[慣例としてのリスト](http://stackoverflow.com/documentation/common-lisp/2622/cons-cells-and-lists/8700/lists-as -a-convention#t = 201608091045099806348) –