CLでSRFI-89 — #:g1

Posted 2012-01-27 21:45:00 GMT

CLでSRFI、今回は、SRFI-89の「Optional positional and named parameters」です。
CLでは、オプショナル/キーワード引数が標準装備ですが、Schemeには標準には、存在せず処理系依存で処理する仕組みがあったり、SRFIで色々定義されていたりで、SRFI-89はそのようなものの一つです。
動作としては、大体CL風ですが、&optionalや、&keywordで開始を指定するのとはちょっとだけ違います。

動作

(funcall (lambda* ((:foo foo 'default)) foo))
;=>  DEFAULT

(funcall (lambda* ((:foo foo 'default)) foo)
         :foo 100)
;=>  100

(funcall (lambda* ((:foo foo 'default) . rest)
           (list foo rest))
         :foo 100 'r 'e 's 't)
;=>  (100 (R E S T))

(funcall (lambda* ((:foo foo 'default) . rest)
           (list foo rest))
         :foo 100 'r 'e 's 't)
;=>  (100 (R E S T))

(funcall (lambda* ((:foo foo 'foo-default)
                   (:bar bar 'bar-default)
                   . rest)
           (list foo bar rest))
         :bar 200 :foo 100 'r 'e 's 't)
;=>  (100 200 (R E S T))

(funcall (lambda* ((opt 'opt-default)
                   (:foo foo 'foo-default)
                   (:bar bar 'bar-default)
                   . rest)
           (list opt foo bar rest))
         :bar 200 :foo 100 'r 'e 's 't)
;=>  (:BAR FOO-DEFAULT BAR-DEFAULT (200 :FOO 100 R E S T))

(funcall (lambda* ((opt 'opt-default)
                   (:foo foo 'foo-default)
                   (:bar bar 'bar-default)
                   . rest)
           (list opt foo bar rest))
         '/opt/ :bar 200 :foo 100 'r 'e 's 't)
;=>  (/OPT/ 100 200 (R E S T))

(define* (foo (opt 'opt-default)
              (:foo foo 'foo-default)
              (:bar bar 'bar-default)
              . rest)
  (list opt foo bar rest))

(foo '/opt/ :bar 200 :foo 100 'r 'e 's 't) ;=> (/OPT/ 100 200 (R E S T))

移植について

キーワードの表記については、SRFI-88を踏襲しているので、foo:という形式ですが、CLなの:fooとしています。

comments powered by Disqus