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))

これ、中略したら駄目なんだろうな、と言いつつ力尽きそう。別途置き換えたらどうなるかを確認予定、とゆーコトで。