gpt4 book ai didi

Clojure Koan 第 8 节,#5

转载 作者:太空宇宙 更新时间:2023-11-03 18:59:24 27 4
gpt4 key购买 nike

为什么这是有效的:

(= '(: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)))

要过滤的第二个参数是引用列表而不是普通列表是否有特殊原因?

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)

事实上,我仍然不确定什么时候列表也是函数调用。这似乎与引用有关。是否所有“普通列表”都需要引用,除非它们是空列表?

最佳答案

评估列表时,第一个元素被假定为函数(或宏或特殊形式)。

当列表的第一个元素是函数时,首先计算所有参数,然后将函数应用于结果值。

如果列表的第一个元素是宏或特殊形式,则每个参数可能会或可能不会被评估,具体取决于宏/特殊形式。

Clojure 将评估第一个元素为关键字的列表,方法是尝试在作为关键字函数参数的映射中找到该关键字作为键,然后返回相应的值,否则返回下一个参数(如果给定)。因此 (:anything :goes: :here) 将返回 here

' 是一个读取宏,它将其参数放入 quote 特殊形式。 'anything =>(引用任何内容)

在你的情况下:

= 被评估时,(:anything :goes: here) 和/或 '(:anything goes here) 的值必须进行评估。对第一个的评估将导致 :here。 (在其他 lisp 中,它会导致错误)。 '(: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,导致错误。

关于Clojure Koan 第 8 节,#5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15848855/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com