14

(免責事項-ClojureでのSeqの重要性を認識しています)

Common lispでは、cons関数を使用して、2つのシンボルをリストに結合できます。

(def s 'x)
(def l 'y)
(cons s l)

clojureでは、シーケンスに対してのみconsを実行できます。consは、2つのシンボルで機能するように拡張されていません。だからあなたは書く必要があります:

(def s 'x)
(def l 'y)
(cons s '(l))

Common LISPとClojureのこの違いを説明するClojureのより高いレベルのパターンはありますか?

4

5 に答える 5

9

Clojureでは、従来のLispとは異なり、リストは主要なデータ構造ではありません。データ構造は、ISeqインターフェイス(指定されたデータ構造の別のビュー)を実装して、同じ関数がそれぞれの要素にアクセスできるようにすることができます。(リストはすでにこれを実装しています。何かがISeqseq?を実装しているかどうかをチェックします。Clojureは(正当な理由で)単に異なる動作をします。使用されると、シーケンス(実際にはタイプ)で構成されて返されます(arg1とarg2) 。明らかに、シンボルはISeqを実装せず、実装できません。(seq? '(1 2)), (seq? [1 2]))consclojure.lang.Consa(seq b)ab

Clojure.org/sequences

リッチヒッキーによるシーケンスのスクリーンキャスト/トークただし、これrestは変更されており、以前の動作はになりnext、とlazy-consに置き換えられているlazy-seqことに注意してくださいcons

clojure.lang.RT

于 2010-07-11T11:41:36.967 に答える
6

Common Lispでは、CONSはいわゆるCONSセルを作成します。これは、「car」と「cdr」の2つのスロットを持つレコードに似ています。

consセルの2つのスロットに何でも入れることができます。

短所セルはリストの作成に使用されます。しかし、consセルを使用して、あらゆる種類のデータ構造を作成できます。ツリー、グラフ、さまざまな種類の特殊なリストなどです。

Lispの実装は、非常に効率的な短所セルを提供するために高度に最適化されています。

于 2010-07-11T11:41:49.197 に答える
3

Lispリストはconsセルを使用する一般的な方法です(Rainerの説明を参照)。Clojureは、短所セルがないものとして最もよく見られます(ただし、同様のものが内部に隠れている可能性があります)。Clojureconsは誤った名称であり、実際には単に名前を付ける必要がありますprepend

于 2010-07-11T12:37:15.910 に答える
3

Clojureでは、2要素のベクトルを使用することをお勧めします[:a :b]。内部的には、このような小さなベクトルはJava配列として実装されており、非常にシンプルで高速です。

(cons :a '(:b))(または(cons :a (cons :b nil)))の省略形はlist(list :a :b)です。

于 2010-07-12T05:42:55.487 に答える
2

あなたが言う時

> (cons 'a 'b)

一般的なLispでは、リストは取得できませんが、点線のペアが取得されます(a . b)

> (cons 'a (cons 'b nil))

点線のペア(a . ( b . nil))です。

最初のリストではcdr()、それはリストではなく、ここbにあり、ではないnilため、不適切なリストになっています。適切なリストはで終了する必要がありますnil。したがって、や友達のような高階関数は機能mapcar()しませんが、cons-cellを保存します。Clojureの設計者は、混乱を招く可能性があるため、この機能を削除したと思います。

于 2010-07-11T11:36:41.247 に答える