【问题标题】:Accessing a local from one macro in another executed in the scope of the let在 let 范围内执行的另一个宏中访问本地宏
【发布时间】:2010-04-28 06:57:54
【问题描述】:

要温柔,因为我的宏富很弱。

我想做的是这样的:

(defmacro foo [x] `(dosync (alter x# conj x)))
(defmacro bar [] `(let [x# (ref [])] (foo 3)))

这可能吗?由于符号捕获,我不能只 (let [x ..] ..)

注意:我知道这个例子是微不足道的,没有宏观价值,但这是我能想到的最简单的例子。

【问题讨论】:

  • 您能否提供一个不那么简单但更现实的例子?我发现很难说出你想要做什么(即使给出了你自己的答案!)。只是要求了解发生了什么,如果您愿意继续前进,请不要担心。 :-)
  • gist.github.com/381870 是我尝试做的一个更好的例子。由于不相关的原因,它仍然无法正常工作。

标签: macros clojure symbol-capture


【解决方案1】:

我需要强制捕获符号。

(defmacro foo [x] `(dosync (alter ~'x conj x)))
(defmacro bar [] `(let [~'x (ref [])] (foo 3)))

虽然如果您不彻底理解宏很危险,但这很有效。

【讨论】:

  • 我认为你在这两个中都缺少语法引用。 (另请参阅我对这个问题的评论。)
  • 是的,我忘了补充。对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2013-06-13
相关资源
最近更新 更多