【问题标题】:Clojure: ^:dynamic in macros?Clojure:^:宏中的动态?
【发布时间】:2012-03-05 10:26:59
【问题描述】:

正如你们中的一些人所知,我正在 Clojure 中实现 Shen。 由于 Shen 有一个双重命名空间并且所有符号都对自己求值,因此我需要一个 Clojure 宏,它将符号绑定到自身,并将值绑定到后缀符号。

现在还必须绑定 *language* 等符号。但是当我使用带有*language* 作为参数的以下宏时,我得到Warning: *language* not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic *language* or change the name.

(defmacro set [x y] 
  `(let [y# ~y]
    (def ^:dynamic ~x '~x)
    (intern *ns* (symbol (str (name ~x) "__varPoF__")))
    (def ^:dynamic ~(symbol (str (name x) "__varPoF__")) y#)
    y#))

谁能告诉我为什么这不起作用?

【问题讨论】:

    标签: dynamic macros clojure


    【解决方案1】:

    这里使用阅读器宏是错误的。你必须使用with-meta。我也不确定你为什么需要intern 电话。

    (defmacro set
      [x y]
      (let [dynamic {:dynamic true}]
        `(let [y# ~y]
           (def ~(vary-meta x merge dynamic) '~x)
           (def ~(vary-meta (symbol (str (name x) "__varPoF__")) merge dynamic) y#)
           y#)))
    

    无耻的自我推销:with-meta and the reader.

    【讨论】:

      【解决方案2】:

      由于 Clojure WARNING,其中 vars 以“earmuffs”命名,即具有前导和尾随开始,可动态重新绑定。

      由于Clojure 1.3 不再是这种情况,阅读器发出该警告是为了警告您事情可能与您期望的不一样。不过它不应该破坏你的代码,因为WARNINGs 不是错误。

      【讨论】:

      • 这里的问题是,我想为Shen创建一个REPL,并且WARNINGS不应该在那里弹出,因为它们与Shen没有任何关系。是否有可能抑制警告,例如在 Java 中?
      • 我想重新绑定*err* 应该可以解决它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多