在Clojure中,井号加单引号(#')是否会运行解析和符号函数?

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) 它实际上是 resolve 和 symbol 函数的缩写吗?

PS - 对于那些不在美国的人来说,# 也被称为 'hash' 或 'cross-hash'。

PPS - 我知道我的示例使得这种需要有点多余。但我想知道它是否完全多余,或者是否存在特定的用例。


请参阅:https://dev59.com/9mox5IYBdhLWcg3wk1Ig - Jouni K. Seppänen
2个回答

31

#'是一个读取宏,它展开为(var foo)。这里所做的不是传递未求值的函数,而是传递包含函数的变量。之所以能够这样运行,是因为变量是函数,可以查找其包含的值并调用它:

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

注意,当我定义函数时,返回了一个 var。看起来像是你一直在做的事情! :)


2
Anthony Grimes!我很喜欢你在Clojure社区所做的事情。能够得到你回答我的问题是一种荣幸。 - hawkeye

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接