0

これが有効な理由:

(= '(:anything :goes :here) (filter (fn [x] true) '(:anything :goes :here)))

しかし、これではありませんか?

(= (:anything :goes :here) (filter (fn [x] true) '(:anything :goes :here)))

また

(= (:anything :goes :here) (filter (fn [x] true) (:anything :goes :here)))

あるいは

(= '(:anything :goes :here) (filter (fn [x] true) (:anything :goes :here)))

フィルタリングする 2 番目の引数が単純なリストではなく引用符付きリストである特定の理由はありますか?

user=> (filter (fn [x] true) (:abc :def :ghi))
IllegalArgumentException Don't know how to create ISeq from: clojure.lang.Keyword  clojure.lang.RT.seqFrom (RT.java:505)

実際のところ、正確にリストが関数呼び出しでもある場合はまだわかりません。引用に関連しているようです。空のリストでない限り、すべての「プレーンリスト」を引用する必要がありますか?

4

1 に答える 1

2

リストが評価されるとき、最初の要素は関数 (またはマクロまたは特殊な形式) であると見なされます。

リストの最初の要素が関数の場合、最初にすべての引数が評価され、次に結果の値に関数が適用されます。

リストの最初の要素がマクロまたは特殊形式の場合、各引数は、マクロ/特殊形式に応じて評価される場合と評価されない場合があります。

Clojure は、最初の要素がキーワードであるリストを、キーワード関数の引数として指定されたマップ内のキーとしてそのキーワードを見つけようとすることで評価し、対応する値を返します。それ以外の場合は、次の引数 (指定されている場合) を返します。したがって、(:anything :goes: :here)が返されhereます。

'quote引数を特別な形式にする読み取りマクロです。つまり 'anything=>(quote anything)

あなたの場合:

が評価される場合、 and/or=の値を評価する必要があります。最初のものの評価は になります。(他の Lisp ではエラーになります)。ただし、 は の短縮形であり、引数unevaluatedを返す特別な形式であり、結果として に渡されるか、それ以上評価されずにリストになります。(:anything :goes: here)'(:anything goes here):here'(:anything :goes :here)(quote (:anything :goes :here))quote(:anything :goes: here)=filter

次に、各ケースで何が起こっているかを示します。

(= '(:anything :goes :here) (filter (fn [x] true) '(:anything :goes :here)))

=は と比較(:anything :goes :here)され(:anything :goes :here)、結果は true になります

(= (:anything :goes :here) (filter (fn [x] true) '(:anything :goes :here)))

:hereは と比較され(:anything :goes :here)、false になります

(= (:anything :goes :here) (filter (fn [x] true) (:anything :goes :here)))
(= '(:anything :goes :here) (filter (fn [x] true) (:anything :goes :here)))

これらの両方で、filterが単一のキーワード:hereに適用されるため、エラーが発生します。

于 2013-04-06T09:55:59.287 に答える