2024 State of 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> 

我们可以看到它实际做了什么。是的,正如其他回答中提到的,这是一个无操作,因为 for 生产了一个懒序列,所以在需要之前实际上没有任何工作要做。这里之所以会执行工作,是因为 REPL 想要打印结果,因此 lazy sequence 被实现。

至于 for 循环实际做了什么。我们制作了一个包含两个映射 xboxplaystation 的向量。 for 会遍历这个向量,并将每个值赋给绑定向量这里的 var(《{[_ x] :bushido}》)在这个例子中也是一个解构。

这个解构接受一个映射,并提取键 :bushido 的值,它期望这是一个包含两个元素的向量,然后将第一个元素分配给符号 _,第二个元素分配给符号 x

for循环为每个元素返回x

这也可以写成这样

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

请注意,你的xboxplaystation中的游戏形状不同,因为:parappa的值不是向量。

by
非常有帮助和清晰的解释!我很感激你的答案,谢谢!!!
0
by

最好将代码格式化为代码块而不是直接引用 - 这有一个单独的按钮用于此

这个for形式实际上没有任何有用的功能,因为它创建了一个懒惰序列,在这个例子中没有任何东西去消费它。你可以通过在你的REPL中运行(doc for)来轻松找到关于for的更多信息以及在线上ClojureDocs上这里

by
nice, ty for the (doc for) bit !
...