let-args マクロの出発点
(let-args args varspecs . body)
が
(let-args-internal args () () varspecs body)
に展開される。
let-args の使用例は gencomp の main 手続きだと以下?
# 適度に略してます。
(define (main args) (let-args (cdr args) ((keep-private-macro "keep-private-macro=s" #f) . args) (when keep-private-macro (private-macros-to-keep (map string->symbol (string-split keep-private-macro #\,)))) 0))
上記だと
- args にあたるのが (cdr args)
- varspecs にあたるのが ((keep-private-macro "keep-private-macro=s" #f) . args)
- body にあたるのが ((when keep-private-macro (private-macro-to-keep (...))) 0) になるはず
で、マクロが置き換えられるかを試験できないかどうかを昨晩調べて gauche 本にて macroexpand を発見。
で、朝色々試験してみたんですが、公開されているマクロしか追っ掛けられない事が判明。例えば以下。
gosh> (use gauche.parseopt) #<undef> gosh> macroexpand-1 #<subr macroexpand-1> gosh> (macroexpand-1 '(let-args args varspecs . body)) (#<identifier gauche.parseopt#let-args-internal> args () () varspecs body) gosh> (macroexpand-1 '(let-args-internal args () () varspecs body)) (let-args-internal args () () varspecs body) gosh>
これ、ローカルに gauche.parseopt を作ってやれば何とかなるかな。module をナニするソレはなんだっけ、と言いつつ google 先生に聞いてみたら以下を発見。
手前ミソですが ...
ちょっと試験してみます。
閑話休題
- 最初 (macroexpand1 ってヤッてた件
- 次に (macroexpand-1 '(let-arg ってヤッてた件
寝ボケてたのかナチュラルなのかは分かりませんが、なんで展開されんのか、と言いつつググッても何も出ず。自分が間違えてるのが分かるまで若干時間がかかりました。
gosh> (macroexpand1 '(let-args args varspecs . body)) *** ERROR: unbound variable: macroexpand1 Stack Trace: _______________________________________ gosh> (macroexpand-1 '(let-arg args varspecs . body)) (let-arg args varspecs . body) gosh>
とほほ。
ちょっと
dynamic-wind 方面に去るかもしれませんし、そのまま力尽きるかも。手順を控え。
- lib/gauche/parseopt.scm を近くにコピィ
- 中身を改変
- let-args-internal を export
- make-option-parser-int も export
- *load-path* にカレントディレクトリ追加
(set! *load-path* (cons "." *load-path*))
- use あるいは require して
- macroexpand してみる方向?