Schemeをつくろう(14) シンボルテーブルづくり(2)

やっぱり、配列じゃマズかったのでシンボルテーブル作りなおし。


「やっぱりシンボルテーブルもリストじゃないとマズイ」


文字はユニークになったけど、シンボルがユニークじゃない!!重大なミスでした。ハイ。

ということで、文字列型を追加。といっても・・・旧シンボル型。使いまわしでいきます!!

アルゴリズムは変わらず。

前回と全くいっしょ。

static object table;

object symbol(char *s)
{
    object symbol = find_symbol(s);

    if (symbol != NULL)
        return symbol;
    else
        return new_symbol(s);
}

static object new_symbol(char *s)
{
    object o = new_object();

    o->type = T_SYMBOL;
    o->data.symbol.s = string(s);
    o->data.symbol.value = NULL;

    table = cons(o ,table);
    return o;
}

static object find_symbol(char *s)
{
    object iter = table;
    for (;!is_null(iter); iter = cdr(iter)) {
        if (strcmp(get_symbol_char(car(iter)), s) == 0) {
            return car(iter);
        }
    }
    return NULL;
}

void init_symbol_table(void)
{
    table = null();
}

違うのは、シンボルのアドレスを返してる所。前回は文字列のアドレスを返してしまったので文字列はユニークになりましたが、シンボルは新たに作成されてしまいました。大きな大失敗です。

シンボル自体がユニークになりました。

それにしても何かが変わったみたい。

ん?何かが変わりました。何かが。

「シンボルの定義が!!」

struct symbol {
    struct object *s; /* string型 */
    struct object *value;
};

value

今までは、単なる「文字」だったのに、「文字 + 値」になりました。グローバル変数を持ったことになります。


シンボルがユニークな値だからこそ値が持てる。やっとシンボルとは何かがわかってきた気がする。