- 351 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 13:18:50 ]
- ちょっとした思いつきなんだが、
(let ((x 1)) (outer-scope (let ((x 2)) (inner-scope x)))) このときに 1 を返す、つまり inner-scope の内側では outer-scope の外側の束縛を参照 するようなマクロ outer-scope inner-scope を定義してみた。 (define-syntax outer-scope (lambda(x) (syntax-case x () ((k body ...) (with-syntax ((inner-scope (datum->syntax #'k 'inner-scope)) (k (syntax k))) #'(let-syntax ((inner-scope (lambda(x) (syntax-case x () ((j b (... ...)) #`(begin #,@(datum->syntax #'k (syntax->datum #'(b (... ...)))))))))) body ...)))))) 未だに datum->syntax の第一引数の意味がよくわからん。 規格には > (datum->syntax template-id datum) > template-id はテンプレート識別子であり、datum はデータ値でなければならない。 > この手続きは template-id と同一の文脈情報をもつ datum の構文オブジェクト表現を返す。 > このとき、この構文オブジェクトは template-id が挿入されたのと同時にコードに挿入されたかのようにあつかわれる。 って書いたるんだが、文脈情報って何だ? 自分の中ではスコープだと思って使ってて、だいたい期待する挙動になるみたいなんだが、その理解でいいの? もうちょっとわかりやすい説明があれば助かる。 拙者は日本人なので英語の文献とか紹介しようとしないで頂ければ助かるでゴザルよ。
|

|