eval

これは、引数をプログラムだと思って評価する、という関数である。この関数は、実行時にプログラムを作り上げて実行してしまう、という意味でなかなか激しい命令である。

> '(+ 3 4)
(+ 3 4)
> (eval '(+ 3 4))
7
> (eval ''(+ 3 4))
(+ 3 4)
> (define (f g) `(',g 3 4))
> (f +)
('#<procedure +> 3 4)
> (f -)
('#<procedure -> 3 4)
> (eval (f +))
7
> (eval (f -))
-1

ここで単に `(,g 3 4) としてしまうと、λclosure(インタプリタにおける(*lambda* params body env))が直接リストの先頭に来てしまう。

これは値であり式ではないので、eval することはできない。

> (define (f g) `(,g 3 4))
> (f +)
(#<procedure +> 3 4)
> (eval (f +))
*** ERROR -- Ill-formed expression
#<procedure +>

一覧 前へ 次へ