在Clojure中运行解析和符号函数的pound-quote(hash-quote,#')?

haw*_*eye 16 eval clojure

也许你可以帮我在文档中找到这个.我正在使用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
Run Code Online (Sandbox Code Playgroud)

我的猜测是这是一个读者宏.

我的问题是(a)英镑报价(#')的简写是什么?(b)你能解释一下它在做什么吗?(c)你能在文档中找到它吗?(d)它实际上是解析和符号功能的简写吗?

PS - 对于那些不在美国的人 - #也称为'哈希'或'交叉哈希'.

PPS - 我知道我的例子使得这需要多余.我很想知道这是完全冗余还是有特定用例.

Ray*_*yne 30

#'是一个扩展到的读者宏(var foo).你在这里做的不是传递未评估的函数,而是在传递包含函数的变量.它的工作原理是因为vars是查找其包含值并调用它的函数:

user=> (defn foo [x] (+ x 10))
#'user/foo
user=> (#'foo 10)
20
user=> ((var foo) 10)
20
Run Code Online (Sandbox Code Playgroud)

请注意,当我定义函数时,返回了var.它看起来像你一直在做的!:)

  • 安东尼格兰姆斯!我喜欢你在Clojure社区所做的一切.能够回答这个问题,我感到很荣幸. (2认同)

Joo*_*aat 5

#'是读者宏var.见http://clojure.org/special_forms#varhttp://clojure.org/vars

(var foo)返回由符号命名的var foo,它可以包含任何类型的值,包括函数.