Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何生成一个不接受参数并返回常量值的文本函数?_Clojure_Compojure Api - Fatal编程技术网

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)) ;; =>

我正试图学习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))
;; => #'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?警察在那里干什么?我找不到任何关于它的文件。我是迷宫里的老鼠!不过谢谢你的帮助。也许云会散去。@BobKuhar
fn*
是一种特殊的形式,在它上面构建了
fn
宏。对于像这样的简单情况,它们是等价的。