我还在学习clojure,我怀疑
当我写一个匿名函数时,我这样做
fn [parameter]
(do something)
ok ..函数体由一组括号括起来
现在我正在阅读像这样的斐波纳契解决方案
(iterate (fn [[a b]] [b (+ a b)]) [0 1]))
我的怀疑是为什么它不像这个
(iterate (fn [[a b]] ( [b (+ a b)] )) [0 1]))
我用()
(iterate (fn [[a b]] "(" [b (+ a b)] ")" ) [0 1]))
它接收一个向量,然后返回正文函数而不是其他向量...
当我使用像参数这样的向量调用函数或者我犯了一个大错误时,它会有所不同。
答案 0 :(得分:8)
如果函数返回一个向量,则不需要用任何东西包装它,只需在其括号中返回向量即可。函数的主体不一定“包裹”在括号中,它只是非常常见,因为通常函数在返回值之前会做几件事,这涉及到使用括号。
因此,如果您只是从函数返回一个向量,则该函数的“body”可以是[foo,bar,baz]
。如果您要返回地图,则该函数的主体可以是{:a foo, :b bar, :c baz}
。如果您返回单个值,则可以是单个符号。
括号中唯一“包裹”的是整个函数定义本身,无论是(fn [] ...)
,#(...)
还是(defn [] ...)
。
进一步说明:括号和大括号[
,]
,{
和}
实际上只是(vector)
函数和{{的语法糖。分别为1}}函数,因此(hash-map)
与[1,2,3]
相同,(vector 1 2 3)
与{:a foo, :b bar}
相同。如果它帮助你看到括号中的“包裹”函数体,你可以使用较长的函数名来返回Clojure的向量和地图数据类型,但使用括号和括号更加惯用。
答案 1 :(得分:1)
也许用比Semperos更简单的单词,[1 2 3]是(vector 1 2 3)的简写/等价,所以括号就在那里!类似于{:a 1:b 2},相当于(hash-map:a 1:b 2)。
我没有查找过,但是在源代码中挖掘clojure读者可能会很有趣,看看它是否确实用(vector ...)替换[..]中的任何内容,或者使用其他内容技巧: - )。