4

我正在尝试学习 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)

我不认为这是一个匿名函数在 clojure 中期望有多少参数?,但也许是这样,我只是没有经验来认识到这一点。

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

4

2 回答 2

11

正如A. Webb 指出的那样constantly这是最惯用的写法:

(def fourteen (constantly 14))

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

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

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

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

没有办法摆脱这些括号。您可以使用dooridentity或类似的东西绕过它们,但最重要的是,如果您需要编写一个其主体不适合写为列表的匿名函数,则不应使用文字语法。

于 2016-03-02T03:16:54.267 回答
6

14不是一个功能,但do->将在紧要关头做:

#(do 14)
#(-> 14)
于 2016-03-02T02:14:44.113 回答