2024 Clojure 状况调查!中分享您的看法。

欢迎!请查看关于页面了解有关该功能的更多信息。

0
Clojure

我是初学者程序员,一直在玩 Clojure 并进行实验。
有人能告诉我在这个上下文中 "for" 运算符的作用以及其他参数之间的关系吗?提前感谢。

(def xbox {:bushido ["only on PS" {:country :notavailable}]
:parappa "only on PS" :oni "only on PS"})

(def playstation {:bushido ["available" {:country :japan}]
:parappa "classic" :oni "need to play"})

(for [{[_ x] :bushido} [xbox playstation]] x)

2 个回答

+1

在 repl 中运行

user> (def xbox {:bushido ["only on PS" {:country :notavailable}] 
                 :parappa "only on PS" :oni "only on PS"})
;; => #'user/xbox
user> (def playstation {:bushido ["available" {:country :japan}] 
                        :parappa "classic" :oni "need to play"})
;; => #'user/playstation
user> (for [{[_ x] :bushido} [xbox playstation]]
          x)
;; => ({:country :notavailable} {:country :japan})
user> 

我们可以看到它实际上做什么。是的,如其他答案中提到的,这是一个无操作(no-op),因为 for 生成的是一个惰性序列,因此在需要之前实际上并没有做任何工作。在这里进行工作是因为 REPL 想要打印结果,所以惰性序列才会被实现。

至于 for 循环实际上做了什么。我们创建了一个由两个 map xboxplaystation 组成的向量。for 将会遍历这个向量,并将每个值分配到绑定向量中的变量(在这里 {[_ x] :bushido}),这在这种情况下也是一个解构(destructuring)。

这个解构从 map 中提取键 :bushido 的值,它期望这个值是一个有两个元素的向量,然后它将第一个元素分配给符号 _ 和第二个元素分配给符号 x

然后这个 for 循环对每个元素返回 x

这也可以写成这样:

user> (map (comp second :bushido) [xbox playstation])
;; => ({:country :notavailable} {:country :japan})
user> 

请注意,您的 xboxplaystation 中的游戏形状不相同,因为 :parappa 不包含向量作为其值。

非常简洁且清晰的解释!我很感谢你的答案,谢谢!!!
0

代码格式化最好不用表示引用,而应作为正确的代码块 - 分配有单独的按钮。

for 形式实际上没有任何有用的操作,因为它创建了一个惰性序列,本例中没有消耗。你可以在它的文档字符串(在REPL中运行 (doc for) 轻易获得)和ClojureDocs上的在线示例中了解更多关于 for 的信息 这里

很好!谢谢 (doc for) 这部分!
...