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 してみる方向?