Gauche > Archives > 2020/11/28

2020/11/28 12:01:04 UTCtioner
#
上手く腑に落とせないのですが
(list + 1)
が
(#<subr (+ :rest args)> 1)
になるのはどう考えるといいのでしょうか。
#
(list '+ 1)
にしないと
(+ 1)
にならないというのはそれはその通りなのですが……
2020/11/28 12:21:39 UTCshiro
#
規則はとても単純で、プログラムとしてリストが与えられた時、
0. リストの先頭が構文キーワードやマクロではない→手続き呼び出し
1. まず引数(リストのcdr)がひとつづつ評価される
2. リストの先頭が評価される
3. 2.で得られた手続きを、1で得られた値のリストを引数にして呼び出す
#
(list + 1)では、
1. リストの先頭listは構文キーワードでもマクロでもない。手続き呼び出しだ。
2. 引数+を評価すると #<subr +>だ。引数1を評価すると1だ。
3. リストの先頭listを評価すると #<subr list>だ。
4. #<subr list>という手続きを、#<subr +>と1を引数にして呼び出す
→ 戻り値として(#<subr +> 1)が返ってくる
#
ここで #<subr...>というのは、「手続きの実体」です。 手続きには #<closure...>というのもありますがとりあえずどっちも手続きだと思ってていいです。listは単なる変数で、その値が #<subr list> になっているだけです。
#
(list ...) は「手続きlistを呼び出す」とよく言われますが、実はそれは簡略化していて、本当は「変数listの値である #<subr list> という手続きを呼び出す」なんです。
#
listという名前はどうでも良いので、例えば (define foo list) としてlistの値を新しい変数fooにセットしてやれば、(foo 1 2 3) でリストを作る手続きを呼び出せます。
2020/11/28 21:03:27 UTCshiro
#
あれ、ISO-2022-JPって元テキストにESCが入ってるとだめなんだっけ。ESC自身をエスケープする方法がない