[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] learning lisp



n高橋です。すでに井上さんから正解が送られてきましたが、書いちゃったの
でこれも送ることにします。

Koichi INOUE writes:

> (eval )
> は不思議なものみたいですね。

eval は引数をS式として評価し、その結果を返します。しかし、setq の第1引
数などを除くと、一般に引数は特に何もしなくても評価されます。つまり 
eval の引数は2重に評価されるわけです。

> (eval (setq x 10))
> も
> (eval '(setq x 10))
> も同じ値10を返すのはなぜでしょう?

上の (eval (setq x 10)) の場合、まず通常の関数評価手順に従って引数であ
る (setq x 10) が評価されます。結果は10になります。(副作用としてxに10
が束縛されますが、ここでは関係ありません。) 次に eval はこの10をS式と
して評価します。数値を評価するとそれ自身になりますから、eval の返す値
も10になります。

下の (eval '(setq x 10)) の場合も通常の関数評価手順に従って、まず引数
である '(setq x 10) が評価されます。すると ' がとれて (setq x 10) とい
うリストが結果として返されます。eval はこの (setq x 10) をS式として評
価します。これは関数の形をしていますから通常の関数評価と同様に扱われま
す。setq は束縛された値を返しますから、eval の返す値も10になります。

別の例です。

(setq x 10) => 10
(setq y 'x) => x

としたときに eval と ' を色々組み合わせると下のようになります。Emacs
Lisp マニュアルの記法に従い、評価結果を => で表すことにします。

y => x
'y => y
(eval y) => 10
(eval 'y) => x
(eval ''y) => y
(eval x) => エラー

ほーら混乱してきた。

-- 
TAKAHASHI Naoto
ntakahas@...
http://www.m17n.org/ntakahas/