急に出てくる「再帰」という言葉に戸惑う。この場合の「再帰」は、雑に理解するならば、次のように考えられるのだろうか?
eval -> (+ (* 1 3) (/ 6 2)) -> return
evalは「評価」するマシーンであり、returnはその結果を出力すると考える。evalは、最初のカッコを「これから出てくるものは足すものだなというように理解する。しかし、次に出てくるのが(* 1 3)
のため、もう一度、「評価マシン」を呼び出す必要がある。つまり、これはいったい何なのだ、ということだ。
eval -> (* 1 3) -> return
さて、これを評価した結果、「3」という値を帰すことがわかった。従って、(* 1 3)
は下のように置き換えることができる。
eval -> (+ 3 (/ 6 2)) -> return
しかし、3を足そうとしたところで、次にまた(/ 6 2)
が出てきてしまう。なので、これを変換する必要がある。
eval -> (/ 6 2) -> return
すると、今度は3が引き出せた。なので、同じように置き換えられる。
eval -> (+ 3 3) -> return
こうして、最後の結果として、6が取り出される。ポイントは、これらが何かしらの値に収縮するということだと思う。さらに、ここで特殊な例としてdefineを説明している。
例えば、Yaccなどの構文解析木も、文字列を規則にしたがい、トークンにしたがい、置換していくという作業を取っている。ちょっと変な例だが、次のようなものを考えてみる。
例えば、文は下のようにまとまるという風に定義しよう。
STATEMENT = goal
SVO | SVC = return STATEMENT
そして、それぞれに次のような定義を与える。
It = S
is = V
a Pen = O
This is = return next
. = ignore
これらを評価するマシーンに与える。
eval -> SV (This is a Pen). -> return
さて、ここでカッコが出てきたので、一度中断し、評価を持ってくる。
eval -> This is a Pen. -> return
ここで、定義されたトークンの規則にしたがう。
eval -> return O -> return
さて、これが帰ってきて
最終的に
eval -> STATEMENT -> return
eval -> return goal -> return
goal
という形になる。