[Gauche-devel-jp] 省略可能引数とデフォルト値

Back to archive index

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



Gauche-devel-jp メーリングリストの案内
Back to archive index