他のLISP実装と同様に、Schemeのドットペアコンストラクトは何ですか? Clojureのベクトルが角括弧[]を使用するように構文が少し異なっていても、ベクトルまたはリストを非常に簡単に作成し、Clojureでそれらを理解できます。
しかし、点線のペアを初めて見たとき、私は感動しました。ほとんどそれはマップの実装であるように見えます。
私は議論を探しているのではありませんが、ClojureやPythonのような他のLISP方言での使用または同等の点線ペアを探しています。
Common LISP(実装:SBCL)
_* (cons 1 2)
(1 . 2)
* (car '(1 . 2))
1
* (cdr '(1 . 2))
2
_
私はそれが標準のCommon LISPであると確信しています。
Clojureは次のとおりです。
_Clojure 1.3.0
user=> (cons 1 2)
IllegalArgumentException Don't know how to create ISeq from: Java.lang.Long clojure.lang.RT.seqFrom (RT.Java:487)
user=> (car '(1 . 2))
CompilerException Java.lang.RuntimeException: Unable to resolve symbol: car in this context, compiling:(NO_SOURCE_PATH:2)
user=> (cdr '(1 . 2))
CompilerException Java.lang.RuntimeException: Unable to resolve symbol: cdr in this context, compiling:(NO_SOURCE_PATH:3)
user=> '(1 . 2)
(1 . 2)
user=> (first '(1 . 2))
1
user=> (rest '(1 . 2))
(. 2)
_
私は実際にはClojureのエキスパート(またはCommon LISPのエキスパート)ではありませんが、Clojureに不適切なリスト('(a b . c)
など)が組み込まれていることをサポートするものがあるかどうかはわかりません。
Clojureにはドットペアはありません。
これの哲学的な理由は、Clojureが具体的な「ペア」データ構造の使用を回避し、代わりに、可能な具体的な実装を持つ可能性のある抽象的な「シーケンス」を強調するためです。
最も近いものはlist
とcons
です。
;; construct a sequence by consing a value onto any sequential object (here a vector)
(cons 1 [2 3 4])
=> (1 2 3 4)
;; construct a list
(list 1 2 3 4)
=> (1 2 3 4)