web-dev-qa-db-ja.com

他のLISP実装におけるドットペアのアナロジーは何ですか?

他のLISP実装と同様に、Schemeのドットペアコンストラクトは何ですか? Clojureのベクトルが角括弧[]を使用するように構文が少し異なっていても、ベクトルまたはリストを非常に簡単に作成し、Clojureでそれらを理解できます。

しかし、点線のペアを初めて見たとき、私は感動しました。ほとんどそれはマップの実装であるように見えます。

私は議論を探しているのではありませんが、ClojureやPythonのような他のLISP方言での使用または同等の点線ペアを探しています。

6
octopusgrabbus

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)など)が組み込まれていることをサポートするものがあるかどうかはわかりません。

5
yakiv

Clojureにはドットペアはありません。

これの哲学的な理由は、Clojureが具体的な「ペア」データ構造の使用を回避し、代わりに、可能な具体的な実装を持つ可能性のある抽象的な「シーケンス」を強調するためです。

最も近いものはlistconsです。

;; 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)
9
mikera