2013-10-06 10 views
7

consを使用して要素をリストに結合する方法とconsを使用してリストをSchemeの要素に結合する方法の違いは何ですか?Schemeの要素に対する対決リストをリストするコンス要素

さらに、コンスはどのくらい正確に機能しますか?それはリストの最後または最初に要素を追加しますか?

ありがとうございます!

+2

@ÓscarLópezの答えexplaこれはかなりうまくいく。 Lispファミリの言語では、 'cons 'を_list_オペレーションと考えるのは妥当ではないことに気づくと便利です。 Lisp言語は通常、本物のデータ型として_cons cells_を持っています。次に、_intensionalデータ型としてリストを実装します。私たちがリストと呼ぶものは、convention_byのリストです。私はこのことを[初期の解答](http://stackoverflow.com/a/19126410/1281433)で述べていますが、どのようにして細胞を補完して_implement_リストにすることができるのかを記述していますが、どのようにして細胞が他の構造木。 –

+0

@JoshuaTaylorページが見つかりません。 –

+0

@hanQiu質問が削除されたと思います。しかし、SOの文書には、同じアイデアをカバーするセクションがあります:[慣例としてのリスト](http://stackoverflow.com/documentation/common-lisp/2622/cons-cells-and-lists/8700/lists-as -a-convention#t = 201608091045099806348) –

答えて

20

プリミティブ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) 
関連する問題