如何创建一个不带args并返回常量值的文字函数?

时间:2016-03-02 02:05:58

标签: clojure compojure-api

我正在尝试学习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)调用工作?

2 个答案:

答案 0 :(得分:7)

作为A. Webb pointed outconstantly是最常用的写法:

(def fourteen (constantly 14))

匿名函数文字的问题在于总是扩展为一个主体为列表的函数:

'#(stuff and things) ;=> (fn* [] (stuff and things))

所以,您的尝试中发生了什么:

'#(14) ;=> (fn* [] (14))

没有办法摆脱这些括号。你可以使用doidentity或类似的东西破解它们,但最重要的是,如果你需要编写一个匿名函数,它的正文不适合写成列表,你不应该使用文字语法。

答案 1 :(得分:3)

14不是一个功能,但do->会在紧急情况下执行:

#(do 14)
#(-> 14)