我正在尝试学习Clojure,并且在文字函数语法方面受阻。我无法弄清楚(defn fourteen [] 14)
的文字函数等价物。
(def fourteen (fn [] 14))
;; => #'user/fourteen
(fourteen)
;; => 14
(defn defn-fourteen [] 14)
;; => #'user/defn-fourteen
(defn-fourteen)
;; => 14
(def literal-14 #(14))
;; => #'user/literal-14
(literal-14)
;; ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn user/literal-14 (form-init2956929406616221071.clj:1)
我不认为这是How many arguments does an anonymous function expect in clojure?的重复,但可能是这样,我只是没有经验来认识到这一点。
我如何或者可以使用def-lite-14来允许(literal-14)
调用工作?
答案 0 :(得分:7)
作为A. Webb pointed out,constantly
是最常用的写法:
(def fourteen (constantly 14))
匿名函数文字的问题在于总是扩展为一个主体为列表的函数:
'#(stuff and things) ;=> (fn* [] (stuff and things))
所以,您的尝试中发生了什么:
'#(14) ;=> (fn* [] (14))
没有办法摆脱这些括号。你可以使用do
或identity
或类似的东西破解它们,但最重要的是,如果你需要编写一个匿名函数,它的正文不适合写成列表,你不应该使用文字语法。
答案 1 :(得分:3)
14
不是一个功能,但do
或->
会在紧急情况下执行:
#(do 14)
#(-> 14)