Schemeをつくろう(10) SICPの問題を僕のSchemeで解く

簡単な所から攻めてみます。クオートも特別な関数のようです。

構文要素の追加

字句&構文解析にひとこと加えてっと。

    case '\'' :
        return cons(symbol("quote"), cons(read_to_stream(s),null()));

'があったら、要素を(quote 中身)で囲みます。

文法の追加。

static object quote_syntax(object env, object o)
{
    return cons(env, car(o));
}

一行だけ。クオートが現れたら、evalせず返す。それだけ。

SICPの問題を解く

本題です。

問題 2.55

Eva Lu Atorは解釈系に対して式

(car ''abracadabra)

と入力した。驚いたことに解釈系はquoteと印字してきた。なぜか。

解きます

僕の解釈系では、

input> (car ''abracadabra)
debug> (car (quote (quote abracadabra)))
quote

''abracadabraは字句解析&構文解析を通ると(quote (quote abracadabra))となります。

一個目のquoteは何もせず値を返すので、外側のquoteが消えて、(car (quote abracadabra))となります。

だから、解釈系は、quoteを返す。


すげーよくわかった。


SICPの問題が僕のSchemeで解けるなんてステキ。