也许你可以帮我在文档中找到这个。我正在使用pound-quote能够在执行之前传递未评估的函数名称。例如:
(#'cons 1 ())
;(1)
(defn funcrunner [func a b]
(func a b))
(funcrunner cons 'a ())
;(a)
(funcrunner 'cons 'a ())
'()
(funcrunner #'cons 'a ())
;(a)
#'cons
;#'clojure.core/cons
(resolve (symbol 'cons))
;#'clojure.core/cons
我的猜测是这是一个读者宏。
我的问题是(a)英镑报价(#')的简写是什么? (b)你能解释一下它在做什么吗? (c)你能在文档中找到它吗? (d)它实际上是解析和符号函数的简写吗?
PS - 对于那些不在美国的人 - #也称为'哈希'或'交叉哈希'。
PPS - 我知道我的例子使得这需要多余。我很想知道这是完全冗余还是有特定用例。
答案 0 :(得分:29)
#'
是一个扩展为(var foo)
的读者宏。你在这里做的不是传递未评估的函数,而是在传递包含函数的变量。它的工作原理是因为vars是查找其包含值并调用它的函数:
user=> (defn foo [x] (+ x 10))
#'user/foo
user=> (#'foo 10)
20
user=> ((var foo) 10)
20
请注意,在我定义函数时,返回了var。它看起来像你一直在做的! :)
答案 1 :(得分:5)
#'
是var
的读者宏。请参阅http://clojure.org/special_forms#var和http://clojure.org/vars
(var foo)
返回由符号foo
命名的var,它可以包含任何类型的值,包括函数。