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循环实际上做了什么。我们创建了两个映射xboxplaystation的向量。for将遍历这个向量,并将每个值赋给绑定向量这里的变量({[_ x] :bushido}),在这个例子中,它也是一个解构(destructuring)。

这种解构接受一个映射,并从中提取键 :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) 容易获取)和 ClojureDocs 上的示例中了解更多关于 for 的信息这里

by
太好了,谢谢你在 (doc for) 上的帮助!
...