clojure:What';这是'/(变量…)表格?

clojure:What';这是'/(变量…)表格?,clojure,Clojure,在中,我看到以下表格: (defn- compile-route "Compile a route in the form (method path & body) into a function." [method route bindings body] `(#'if-method ~method (#'if-route ~(prepare-route route) (fn [request#] (let-request [~bi

在中,我看到以下表格:

(defn- compile-route
  "Compile a route in the form (method path & body) into a function."
  [method route bindings body]
  `(#'if-method ~method
     (#'if-route ~(prepare-route route)
       (fn [request#]
         (let-request [~bindings request#]
           (render (do ~@body) request#))))))

进一步在文件中,使用
defn-
s定义
if方法
if路线
功能

不过,我不理解这个
编译路径
函数中
#
的含义。
(var…
的文档说明:

符号必须解析为var,并且返回var对象本身(而不是其值)。读取器宏#'x扩展为(var x)

但对我来说,在正在发生的事情(即从defmacro调用)的上下文中,这听起来好像意味着符号的值将被返回,这与可替换性听起来是一样的:

(def x 5)
(+ x 7)
-> 12
例如,
(+x7)
扩展为或与
(+577)


我在这里遗漏了什么?

ring reload
可以从开发过程中不断修改的文件中重新加载var定义。由于您传递了一个(var…),所以每次尝试读取时都会解析它,因此每次请求时都可以重新读取重新加载的var。这将导致交互式web开发(无需编译等),如果您不使用(var…),而是直接传递值,那么重新加载的var将不会传递给环URI处理程序,因此您不能简单地修改和运行代码

查看此博客条目,例如:


在看了一会儿之后,我开始怀疑这与
if方法和
if route
函数实际上是私有的(
(defn-if route…
)有关

此外,对于宏,当您使用回勾引号(“`”)时,实际上是在最终展开中获得完全指定命名空间的符号:

`(+ 2 3)
将扩展到

(clojure.core/+ 2 3)

由于这些方法是私有的,在正常扩展中无法访问它们,因此使用var函数来获取符号,该符号包含对实际函数的引用,必须在扩展中调用该函数

还有一条评论:符号不包含引用。Vars是的。这与Lisp、IIUC不同。符号只是名称,由编译器解析为变量。代码可以工作,因为Var将所有
.invoke
调用委托给它所持有的东西。
(clojure.core/+ 2 3)