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

Re: [bep] learning lisp



n高橋です。

Reiko TAKAHASHI  (高橋玲子)writes:

> } しかしどうやらまだ、
> } ・S式を評価した結果として返される値
> }   (今までの言い方だと「関数を実行したときの値」)
> } と、
> } ・S式を評価したときに生じる副作用
> } を混同なさっているようです。

>  はい、しっかり混同していました。評価結果の値が「捨てられる」なんて思っ
> てもみなかったので。

たとえば

(progn (setq x 1)
       (setq y 2)
       (setq z 3))

とすると、(setq x 1) と (setq y 2) はそれぞれ1と2という値を返しますが、
これらの値は誰に利用されることもなく消えて行きます。最後の (setq z 3)
が返す3という値は progn に引き継がれ、(progn ...) 全体の値となります。

この (progn ...) 全体を呼び出した関数が、その返された3という値を使うか
どうかは、その呼び出し方に依存します。上の (setq x 1) や (setq y 2) の
ように単に捨てられてしまうかもしれませんし、あるいは何かに使われるかも
しれません。

> ところで、'S式'というのはどういう意味ですか?
> ↑で書いてくださっている意味はわかるのですが、'S式'もLispの用語でしょうか

Lisp 用語です。(setq x 1) のような関数の形をしているものも、x や y の
ような単純なシンボルも、1 や 999.99 のような数値も、"abc" のような文字
列も全部S式です。つまり Lisp で扱うものは全部S式です。

x や y のような単純なシンボルを評価すると、そのシンボルに束縛された値
が返されます。数値や文字列を評価すると、評価された数値や文字列そのもの
が返されます。

一方 (+ x 123) のような形をしているものを評価するときは、第1要素のシン
ボルに与えられている関数定義を取り出し、それに残りの引数それぞれを評価
したものを渡します。つまり (+ x 123) を評価するときは、「+ というシン
ボルに与えられている関数定義」すなわち加算に、「x を評価したもの」すな
わちxに束縛されている値と、「123 を評価したもの」すなわち123自身を渡す
ことになります。

setq はちょっと特別で、第1引数を評価しません。setq とほとんど同じこと
をする関数に set というのもあり、こっちは第1引数も評価します。評価結果
を→で書くことにすると、

(setq x 'y) → y
(set x 10) → 10
x → y
y → 10

となります。ちなみに 'y は (quote y) の略記法で、quote というのは与え
られた引数そのものを評価せずに返す関数です。もし一番上で (setq x y) と
すると、y を評した結果を x に束縛することになってしまいます。

ちょっとややこしいでしょうか。

> } その setq は主に副作用を利用するために用いられます。なぜなら変数に値を
> } 束縛するというのも副作用の一つだからです。また setq は評価結果として束
> } 縛された値を返します。ですから (setq y (setq x 30)) とすると、x と y 
> } の両方に30が束縛されます。if や while の条件判定部分で setq の返り値を
> } 利用する場合があります。

>  返り値を利用するというのは、DOSのバッチファイルで使える'errorlevel'のよ
> うな雰囲気ですよね?

うーん、似ているというかちょっと違うというか…。今はまだあまり気にしな
くていいと思います。

>  変数に値を「束縛」するというのは、とても不思議です。
> 単なる「用語」なのかもしれませんが、どうして「束縛」なのでしょう……?

単なる用語だと思っていいと思います。ただそれぞれの変数(シンボル)にはス
コープ(範囲)というものがあって、束縛はその範囲内だけで有効です。

(setq a 10) → 10
(let (a) (setq a 20)) → 20
a → 10

となります。2行目の setq で使われている a は let の中だけで有効です。
ですから let を抜けた後の3行目で a を評価すると、1行目の結果が再び使わ
れます。

ここで問題です。2行目の a は let の内側だけで有効なのに、なぜ2行目全体
を評価した結果が 20 になるのでしょうか。

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