Next: 3 マクロ機能の追加
Up: 2 インタプリタの実行例
Previous: 2.2 再帰関数の定義
手続きを引数とする手続きも同様に定義できます.
引数で渡された手続きを実行する場合に,CommonLispでは,
funcallを使いましたが,Schemeでは,第一要素も評価する
という評価ルールにより,第一要素にその引数を直接
おいておくだけですみます.
<cl> (scheme-interpreter)
==> (set! table
(lambda (f start end)
(if (<= start end)
(begin (write (list start (f start)))
(newline)
(table f (+ start 1) end)))))
(EXCL::.LEXICAL-CLOSURE.
(LAMBDA (&REST ARGS)
(INTERP CODE (NCONC (MAPCAR (FUNCTION LIST)
VARS ARGS) ENV)))
((CODE BEGIN (IF (<= START END)
(BEGIN (WRITE (LIST START (F START)))
(NEWLINE)
(TABLE F (+ START 1) END))))
(VARS F START END) (ENV)
(PARAMS (F START END)
(IF (<= START END)
(BEGIN (WRITE (LIST START (F START)))
(NEWLINE)
(TABLE F (+ START 1) END))))
(NAME . LAMBDA))
NIL
((SCHEME-SPECIAL-FORM-INTERP . EXCL::INVALID)) NIL)
==> (table fact 1 10)
(1 1)
(2 2)
(3 6)
(4 24)
(5 120)
(6 720)
(7 5040)
(8 40320)
(9 362880)
(10 3628800)
NIL
tableの本体の中で(f start)という式が,CommonLispでは,(funcall f start)
となるところですが,Schemeでは単に(f start)となります.
generated through LaTeX2HTML. M.Inaba 平成18年5月6日