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-method的compojure.core命名空间,而不是我自己的,给我的错误:
No such var: compojure.core/MY-METHOD
Run Code Online (Sandbox Code Playgroud)
我如何强制my-method在当前环境中解决?
我想这与以下问题类似: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 之前,它首先在我们自己的名称空间中解析和评估。