Alex Shinn
foof****@synth*****
2003年 2月 19日 (水) 12:29:48 JST
>>>>> "Kimura" == Kimura Fuyuki <fuyuk****@hadal*****> writes: Kimura> うまい書き方はないものでしょうか? 「自分ならこう書く」とい Kimura> うあたりを教えてください(「そもそもdo-somethingの設計が間違っ Kimura> ている」というのでも可)。 これはどうですか: (use gauche.parseopt) (define-syntax let-args (syntax-rules () ;; transfer to let-args-internal which collects the parse-options ;; form ((_ args ((vars ...) ...) body ...) (let-args-internal args () ((vars ...) ...) body ...)) )) (define-syntax let-args-internal (syntax-rules () ;; transform base form into a let w/ a callback to set its value ((_ args (opts ...) ((var1 spec1 default1) (var ...) ...) body ...) (letrec ((var1 default1) (setter (lambda (x) (set! var1 x)))) (let-args-internal args (opts ... (spec1 => setter)) ((var ...) ...) body ...))) ;; no default means #f ((_ args (opts ...) ((var1 spec1) (var ...) ...) body ...) (let-args-internal args (opts ...) ((var1 spec1 #f) (var ...) ...) body ...)) ;; finished processing ((_ args opts () body ...) (begin (parse-options args opts) body ...)) )) そのマクロで、以下のように書けます: (define (do-something host port) (print host ":" port)) (define (main args) (let-args (cdr args) ((host "h=s" "www.yahoo.com") (port "p=n" 80)) (do-something host port))) -- Alex