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(); }
違うのは、シンボルのアドレスを返してる所。前回は文字列のアドレスを返してしまったので文字列はユニークになりましたが、シンボルは新たに作成されてしまいました。大きな大失敗です。
シンボル自体がユニークになりました。