「名前」と「名前に紐づけられた値」のペアを束縛という。
ある時点での束縛は複数あることが普通。ここでは
- 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というシンボルを結びつける構文です。
とあるけど、シンボルなの?識別子じゃなくて?