3

R 5 RS仕様では、以下を使用して定義されたマクロの要件の一部として次のように規定されていsyntax-rulesます。

マクロトランスフォーマーが識別子への自由参照を挿入する場合、その参照は、マクロの使用を取り巻く可能性のあるローカルバインディングに関係なく、トランスフォーマーが指定された場所に表示されていたバインディングを参照します。

私はこれが実際にどのように機能するかを理解しようとしています。たとえば、次のコードがある場合:

(define var 'original)

(define-syntax test-var
 (syntax-rules (var)
   ((_ var)
    var)
   ((_ pattern-var)
    'no-match)))

直後に実行された場合、次のように評価されると思いますoriginal

(test-var var)

no-matchそして、これは、var以前にスコープに導入されたものがマクロ定義でtest-varのバインディングと一致しないためであると予想します。var

(let ((var 1)) (test-var var))

しかし、次の例は私を困惑させました:

(define var 'new-var)
(test-var var)

チキンスキームでは、これはに評価されnew-varます。前の例no-matchと同じ理由であると思っていたでしょう。(let)これは2回使用した場合の問題かもしれないと思いましたが、使用してもdefine結果は変わりませんnew-var(set! var 'new-var)

ここで何が起こっているのかについて誰かが何か洞察を持っていますか?R 5 RSごとに何が起こるべきですか?

4

1 に答える 1

5

これは、スキームがREPLの再定義を処理するときに持つ通常のトリックであり、既存のバインディングのミューテーションとして扱います。したがって、2つ目defineは実際には新しいバインディングを作成するのではなくset!、既存のバインディングを作成するだけです。

于 2011-11-03T18:14:31.497 に答える