Next: 5 Schemeインタプリタ
Up: ソフトウェア特論 講義資料 Scheme言語とインタプリタ
Previous: 3.4 マクロ定義用手続き
CommonLispでは,関数定義にoptional 引数,keyword 引数などの宣言が可能
ですが,Schemeではrestパラメタのみが可能になっています.CommonLispで
(lambda (&rest x) body) となるところをSchemeでは,(lambda x body)と書
き,(lambda (x y &rest z) body) となるところを,(lambda (x y . z)
body)と書きます.
このrestパラメタを実現するには,
extend-envだけを変えれば実現できます.
(defun extend-env (vars vals env)
(cond
((null vars)
(assert (null vals) () "Too many args")
env)
((atom vars)
(cons (list vars vals) env))
(t (assert (rest vals) () "Too few args")
(cons (list (first vars) (first vals))
(extend-env (rest vars) (rest vals) env)))))
<cl> (scheme)
==> (define test (lambda x x))
TEST
==> (test 1 2 3)
(1 2 3)
==> (define test2 (lambda (x y . z) (list x y z)))
TEST2
==> (test2 1 2 3 4)
(1 2 (3 4))
==> (test2 1 2 3 4 5)
(1 2 (3 4 5))
==> (define (test3 x . y) (list x y))
TEST3
==> (test3 1 2 3)
(1 (2 3))
==> (test3 1)
Error: Too few args
Restart actions (select using :continue):
0: retry assertion.
1: Return to Top Level (an "abort" restart)
generated through LaTeX2HTML. M.Inaba 平成18年5月6日