如何制作不带参数且 return 为常量值的文字函数?

How do I make a literal function that takes no args and return a constant value?

我正在尝试学习 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? 的复制品,但也许是,我只是没有经验来识别这一点。

我如何或可以定义 literal-14 以允许 (literal-14) 调用起作用?

14 不是函数,但 do-> 会在紧要关头完成:

#(do 14)
#(-> 14)

因为constantly是最地道的写法:

(def fourteen (constantly 14))

匿名函数字面量的问题在于它总是扩展为主体为列表的函数:

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

所以这是您尝试中发生的事情:

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

没有办法去掉那些括号。您可以使用 doidentity 或类似的方法绕过它们,但最重要的是,如果您需要编写一个主体不适合作为列表编写的匿名函数, 你不应该使用文字语法。