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

Bob*_*har 2 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)
Run Code Online (Sandbox Code Playgroud)

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

我如何或者可以使用def literal-14来允许(literal-14)调用工作?

Sam*_*tep 7

正如A.韦伯指出的那样,constantly写这个是最常用的方式:

(def fourteen (constantly 14))
Run Code Online (Sandbox Code Playgroud)

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

'#(stuff and things) ;=> (fn* [] (stuff and things))
Run Code Online (Sandbox Code Playgroud)

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

'#(14) ;=> (fn* [] (14))
Run Code Online (Sandbox Code Playgroud)

没有办法摆脱这些括号.您可以使用doidentity类似的方式破解它们,但最重要的是,如果您需要编写一个匿名函数,其主体不适合作为列表编写,则不应使用文字语法.


Sea*_*ean 6

14不是一个函数,但door->会在紧要关头起作用:

#(do 14)
#(-> 14)
Run Code Online (Sandbox Code Playgroud)

  • `#(do 14)` 有效,`#(identity 14)` 可能更清楚一点,当然 `(constantly 14)` 是正确的 (2认同)