gencomp 確認 (12)
とりあえずイチからヤリ直してみます。ここから
;;================================================================ ;; Entry ;; (define (main args) (let-args (cdr args) ((keep-private-macro "keep-private-macro=s" #f) (ext-module "ext-module=s" #f) (output-base "o|output=s" #f) . args) (when keep-private-macro ;; 後略
とりあえず let-args から。lib/gauche/parseopt.scm にて定義。冒頭のコメントで以下なナニな記述がある。
;; (let-args args (varspec ...) body ...) ;; where varspec can be ;; (var spec [default]) ;; or ;; (var spec [default] => callback) ;; ;; varspec can be an improper list, as ;; ;; (let-args args (varspec ... . rest) body ...) ;; ;; then, rest is bound to the rest of the args.
なんとなく分かる。とりあえず => なナニはスルーの方向で (を
で、ざくっと定義を見るに
(define-syntax let-args (syntax-rules () ;; transfer to let-args-internal which collects the parse-options ;; form ((_ args varspecs . body) (let-args-internal args () () varspecs body)) ((_ . otherwise) (syntax-error "malformed let-args:" (let-args . otherwise))) ))
で
(let-args-internal (cdr args) () () ((keep-private-macro "keep-private-macro=s" #f) (ext-module "ext-module=s" #f) (output-base "o|output=s" #f) . args) (when keep-private-macro ;; (後略
というカンジですな。これは Normal case. とゆーコトで定義の一部を以下に。
;; Normal case. ;; Transform base form into a let w/ a callback to set its value ;; we don't know # of values to receive unless we parse the optspec, ;; so the callback needs extra trick. (Ugly... needs rework). ;; ((_ args binds (opts ...) ((var1 spec1 default1) . varspecs) body) (let-args-internal args ((var1 default1) . binds) (opts ... (spec1 => (lambda x (set! var1 (cond ((null? x) #t) ;; no arg ((null? (cdr x)) (car x)) (else x)))))) varspecs body))
これ、中略したら駄目なんだろうな、と言いつつ力尽きそう。別途置き換えたらどうなるかを確認予定、とゆーコトで。