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

Re: [bep] learning lisp



n高橋です。今後は Lisp 用語を使うようにします。

Reiko TAKAHASHI  (高橋玲子)writes:

>  ……たとえば……、もし、

> (setq x (save-excursion (goto-char (point-max)) (goto-char 3)))

> (なんて書き方はできないかもしれませんが)みたいにしたとしたら、'x'の値は
> 3、というか、保存されるカーソルの位置は3文字目になる……というようなこと
> でしょうか?

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

関数には、

1. 主に評価結果を利用するもの
2. 主に副作用を利用するもの
3. 両方とも利用するもの

の3種類があります。で、goto-char は2の「主に副作用を利用するもの」に分
類されます。たとえば (goto-char 3) を評価すると、結果として3が返され、
副作用としてカーソルの位置が3文字目に移動します。が、goto-char は大抵
の場合カーソルを移動させるために使われるわけですから、評価結果の3とい
う値は単に捨てられることが多いようです。このように、カーソル移動やバッ
ファ切り替え、ファイルの読み書きなどのために使われる関数は、副作用を利
用するものが大半です。

1の「主に評価結果を利用するもの」の代表は算術演算でしょう。+ とか - で
す。これらの関数を評価しても副作用は生じません。(setq x (* 5 6)) とす
れば (* 5 6) の評価結果である 30 がxに束縛 (今までの言い方なら「代入」
あるいは「セット」) されます。

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

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