传递给宏的变量在错误的命名空间中解析?

ben*_*tah 8 lisp macros clojure noir

比诺defpage是给我的一点点麻烦.我正在尝试构建类似于此的调用:

(defpage [:post "some/url"] [data]
  ;; some stuff...
  )
Run Code Online (Sandbox Code Playgroud)

但是,不是使用关键字:post我想使用变量,如下所示:

(def my-method :post)
(defpage [my-method "some/url"] [data]
  ;; some stuff...
  )
Run Code Online (Sandbox Code Playgroud)

问题是,当宏展开,它要解决的变量my-methodcompojure.core命名空间,而不是我自己的,给我的错误:

No such var: compojure.core/MY-METHOD
Run Code Online (Sandbox Code Playgroud)

我如何强制my-method在当前环境中解决?

Mic*_*ent 1

我想这与以下问题类似:How can I apply clojure's doc function to a sequence of function 宏可以用它的参数做任何它想做的事情,因此传递裸符号可能会导致不可预测的结果。

解决这个问题的方法,但它并不漂亮:

(eval (list 'defpage (vector my-method "some/url") '[data]
  ; some stuff
))
Run Code Online (Sandbox Code Playgroud)

请注意,这里的 my-method 不是文字,因此在进入 eval 之前,它首先在我们自己的名称空间中解析和评估。