next up previous
Next: 3 マクロ機能の追加 Up: 2 インタプリタの実行例 Previous: 2.2 再帰関数の定義

2.3 手続きを引数とする手続きの定義と実行例

手続きを引数とする手続きも同様に定義できます. 引数で渡された手続きを実行する場合に,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日