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

标签 macros clojure lisp noir

Noirdefpage 给我带来了一些麻烦。我正在尝试构建与此类似的调用:

(defpage [:post "some/url"] [data]
  ;; some stuff...
  )

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

(def my-method :post)
(defpage [my-method "some/url"] [data]
  ;; some stuff...
  )

问题是当宏扩展时,它想要解析 compojure.core 命名空间中的变量 my-method 而不是我自己的,给我错误:

No such var: compojure.core/MY-METHOD

如何强制 my-method 在当前上下文中解析?

最佳答案

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

一种解决它的方法,但它并不漂亮:

(eval (list 'defpage (vector my-method "some/url") '[data]
  ; some stuff
))

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

关于macros - 传递给宏的变量在错误的命名空间中被解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8371850/

相关文章:

lisp - 可以在 Lisp 的循环之外使用 "it"命令吗?

macros - 使用 Lisp 宏创建类似的函数

plugins - 适用于 PhpStorm 的强大宏插件

vim - 艰难地学习 Emacs/Slime(来自 Vim 10 年)

clojure - 如何在Clojure中遍历一棵树,同时从每个节点节点收集值?

clojure - 将元素添加到嵌套树结构中的向量

macros - 如何检查符号是否为宏

lisp - Common Lisp 未绑定(bind)变量

c++ - 在 VS 中,以编程方式获取 Linker > Additional Library Directories 属性,或获取宏值

Excel宏将数据行复制到底行