2012-03-05 14 views
1

ClojureでShenを実装していることをご存知の方もいます。 シェンは二重の名前空間を持ち、すべてのシンボルが自分自身に評価されるので、シンボルを自身にバインドするClojureマクロと、後置したシンボルに値をバインドする必要があります。Clojure:^:マクロのダイナミック?

*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#)) 

を取得し、パラメータとして*language*と、次のマクロを使用する場合、これは動作していない理由を誰かが私に言うことはできますか?

答えて

3

リーダマクロの使用はここで間違っています。 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

+0

感謝を "隠します"! –

1

あなたが受け取るものは、Clojure < 1.3の規約のために、WARNINGです。これは、「耳鳴り」で名前が付けられた、つまり先頭と末尾の開始点を持つ変数です。

Clojure 1.3ので、これはもはやケースではありません、およびReaderはへの警告、よく、あなたが期待するようなものはないかもしれないことを警告することをスローします。 WARNINGはエラーではないので、コードを壊すべきではありません。

+0

ここでの問題は、私はシェンのためのREPLを作成したいということであり、そして、彼らはシェンとは何の関係もありませんので、警告は、そこにポップアップしてはいけません。警告が表示される可能性はありますか? Javaで? –

+0

私は '* ERR *'それを – skuro

+0

どちらの結合 '* ERR *'や '*うち*'を修正する必要があります再バインド推測は、この作品警告... –

関連する問題