#;; env-lookup-int が異なる変数に同一のmacro(やsyntax?)を返すケースが出てきたため、free-identifier=? が #t になってしまいます
(let-syntax ((foo (syntax-rules ())))
(let-syntax ((bar foo))
(let-syntax ((f (er-macro-transformer
(^ (form rename id=?)
(id=? 'foo 'bar)))))
(f))))#;; あとinternal error出ました
(letrec-syntax ((foo (syntax-rules ()))
(bar foo))
42)
*** ERROR: [internal] cenv-lookup returned weird obj: (syntax-rules ())
While compiling: foo
While compiling: (letrec-syntax ((foo (syntax-rules ())) (bar foo)) 42)#SRFI-262のユーザ定義パターン構文を実装するのにSRFI-213 Identifier Propertyっぽいものが必要で、それは束縛に対応するオブジェクトが取れるとできそうなので、env-lookup-intが異なる束縛に異なるオブジェクトを返してくれるとできそうな気がしてるんですよね。
#ので (let-syntax ((bar foo)) ...) みたいなのはmacroをコピーしちゃうのがいいかなと思ってたんですが、begin や define みたいな特殊な特殊形式はコピーしてちゃんと動くのかなと書いてて思ったり。
#あれ、SRFI-147の第四の begin って定義グローバルに見えちゃっていいんですかね?
#gosh> (let-syntax ((dummy (begin
(define x 42)
(syntax-rules ()))))
#f)
#f
gosh> x
42#;; こんなのも
(define-syntax def
(syntax-rules ()
(_ (define foo 1))))
(let ()
(def)
(let-syntax ((dummy (begin
;; コメントを外すと動く
;; (define x #f)
(def)
(syntax-rules ()))))
42))
*** ERROR: syntax-error: the form can appear only in the toplevel: (#<identifier user#define.31a76c0> #<identifier user#foo.31a7680> 1)
While compiling: (begin (def) (syntax-rules ()))
While compiling: (let () (def) (let-syntax ((dummy (begin (def) (syntax-rules ())))) 42))#SRFI-147の begin のdefinitionってどう評価されてどう束縛を作るかってどこに書いてあるんでしょうか。
##あれ、renameされるから大丈夫と思ってたんだけどrenameされてないな
#srfi-147のその部分、私も不明確なんだけど、普通のクロージャみたいに環境を作ってもそれが作られるのがマクロ展開時で、通常のクロージャとフェーズが違うからうまくないんですよね。結局、beginを含むマクロ展開の度にグローバル環境に衝突しない名前を作ってくしかないなと思ったんだけど。
#マクロ展開の度じゃなくてマクロ定義の度、だな。