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将遍历这个向量,并将每个值赋给绑定向量这里的变量({[_ x] :bushido}),在这个例子中它也是一个解构。

这种解构接受一个映射并提取键: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) 的提示!
...