[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bep] learning lisp
- To: bep@argv.org
- Subject: Re: [bep] learning lisp
- From: TAKAHASHI Naoto <ntakahas@m17n.org>
- Date: Wed, 30 May 2001 13:28:30 +0900 (JST)
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
- User-Agent: SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.2 Emacs/21.0.104 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI)
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/