remove eval.c
This commit is contained in:
parent
d40c8b5921
commit
b998c903a3
2
Makefile
2
Makefile
|
@ -4,7 +4,7 @@ build:
|
||||||
cd src; \
|
cd src; \
|
||||||
yacc -d parse.y; \
|
yacc -d parse.y; \
|
||||||
lex scan.l
|
lex scan.l
|
||||||
gcc -o bin/picrin -I./include src/main.c src/state.c src/gc.c src/pair.c src/port.c src/symbol.c src/value.c src/y.tab.c src/lex.yy.c src/eval.c src/bool.c src/vm.c src/init.c
|
gcc -o bin/picrin -I./include src/main.c src/state.c src/gc.c src/pair.c src/port.c src/symbol.c src/value.c src/y.tab.c src/lex.yy.c src/bool.c src/vm.c src/init.c
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f src/y.tab.c src/y.tab.h src/lex.yy.c
|
rm -f src/y.tab.c src/y.tab.h src/lex.yy.c
|
||||||
|
|
85
src/eval.c
85
src/eval.c
|
@ -1,85 +0,0 @@
|
||||||
#include "picrin.h"
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_assq(pic_state *pic, pic_value key, pic_value assoc)
|
|
||||||
{
|
|
||||||
pic_value cell;
|
|
||||||
|
|
||||||
enter:
|
|
||||||
|
|
||||||
if (pic_nil_p(assoc))
|
|
||||||
return assoc;
|
|
||||||
|
|
||||||
cell = pic_car(pic, assoc);
|
|
||||||
if (pic_eq_p(pic, key, pic_car(pic, cell)))
|
|
||||||
return cell;
|
|
||||||
|
|
||||||
assoc = pic_cdr(pic, assoc);
|
|
||||||
goto enter;
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_env_lookup(pic_state *pic, pic_value sym, struct pic_env *env)
|
|
||||||
{
|
|
||||||
pic_value v;
|
|
||||||
|
|
||||||
enter:
|
|
||||||
|
|
||||||
v = pic_assq(pic, sym, env->assoc);
|
|
||||||
if (! pic_nil_p(v)) {
|
|
||||||
return pic_cdr(pic, v);
|
|
||||||
}
|
|
||||||
if (env->parent) {
|
|
||||||
env = env->parent;
|
|
||||||
goto enter;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pic_nil_value();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
pic_env_define(pic_state *pic, pic_value sym, pic_value obj, struct pic_env *env)
|
|
||||||
{
|
|
||||||
env->assoc = pic_cons(pic, pic_cons(pic, sym, obj), env->assoc);
|
|
||||||
}
|
|
||||||
|
|
||||||
pic_value
|
|
||||||
pic_eval(pic_state *pic, pic_value obj, struct pic_env *env)
|
|
||||||
{
|
|
||||||
pic_value sDEFINE = pic_intern_cstr(pic, "define");
|
|
||||||
pic_value sQUOTE = pic_intern_cstr(pic, "quote");
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
switch (pic_type(obj)) {
|
|
||||||
case PIC_TT_SYMBOL: {
|
|
||||||
return pic_env_lookup(pic, obj, env);
|
|
||||||
}
|
|
||||||
case PIC_TT_PAIR: {
|
|
||||||
pic_value proc;
|
|
||||||
|
|
||||||
proc = pic_car(pic, obj);
|
|
||||||
if (pic_eq_p(pic, proc, sQUOTE)) {
|
|
||||||
return pic_car(pic, pic_cdr(pic, obj));
|
|
||||||
}
|
|
||||||
else if (pic_eq_p(pic, proc, sDEFINE)) {
|
|
||||||
pic_value sym, data;
|
|
||||||
|
|
||||||
sym = pic_car(pic, pic_cdr(pic, obj));
|
|
||||||
data = pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj)));
|
|
||||||
pic_env_define(pic, sym, pic_eval(pic, data, env), env);
|
|
||||||
|
|
||||||
return pic_nil_value();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* not implemented */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case PIC_TT_FLOAT:
|
|
||||||
case PIC_TT_NIL: {
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return pic_nil_value();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue