匿名函数内的括号,矢量作为参数

时间:2011-06-01 14:02:22

标签: clojure

我还在学习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]))

它接收一个向量,然后返回正文函数而不是其他向量...

当我使用像参数这样的向量调用函数或者我犯了一个大错误时,它会有所不同。

2 个答案:

答案 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 ...)替换[..]中的任何内容,或者使用其他内容技巧: - )。