0

Clojure では、マクロ内で作成されたマップ エントリは保持されます...

(class (eval `(new clojure.lang.MapEntry :a 7)))
;=> clojure.lang.MapEntry

...しかし、外部コンテキストからパイプスルーすると、ベクトルに折りたたまれます...

(class (eval `~(new clojure.lang.MapEntry :a 7)))
;=> clojure.lang.PersistentVector

この動作はLispReader.syntaxQuote(Object form)condition内で定義されますif(form instanceof IPersistentCollection)

これが意図された動作なのか、それとも修正されるものなのか、誰にもわかりますか?

4

1 に答える 1

2

この動作を理解したい場合は、Clojure シーケンスとコレクションの構築に飛び込む必要があります。

実際、すべての Clojure マップは、その下に一連のベクトルがあります。各[:key :val]ペアは 2 要素ベクトルとして格納されます。

ちゃんと見てください、あなたは のクラスを求めていますがMapEntry、これはただのベクトルです! 代わりに、マップの Clojure クラスはclojure.lang.PersistentArrayMaporclojure.lang.IPersistentMapです。MapEntryマップ全体の一部である 1 つの要素にすぎません。そして、私が言ったように、Clojure マップの各エントリは実際にはベクトルであるため、評価されるクラスMapEntryはベクトルであるべきです。

私の説明が理解できることを願っています。

于 2013-10-27T09:38:02.970 に答える