置き換えモデル

「名前」と「名前に紐づけられた値」のペアを束縛という。
ある時点での束縛は複数あることが普通。ここでは

  • piが3.14に
  • fooが42に
  • barが"hello"に

束縛されているとしたら、

名前
pi 3.14
foo 42
bar "hello"

みたいな表になる。これを環境と呼ぶ。束縛の集合やね。置き換えモデルは、関数適用の際に、この環境を使って式を置き換えていく方法。

さて、gaucheインタプリタを立ち上げた直後には次のようになる。

gosh> +
#<subr +>

これは、goshを起動したときにgoshが勝手に環境に追加してくれたものだと考えられる。同様に、

gosh> car
#<subr car>
gosh> cdr
#<subr cdr>

こんな感じ。goshを起動した時点ですでに環境にあるものを、この「置き換えモデル」エントリでは「デフォルト環境」と呼ぶことにする。環境に登録されていないものでも、評価可能なものはある。

gosh> 42
42
gosh> "hello"
"hello"

みたいなものはプリミティブな値と呼ばれる。それ以上評価できないものだ。

では、

(Add 1 2)

の評価の過程を見てみる。名前Addは+とともに束縛を作り、何らかの方法で環境に含まれていると仮定する。つまり、現在の環境はデフォルト環境に「Addと+からなる束縛」を足した状態。

作用順序評価なので、Addを2つの引数に適用する前に、全引数とAddが評価される。1はプリミティブな値なので整数1へと評価される。同様に2は整数2へ。Addは+へ評価される(置き換えられる?)。次のように、リストの全要素がこれ以上置き換えられない値まで評価された。

(+ 1 2)

ここまできて、ようやく関数適用。+が何をするのかはデフォルト環境にあるから、引数に+を適用して結果は3へと評価される(置き換えられる)。

なるほど。確かに評価できたな。

今のところ、分からないこと

シンボルと識別子の違いが分からん。143ページに

例えば、以下の手続きaddを考えます。
(define (add x y) (+ x y))
defineは「ふたつの引数を加える」という手続き(という値)とaddというシンボルを結びつける構文です。

とあるけど、シンボルなの?識別子じゃなくて?