18

也许你可以帮我在文档中找到这个。我使用 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 - 我知道我的示例使得对此的需求有些多余。我很想知道这是完全多余的还是有特定的用例。

4

2 回答 2

31

#'是扩展为 的阅读器宏(var foo)。您在这里所做的不是传递未评估的函数,而是传递包含函数的 vars。之所以如此,是因为 vars 是查找其包含的值并调用它的函数:

user=> (defn foo [x] (+ x 10))
#'user/foo
user=> (#'foo 10)
20
user=> ((var foo) 10)
20

请注意,当我定义函数时,返回了一个 var。看起来你一直在做什么!:)

于 2012-06-08T08:22:15.637 回答
5

#'是阅读器宏var。请参阅http://clojure.org/special_forms#varhttp://clojure.org/vars

(var foo)返回由 symbol 命名的 var foo,它可以保存任何类型的值,包括函数。

于 2012-06-08T08:20:47.443 回答