Clojure 如何生成一个不接受参数并返回常量值的文本函数?
我正试图学习Clojure,但我对字面函数语法的理解还不够透彻。我不知道Clojure 如何生成一个不接受参数并返回常量值的文本函数?,clojure,compojure-api,Clojure,Compojure Api,我正试图学习Clojure,但我对字面函数语法的理解还不够透彻。我不知道(defn十四[]14)的字面函数等价物是什么 (def fourteen (fn [] 14)) ;; => #'user/fourteen (fourteen) ;; => 14 (defn defn-fourteen [] 14) ;; => #'user/defn-fourteen (defn-fourteen) ;; => 14 (def literal-14 #(14)) ;; =>
(defn十四[]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)
我不认为这是一个骗局,但也许是,我只是没有经验认识到这一点
我如何或可以定义literal-14以允许
(literal-14)
调用工作?14
不是一个函数,但do
或->
在必要时可以:
#(do 14)
#(-> 14)
正如,不断地
是最惯用的写作方式:
(def fourteen (constantly 14))
匿名函数文本的问题在于,它总是扩展到一个函数体为列表的函数:
'#(stuff and things) ;=> (fn* [] (stuff and things))
下面是你尝试的结果:
'#(14) ;=> (fn* [] (14))
没有办法去掉那些括号。您可以使用
do
或identity
或类似的方法绕过它们,但底线是,如果您需要编写一个匿名函数,其主体不适合作为列表编写,则不应使用文字语法。#(do14)
有效,#(identity 14)
可能更清楚一点,当然(经常是14)
是正确的,所以函数文本中的第一个“东西”必须是函数?我不完全理解,但是do变量和identity变量都是我想要的,但是我对匿名函数文本的含义还是有点模糊。@BobKuhar Try(macroexpand'#(14))
,等等。@a.Webb(macroexpand'#(14))
,结果是(fn*[](14))
,这确实说明了@Elogent所说的列表方面。但现在fn*本身是一个新问题。这是一个不同的fn?警察在那里干什么?我找不到任何关于它的文件。我是迷宫里的老鼠!不过谢谢你的帮助。也许云会散去。@BobKuharfn*
是一种特殊的形式,在它上面构建了fn
宏。对于像这样的简单情况,它们是等价的。