struct function {
int (*function) (void);
int arity;
+ char *name;
};
struct scm *g_cells = arena;
SCM tmp_num2;
int ARENA_SIZE = 200;
-struct function functions[2];
+struct function g_functions[5];
int g_function = 0;
//FIXME
SCM make_cell (SCM type, SCM car, SCM cdr);
#endif
-struct function fun_make_cell = {&make_cell, 3};
+struct function fun_make_cell = {&make_cell,3,"make-cell"};
struct scm scm_make_cell = {TFUNCTION,0,0};
//, "make-cell", 0};
SCM cell_make_cell;
//FIXME
SCM cons (SCM x, SCM y);
#endif
-struct function fun_cons = {&cons, 2};
+struct function fun_cons = {&cons,2,"cons"};
struct scm scm_cons = {TFUNCTION,0,0};
// "cons", 0};
SCM cell_cons;
//FIXME
SCM car (SCM x);
#endif
-struct function fun_car = {&car, 1};
+struct function fun_car = {&car,1,"car"};
struct scm scm_car = {TFUNCTION,0,0};
// "car", 0};
SCM cell_car;
//FIXME
SCM cdr (SCM x);
#endif
-struct function fun_cdr = {&cdr, 1};
+struct function fun_cdr = {&cdr,1,"cdr"};
struct scm scm_cdr = {TFUNCTION,0,0};
// "cdr", 0};
SCM cell_cdr;
// SCM eq_p (SCM x, SCM y);
-// struct function fun_eq_p = {&eq_p, 2};
-// scm scm_eq_p = {TFUNCTION,0,0};// "eq?", 0};
+// struct function fun_eq_p = {&eq_p,2,"eq?"};
+// scm scm_eq_p = {TFUNCTION,0,0};
// SCM cell_eq_p;
#define TYPE(x) (g_cells[x].type)
#endif
#define CONTINUATION(x) g_cells[x].cdr
#if __GNUC__
-//#define FUNCTION(x) functions[g_cells[x].function]
+//#define FUNCTION(x) g_functions[g_cells[x].function]
#endif
-#define FUNCTION(x) functions[g_cells[x].cdr]
+#define FUNCTION(x) g_functions[g_cells[x].cdr]
#define VALUE(x) g_cells[x].cdr
#define VECTOR(x) g_cells[x].cdr
SCM
alloc (int n)
{
-#if __GNUC__
- //FIXME GNUC
assert (g_free + n < ARENA_SIZE);
-#endif
SCM x = g_free;
g_free += n;
return x;
make_cell (SCM type, SCM car, SCM cdr)
{
SCM x = alloc (1);
-#if __GNUC__
- //FIXME GNUC
assert (TYPE (type) == NUMBER);
-#endif
TYPE (x) = VALUE (type);
if (VALUE (type) == CHAR || VALUE (type) == NUMBER) {
if (car) CAR (x) = CAR (car);
return CDR(x);
}
-// SCM
-// eq_p (SCM x, SCM y)
-// {
-// return (x == y
-// || ((TYPE (x) == KEYWORD && TYPE (y) == KEYWORD
-// && STRING (x) == STRING (y)))
-// || (TYPE (x) == CHAR && TYPE (y) == CHAR
-// && VALUE (x) == VALUE (y))
-// || (TYPE (x) == NUMBER && TYPE (y) == NUMBER
-// && VALUE (x) == VALUE (y)))
-// ? cell_t : cell_f;
-// }
-
SCM
gc_push_frame ()
{
return a != cell_nil ? car (a) : cell_f;
}
-#if __GNUC__
- //FIXME GNUC
-SCM
-assq_ref_env (SCM x, SCM a)
-{
- x = assq (x, a);
- if (x == cell_f) return cell_undefined;
- return cdr (x);
-}
-#endif
-
-#if __GNUC__
- //FIXME GNUC
-SCM
-assert_defined (SCM x, SCM e)
-{
- if (e != cell_undefined) return e;
- // error (cell_symbol_unbound_variable, x);
- puts ("unbound variable");
- exit (33);
- return e;
-}
-#endif
-
SCM
push_cc (SCM p1, SCM p2, SCM a, SCM c) ///((internal))
{
return cell_unspecified;
}
-#if __GNUC__
SCM caar (SCM x) {return car (car (x));}
SCM cadr (SCM x) {return car (cdr (x));}
SCM cdar (SCM x) {return cdr (car (x));}
SCM cddr (SCM x) {return cdr (cdr (x));}
-#else
-// Weirdness: wrong function labeling
-// SCM cadr (SCM x) {
-// x = cdr (x);
-// return car (x);
-// }
-// SCM cddr (SCM x) {
-// x = cdr (x);
-// return cdr (x);
-// }
-#endif
#if __GNUC__
//FIXME
call (SCM fn, SCM x)
{
puts ("call\n");
-#if __GNUC__
- //fn=11
- //function1
- puts ("fn=");
- puts (itoa(fn));
- puts ("\n");
- puts ("functiono");
- puts (itoa(g_cells[fn].cdr));
- puts ("\n");
-#endif
- if (fn != 11) {
- puts("FN != 11\n");
- return 11;
- }
- if (g_cells[11].cdr != 1) {
- puts("fn.cdr != 11\n");
- return 11;
- }
-
if ((FUNCTION (fn).arity > 0 || FUNCTION (fn).arity == -1)
&& x != cell_nil && TYPE (CAR (x)) == VALUES)
x = cons (CADAR (x), CDR (x));
- puts ("00\n");
if ((FUNCTION (fn).arity > 1 || FUNCTION (fn).arity == -1)
&& x != cell_nil && TYPE (CDR (x)) == PAIR && TYPE (CADR (x)) == VALUES)
x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
- //struct function* f = &FUNCTION (fn);
- puts ("01\n");
- switch (2)///FIXME FUNCTION (fn).arity)
+ switch (FUNCTION (fn).arity)
{
// case 0: return FUNCTION (fn).function0 ();
// case 1: return FUNCTION (fn).function1 (car (x));
// case 2: return FUNCTION (fn).function2 (car (x), cadr (x));
// case 3: return FUNCTION (fn).function3 (car (x), cadr (x), car (cddr (x)));
// case -1: return FUNCTION (fn).functionn (x);
- case 0: {puts("02.0\n");return (FUNCTION (fn).function) ();}
- case 1: {puts("03.1\n");return ((SCM(*)(SCM))(FUNCTION (fn).function)) (car (x));}
-#if 0
- //__GNUC__
+ case 0: {return (FUNCTION (fn).function) ();}
+ case 1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (car (x));}
case 2: {return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x));}
-#else
- case 2: {
- puts ("04.2\n");
- SCM p1 = car (x);
- SCM p2 = cdr (x);
- p2 = car (p2);
- //return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (p1, p2);
- int (*functionx) (int,int) = (SCM(*)(SCM,SCM))FUNCTION (fn).function;
- //return ((SCM(*)(SCM,SCM))(*FUNCTION (fn).function)) (p1, p2);
- //return ((SCM(*)(SCM,SCM))(*functionx)) (p1, p2);
- SCM p3;
- //p3 = 0x44;
- puts ("05\n");
- return cons (p1, p2);
- return (*functionx) (p1, p2);
- }
+ case 3: {return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x), car (cddr (x)));}
+#if __GNUC__
+ // FIXME GNUC
+ case -1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
#endif
- case 3: {puts("05.3\n");return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x), car (cddr (x)));}
- //case -1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
default: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
}
-
return cell_unspecified;
}
return x ? x : make_symbol_ (s);
}
-SCM
-cstring_to_list (char const* s)
-{
- SCM p = cell_nil;
- int i = strlen (s);
- while (i--)
- p = cons (MAKE_CHAR (s[i]), p);
- return p;
-}
-
SCM
acons (SCM key, SCM value, SCM alist)
{
gc_init_cells ()
{
return 0;
-// g_cells = (scm *)malloc (2*ARENA_SIZE*sizeof(scm));
-
-// #if __NYACC__ || FIXME_NYACC
-// TYPE (0) = TVECTOR;
-// // #else
-// // TYPE (0) = VECTOR;
-// #endif
-// LENGTH (0) = 1000;
-// VECTOR (0) = 0;
-// g_cells++;
-// TYPE (0) = CHAR;
-// VALUE (0) = 'c';
}
// INIT NEWS
SCM a = cell_nil;
-#if __GNUC__ && 0
- //#include "mes.symbol-names.i"
-#else
-// g_cells[cell_nil].car = cstring_to_list (scm_nil.name);
-// g_cells[cell_f].car = cstring_to_list (scm_f.name);
-// g_cells[cell_t].car = cstring_to_list (scm_t.name);
-// g_cells[cell_dot].car = cstring_to_list (scm_dot.name);
-// g_cells[cell_arrow].car = cstring_to_list (scm_arrow.name);
-// g_cells[cell_undefined].car = cstring_to_list (scm_undefined.name);
-// g_cells[cell_unspecified].car = cstring_to_list (scm_unspecified.name);
-// g_cells[cell_closure].car = cstring_to_list (scm_closure.name);
-// g_cells[cell_circular].car = cstring_to_list (scm_circular.name);
-// g_cells[cell_begin].car = cstring_to_list (scm_begin.name);
-#endif
-
- // a = acons (cell_symbol_mes_version, MAKE_STRING (cstring_to_list (VERSION)), a);
- // a = acons (cell_symbol_mes_prefix, MAKE_STRING (cstring_to_list (PREFIX)), a);
-
a = acons (cell_symbol_dot, cell_dot, a);
a = acons (cell_symbol_begin, cell_begin, a);
a = acons (cell_closure, a, a);
- // a = acons (cell_symbol_call_with_current_continuation, cell_call_with_current_continuation, a);
- // a = acons (cell_symbol_sc_expand, cell_f, a);
-
return a;
}
// #include "posix.environment.i"
// #include "reader.environment.i"
#else
-
scm_make_cell.cdr = g_function;
-functions[g_function++] = fun_make_cell;
+g_functions[g_function++] = fun_make_cell;
cell_make_cell = g_free++;
-#if __GNUC__
- puts ("WOOOT=");
- puts (itoa (g_free));
- puts ("\n");
- //FIXME GNUC
g_cells[cell_make_cell] = scm_make_cell;
-#else
-g_cells[16] = scm_make_cell;
-#endif
scm_cons.cdr = g_function;
-functions[g_function++] = fun_cons;
+g_functions[g_function++] = fun_cons;
cell_cons = g_free++;
-#if __GNUC__
- //FIXME GNUC
g_cells[cell_cons] = scm_cons;
-#else
-g_cells[17] = scm_cons;
-#endif
scm_car.cdr = g_function;
-functions[g_function++] = fun_car;
+g_functions[g_function++] = fun_car;
cell_car = g_free++;
-#if __GNUC__
- //FIXME GNUC
g_cells[cell_car] = scm_car;
-#endif
-#if __GNUC__
- //FIXME GNUC
scm_cdr.cdr = g_function;
-functions[g_function++] = fun_cdr;
+g_functions[g_function++] = fun_cdr;
cell_cdr = g_free++;
g_cells[cell_cdr] = scm_cdr;
-
-// scm_make_cell.string = cstring_to_list (scm_make_cell.name);
-// g_cells[cell_make_cell].string = MAKE_STRING (scm_make_cell.string);
-// a = acons (make_symbol (scm_make_cell.string), cell_make_cell, a);
-
-// scm_cons.string = cstring_to_list (scm_cons.name);
-// g_cells[cell_cons].string = MAKE_STRING (scm_cons.string);
-// a = acons (make_symbol (scm_cons.string), cell_cons, a);
-
-// scm_car.string = cstring_to_list (scm_car.name);
-// g_cells[cell_car].string = MAKE_STRING (scm_car.string);
-// a = acons (make_symbol (scm_car.string), cell_car, a);
-
-// scm_cdr.string = cstring_to_list (scm_cdr.name);
-// g_cells[cell_cdr].string = MAKE_STRING (scm_cdr.string);
-// a = acons (make_symbol (scm_cdr.string), cell_cdr, a);
-#endif
#endif
return a;
}
{
g_stdin = open ("module/mes/read-0.mo", 0);
#if __GNUC__
+ //FIXME GNUC
//g_stdin = g_stdin ? g_stdin : fopen (PREFIX "module/mes/read-0.mo", "r");
#endif
char *p = (char*)g_cells;
-#if __GNUC__
- //FIXME GNUC
assert (getchar () == 'M');
assert (getchar () == 'E');
assert (getchar () == 'S');
-#else
- getchar ();
- getchar ();
- getchar ();
-#endif
g_stack = getchar () << 8;
g_stack += getchar ();
int c = getchar ();
TYPE (9) = 0x2d2d2d2d;
CAR (9) = 0x2d2d2d2d;
CDR (9) = 0x3e3e3e3e;
-#if 0
- // (A(B))
- TYPE (10) = PAIR;
- CAR (10) = 11;
- CDR (10) = 12;
-
- TYPE (11) = CHAR;
- CAR (11) = 0x58585858;
- CDR (11) = 89;
-
- TYPE (12) = PAIR;
- CAR (12) = 13;
- CDR (12) = 1;
-
- TYPE (13) = CHAR;
- CAR (13) = 0x58585858;
- CDR (13) = 90;
- TYPE (14) = 0x58585858;
- CAR (14) = 0x58585858;
- CDR (14) = 0x58585858;
-
- TYPE (14) = 0x58585858;
- CAR (14) = 0x58585858;
- CDR (14) = 0x58585858;
-#else
// (cons 0 1)
TYPE (10) = PAIR;
CAR (10) = 11;
CAR (15) = 0x58585858;
CDR (15) = 1;
- //g_stack@23
- TYPE (19) = PAIR;
- CAR (19) = 1;
- CDR (19) = 1;
-
- TYPE (20) = PAIR;
- CAR (20) = 7;
- CDR (20) = 19;
-
- TYPE (21) = PAIR;
- CAR (21) = 7;
- CDR (21) = 20;
-
- TYPE (22) = PAIR;
- CAR (22) = 134;
- CDR (22) = 21;
-
- TYPE (23) = PAIR;
- CAR (23) = 22;
- CDR (23) = 137;
-
-#endif
-
return 0;
}
{
//puts ("<number>\n");
#if __GNUC__
- putchar (48 + VALUE (x));
+ puts (itoa (VALUE (x)));
#else
int i;
i = VALUE (x);
puts (")");
break;
}
+ case SPECIAL:
+ {
+ switch (x)
+ {
+ case 1: {puts ("()"); break;}
+ case 2: {puts ("#f"); break;}
+ case 3: {puts ("#t"); break;}
+ default:
+ {
+#if __GNUC__
+ puts ("<x:");
+ puts (itoa (x));
+ puts (">");
+#else
+ puts ("<x>");
+#endif
+ }
+ }
+ break;
+ }
+ case SYMBOL:
+ {
+ switch (x)
+ {
+ case 11: {puts (" . "); break;}
+ case 12: {puts ("lambda"); break;}
+ case 13: {puts ("begin"); break;}
+ case 14: {puts ("if"); break;}
+ case 15: {puts ("quote"); break;}
+ case 37: {puts ("car"); break;}
+ case 38: {puts ("cdr"); break;}
+ case 39: {puts ("null?"); break;}
+ case 40: {puts ("eq?"); break;}
+ case 41: {puts ("cons"); break;}
+ default:
+ {
+#if __GNUC__
+ puts ("<s:");
+ puts (itoa (x));
+ puts (">");
+#else
+ puts ("<s>");
+#endif
+ }
+ }
+ break;
+ }
default:
{
//puts ("<default>\n");
+#if __GNUC__
+ puts ("<");
+ puts (itoa (TYPE (x)));
+ puts (":");
+ puts (itoa (x));
+ puts (">");
+#else
puts ("_");
+#endif
break;
}
}
puts ("\n");
#endif
-#if 0
- //__GNUC__
assert (getchar () == 'M');
assert (getchar () == 'E');
assert (getchar () == 'S');
puts (" *GOT MES*\n");
g_stack = getchar () << 8;
g_stack += getchar ();
+
+#if __GNUC__
puts ("stack: ");
puts (itoa (g_stack));
puts ("\n");
-#else
- c = getchar ();
- putchar (c);
- if (c != 'M') exit (10);
- c = getchar ();
- putchar (c);
- if (c != 'E') exit (11);
- c = getchar ();
- putchar (c);
- if (c != 'S') exit (12);
- puts (" *GOT MES*\n");
-
- // skip stack
- getchar ();
- getchar ();
#endif
c = getchar ();
puts ("read done\n");
- // g_free = (p-(char*)g_cells) / sizeof (struct scm);
- c = p-(char*)g_cells;
- exit (c);
-
-
-
+ g_free = (p-(char*)g_cells) / sizeof (struct scm);
- if (g_free != 15) exit (33);
+ if (g_free != 15) exit (33);
- // puts ("Xg_free: ");
- // puts (itoa (g_free));
- // puts ("\n");
-
-
- ///if (g_free != 19) return 33;
-
- // gc_peek_frame ();
- // g_symbols = r1;
+#if 0
+ gc_peek_frame ();
+ g_symbols = r1;
+#else
g_symbols = 1;
+#endif
g_stdin = STDIN;
r0 = mes_builtins (r0);
+ if (g_free != 19) exit (34);
+
#if __GNUC__
puts ("cells read: ");
puts (itoa (g_free));
int
main (int argc, char *argv[])
{
- puts ("Hello mini-mes!\n");
-#if __GNUC__
- //g_debug = getenv ("MES_DEBUG");
-#endif
- //if (getenv ("MES_ARENA")) ARENA_SIZE = atoi (getenv ("MES_ARENA"));
+ puts ("Hello cons-mes!\n");
if (argc > 1 && !strcmp (argv[1], "--help")) return eputs ("Usage: mes [--dump|--load] < FILE");
#if __GNUC__
if (argc > 1 && !strcmp (argv[1], "--version")) {eputs ("Mes ");return eputs (VERSION);};
if (argc > 1 && !strcmp (argv[1], "--dump")) return dump ();
#endif
-#if 1
-
#if __GNUC__
puts ("g_free=");
puts (itoa(g_free));
puts ("\n");
-#else
- g_free = 19;
-
#endif
- //return cons (r0, cell_nil);
-
- //FIXME
push_cc (r2, cell_unspecified, r0, cell_unspecified);
-#if __GNUC__
- for (int x=19; x<26 ;x++)
- {
- puts(itoa(x));
- puts(": type=");
- puts(itoa(g_cells[x].type));
- puts(" car=");
- puts(itoa(g_cells[x].car));
- puts(" cdr=");
- puts(itoa(g_cells[x].cdr));
- puts("\n");
- }
-#endif
-#else
- g_stack = 23;
- g_free = 24;
- r1 = r2; //10: the-program
- r2 = cell_unspecified;
-#endif
-
- puts ("g_stack: ");
- display_ (g_stack);
- puts ("\n");
#if __GNUC__
puts ("\n");
#endif
- //r3 = cell_vm_begin;
r3 = cell_vm_apply;
r1 = eval_apply ();
- //stderr_ (r1);
display_ (r1);
eputs ("\n");