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> 

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

至于for循环实际上做了什么。我们创建了两个映射xbox和playstation的向量。for将循环遍历这个向量,并将每个值赋给绑定向量中的var(在这个例子中也是解构)。

这种解构从映射中提取键 :bushido 对应的值,它期望这个值是一个包含两个元素向量的,然后将第一个元素赋值给符号 _,第二个元素赋值给符号 x

for 循环随后返回每个元素的 x

这也可以写成这样

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

注意,你的 xboxplaystation 中的游戏形状不同,因为 :parappa 没有包含其为值的向量。

非常有帮助且清晰的解释!我非常感激你的回答,谢谢!!!
0

最好将代码格式化为代码块,而不是引用,因为有一个专门的按钮用于此。

for 形式实际上没有任何实际用,因为它创建了一个懒序列,在这种情况下没有被任何东西消费。你可以在其文档字符串中了解更多关于 for 的信息,该文档字符串通过在 REPL 中运行 (doc for) 轻易获得,并可以在此处找到更多关于上下文的信息和示例 在这里 在 ClojureDocs 上。

不错,谢谢!(doc for) 那部分!
...