next up previous
Next: 5 Schemeインタプリタ Up: ソフトウェア特論 講義資料 Scheme言語とインタプリタ Previous: 3.4 マクロ定義用手続き

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日