Introduce SCM type for special symbols.
* GNUmakefile (mes.h): Also export SCM to symbols.i * mes.c: Introduce SCM type for special symbols. (builtin_eval): Rename from eval_env. Update callers. * module/mes/base-0.mes (eval): Remove. * module/mes/repl.mes (repl): Use eval.
This commit is contained in:
parent
cdd903054c
commit
d1b8f0ff0c
|
@ -31,6 +31,7 @@ mes.h: mes.c GNUmakefile
|
||||||
while read f; do\
|
while read f; do\
|
||||||
fun=$$(echo $$f | sed -e 's,^scm [*],,' -e 's,{.*,,');\
|
fun=$$(echo $$f | sed -e 's,^scm [*],,' -e 's,{.*,,');\
|
||||||
name=$$(echo $$fun | sed -e 's,^scm [\*],,' | grep -o '^[^ ]*');\
|
name=$$(echo $$fun | sed -e 's,^scm [\*],,' | grep -o '^[^ ]*');\
|
||||||
|
builtin=scm_$$name\
|
||||||
scm_name=$$(echo $$name | sed -e 's,_to_,->,' -e 's,_p$$,?,' -e 's,_x$$,!,' -e 's,^builtin_,,' -re 's,(.*)_$$,c:\1,' | sed \
|
scm_name=$$(echo $$name | sed -e 's,_to_,->,' -e 's,_p$$,?,' -e 's,_x$$,!,' -e 's,^builtin_,,' -re 's,(.*)_$$,c:\1,' | sed \
|
||||||
-e 's,^divide$$,/,'\
|
-e 's,^divide$$,/,'\
|
||||||
-e 's,^is?$$,=,'\
|
-e 's,^is?$$,=,'\
|
||||||
|
@ -43,10 +44,10 @@ mes.h: mes.c GNUmakefile
|
||||||
args=$$(echo $$fun | grep -o 'scm [\*]' | wc -l);\
|
args=$$(echo $$fun | grep -o 'scm [\*]' | wc -l);\
|
||||||
[ "$$(echo $$fun | fgrep -o ... )" = "..." ] && args=n;\
|
[ "$$(echo $$fun | fgrep -o ... )" = "..." ] && args=n;\
|
||||||
echo "scm *$$fun;";\
|
echo "scm *$$fun;";\
|
||||||
echo "scm scm_$$name = {FUNCTION$$args, .name=\"$$scm_name\", .function$$args=&$$name};";\
|
echo "scm $$builtin = {FUNCTION$$args, .name=\"$$scm_name\", .function$$args=&$$name};";\
|
||||||
echo "a = add_environment (a, \"$$scm_name\", &scm_$$name);" 1>&2;\
|
echo "a = add_environment (a, \"$$scm_name\", &$$builtin);" 1>&2;\
|
||||||
done; echo '#endif'; echo '#endif' 1>&2) > $@ 2>environment.i
|
done; echo '#endif'; echo '#endif' 1>&2) > $@ 2>environment.i
|
||||||
grep -oE '^scm ([a-z_]+) = {SYMBOL,' mes.c | cut -d' ' -f 2 |\
|
grep -oE '^scm ([a-z_]+) = {(SCM|SYMBOL),' mes.c | cut -d' ' -f 2 |\
|
||||||
while read f; do\
|
while read f; do\
|
||||||
echo "symbols = cons (&$$f, symbols);";\
|
echo "symbols = cons (&$$f, symbols);";\
|
||||||
done > symbols.i
|
done > symbols.i
|
||||||
|
|
191
mes.c
191
mes.c
|
@ -32,7 +32,7 @@
|
||||||
#define BUILTIN_QUASIQUOTE 1 // 6x speedup for mescc
|
#define BUILTIN_QUASIQUOTE 1 // 6x speedup for mescc
|
||||||
#define MES_FULL 1
|
#define MES_FULL 1
|
||||||
|
|
||||||
enum type {CHAR, MACRO, NUMBER, PAIR, STRING, SYMBOL, VALUES, VECTOR,
|
enum type {CHAR, MACRO, NUMBER, PAIR, SCM, STRING, SYMBOL, VALUES, VECTOR,
|
||||||
FUNCTION0, FUNCTION1, FUNCTION2, FUNCTION3, FUNCTIONn};
|
FUNCTION0, FUNCTION1, FUNCTION2, FUNCTION3, FUNCTIONn};
|
||||||
struct scm_t;
|
struct scm_t;
|
||||||
typedef struct scm_t* (*function0_t) (void);
|
typedef struct scm_t* (*function0_t) (void);
|
||||||
|
@ -54,7 +54,7 @@ typedef struct scm_t {
|
||||||
function1_t function1;
|
function1_t function1;
|
||||||
function2_t function2;
|
function2_t function2;
|
||||||
function3_t function3;
|
function3_t function3;
|
||||||
functionn_t functionn;
|
functionn_t functionn;
|
||||||
struct scm_t* cdr;
|
struct scm_t* cdr;
|
||||||
struct scm_t* macro;
|
struct scm_t* macro;
|
||||||
struct scm_t** vector;
|
struct scm_t** vector;
|
||||||
|
@ -66,17 +66,21 @@ typedef struct scm_t {
|
||||||
|
|
||||||
scm *display_helper (FILE*, scm*, bool, char const*, bool);
|
scm *display_helper (FILE*, scm*, bool, char const*, bool);
|
||||||
|
|
||||||
scm scm_nil = {SYMBOL, "()"};
|
scm scm_nil = {SCM, "()"};
|
||||||
scm scm_dot = {SYMBOL, "."};
|
scm scm_dot = {SCM, "."};
|
||||||
scm scm_f = {SYMBOL, "#f"};
|
scm scm_f = {SCM, "#f"};
|
||||||
scm scm_t = {SYMBOL, "#t"};
|
scm scm_t = {SCM, "#t"};
|
||||||
scm scm_unspecified = {SYMBOL, "*unspecified*"};
|
scm scm_unspecified = {SCM, "*unspecified*"};
|
||||||
|
scm scm_closure = {SCM, "*closure*"};
|
||||||
|
scm scm_circular = {SCM, "*circular*"};
|
||||||
|
scm scm_lambda = {SCM, "lambda"};
|
||||||
|
|
||||||
|
scm symbol_begin = {SCM, "begin"};
|
||||||
|
scm symbol_if = {SCM, "if"};
|
||||||
|
scm symbol_define = {SCM, "define"};
|
||||||
|
scm symbol_define_macro = {SCM, "define-macro"};
|
||||||
|
scm symbol_set_x = {SCM, "set!"};
|
||||||
|
|
||||||
scm symbol_closure = {SYMBOL, "*closure*"};
|
|
||||||
scm symbol_circ = {SYMBOL, "*circ*"};
|
|
||||||
scm symbol_lambda = {SYMBOL, "lambda"};
|
|
||||||
scm symbol_begin = {SYMBOL, "begin"};
|
|
||||||
scm symbol_if = {SYMBOL, "if"};
|
|
||||||
scm symbol_quote = {SYMBOL, "quote"};
|
scm symbol_quote = {SYMBOL, "quote"};
|
||||||
scm symbol_quasiquote = {SYMBOL, "quasiquote"};
|
scm symbol_quasiquote = {SYMBOL, "quasiquote"};
|
||||||
scm symbol_unquote = {SYMBOL, "unquote"};
|
scm symbol_unquote = {SYMBOL, "unquote"};
|
||||||
|
@ -90,9 +94,7 @@ scm symbol_unsyntax_splicing = {SYMBOL, "unsyntax-splicing"};
|
||||||
|
|
||||||
scm symbol_call_with_values = {SYMBOL, "call-with-values"};
|
scm symbol_call_with_values = {SYMBOL, "call-with-values"};
|
||||||
scm symbol_current_module = {SYMBOL, "current-module"};
|
scm symbol_current_module = {SYMBOL, "current-module"};
|
||||||
scm symbol_define = {SYMBOL, "define"};
|
|
||||||
scm symbol_define_macro = {SYMBOL, "define-macro"};
|
|
||||||
scm symbol_set_x = {SYMBOL, "set!"};
|
|
||||||
|
|
||||||
scm char_nul = {CHAR, .name="nul", .value=0};
|
scm char_nul = {CHAR, .name="nul", .value=0};
|
||||||
scm char_backspace = {CHAR, .name="backspace", .value=8};
|
scm char_backspace = {CHAR, .name="backspace", .value=8};
|
||||||
|
@ -296,20 +298,12 @@ assq (scm *x, scm *a)
|
||||||
return a->car;
|
return a->car;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BUILTIN_P(x) \
|
|
||||||
((x->type == FUNCTION0 \
|
|
||||||
|| x->type == FUNCTION1 \
|
|
||||||
|| x->type == FUNCTION2 \
|
|
||||||
|| x->type == FUNCTION3 \
|
|
||||||
|| x->type == FUNCTIONn) \
|
|
||||||
? &scm_t : &scm_f)
|
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
evlis (scm *m, scm *a)
|
evlis (scm *m, scm *a)
|
||||||
{
|
{
|
||||||
if (m == &scm_nil) return &scm_nil;
|
if (m == &scm_nil) return &scm_nil;
|
||||||
if (m->type != PAIR) return eval_env (m, a);
|
if (m->type != PAIR) return builtin_eval (m, a);
|
||||||
scm *e = eval_env (car (m), a);
|
scm *e = builtin_eval (car (m), a);
|
||||||
return cons (e, evlis (cdr (m), a));
|
return cons (e, evlis (cdr (m), a));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,35 +314,36 @@ apply_env (scm *fn, scm *x, scm *a)
|
||||||
{
|
{
|
||||||
if (fn == &scm_car) return x->car->car;
|
if (fn == &scm_car) return x->car->car;
|
||||||
if (fn == &scm_cdr) return x->car->cdr;
|
if (fn == &scm_cdr) return x->car->cdr;
|
||||||
if (BUILTIN_P (fn) == &scm_t)
|
if (builtin_p (fn) == &scm_t)
|
||||||
return call (fn, x);
|
return call (fn, x);
|
||||||
if (eq_p (fn, &symbol_call_with_values) == &scm_t)
|
if (eq_p (fn, &symbol_call_with_values) == &scm_t)
|
||||||
return call (&scm_call_with_values_env, append2 (x, cons (a, &scm_nil)));
|
return call (&scm_call_with_values_env, append2 (x, cons (a, &scm_nil)));
|
||||||
if (fn == &symbol_current_module) return a;
|
if (fn == &symbol_current_module) return a;
|
||||||
}
|
}
|
||||||
else if (fn->car == &symbol_lambda) {
|
else if (fn->car == &scm_lambda) {
|
||||||
scm *p = pairlis (cadr (fn), x, a);
|
scm *p = pairlis (cadr (fn), x, a);
|
||||||
return eval_env (cons (&symbol_begin, cddr (fn)), cons (cons (&symbol_closure, p), p));
|
return builtin_eval (cons (&symbol_begin, cddr (fn)), cons (cons (&scm_closure, p), p));
|
||||||
}
|
}
|
||||||
else if (fn->car == &symbol_closure) {
|
else if (fn->car == &scm_closure) {
|
||||||
scm *args = caddr (fn);
|
scm *args = caddr (fn);
|
||||||
scm *body = cdddr (fn);
|
scm *body = cdddr (fn);
|
||||||
a = cdadr (fn);
|
a = cdadr (fn);
|
||||||
a = cdr (a);
|
a = cdr (a);
|
||||||
scm *p = pairlis (args, x, a);
|
scm *p = pairlis (args, x, a);
|
||||||
return eval_env (cons (&symbol_begin, body), cons (cons (&symbol_closure, p), p));
|
return builtin_eval (cons (&symbol_begin, body), cons (cons (&scm_closure, p), p));
|
||||||
}
|
}
|
||||||
scm *efn = eval_env (fn, a);
|
scm *efn = builtin_eval (fn, a);
|
||||||
if (efn == &scm_f || efn == &scm_t) assert (!"apply bool");
|
if (efn == &scm_f || efn == &scm_t) assert (!"apply bool");
|
||||||
if (efn->type == NUMBER) assert (!"apply number");
|
if (efn->type == NUMBER) assert (!"apply number");
|
||||||
if (efn->type == STRING) assert (!"apply string");
|
if (efn->type == STRING) assert (!"apply string");
|
||||||
return apply_env (efn, x, a);
|
return apply_env (efn, x, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
eval_env (scm *e, scm *a)
|
builtin_eval (scm *e, scm *a)
|
||||||
{
|
{
|
||||||
if (internal_symbol_p (e) == &scm_t) return e;
|
if (builtin_p (e) == &scm_t) return e;
|
||||||
|
if (internal_p (e) == &scm_t) return e;
|
||||||
|
|
||||||
e = expand_macro_env (e, a);
|
e = expand_macro_env (e, a);
|
||||||
|
|
||||||
|
@ -369,26 +364,26 @@ eval_env (scm *e, scm *a)
|
||||||
if (e->car == &symbol_syntax)
|
if (e->car == &symbol_syntax)
|
||||||
return e;
|
return e;
|
||||||
if (e->car == &symbol_begin)
|
if (e->car == &symbol_begin)
|
||||||
return eval_begin_env (e, a);
|
return begin (e, a);
|
||||||
if (e->car == &symbol_lambda)
|
if (e->car == &scm_lambda)
|
||||||
return make_closure (cadr (e), cddr (e), assq (&symbol_closure, a));
|
return make_closure (cadr (e), cddr (e), assq (&scm_closure, a));
|
||||||
if (e->car == &symbol_closure)
|
if (e->car == &scm_closure)
|
||||||
return e;
|
return e;
|
||||||
if (e->car == &symbol_if)
|
if (e->car == &symbol_if)
|
||||||
return if_env (cdr (e), a);
|
return builtin_if (cdr (e), a);
|
||||||
if (e->car == &symbol_define)
|
if (e->car == &symbol_define)
|
||||||
return define (e, a);
|
return define (e, a);
|
||||||
if (e->car == &symbol_define_macro)
|
if (e->car == &symbol_define_macro)
|
||||||
return define (e, a);
|
return define (e, a);
|
||||||
if (e->car == &symbol_set_x)
|
if (e->car == &symbol_set_x)
|
||||||
return set_env_x (cadr (e), eval_env (caddr (e), a), a);
|
return set_env_x (cadr (e), builtin_eval (caddr (e), a), a);
|
||||||
#if BUILTIN_QUASIQUOTE
|
#if BUILTIN_QUASIQUOTE
|
||||||
if (e->car == &symbol_unquote)
|
if (e->car == &symbol_unquote)
|
||||||
return eval_env (cadr (e), a);
|
return builtin_eval (cadr (e), a);
|
||||||
if (e->car == &symbol_quasiquote)
|
if (e->car == &symbol_quasiquote)
|
||||||
return eval_quasiquote (cadr (e), add_unquoters (a));
|
return eval_quasiquote (cadr (e), add_unquoters (a));
|
||||||
if (e->car == &symbol_unsyntax)
|
if (e->car == &symbol_unsyntax)
|
||||||
return eval_env (cadr (e), a);
|
return builtin_eval (cadr (e), a);
|
||||||
if (e->car == &symbol_quasisyntax)
|
if (e->car == &symbol_quasisyntax)
|
||||||
return eval_quasisyntax (cadr (e), add_unsyntaxers (a));
|
return eval_quasisyntax (cadr (e), add_unsyntaxers (a));
|
||||||
#endif //BUILTIN_QUASIQUOTE
|
#endif //BUILTIN_QUASIQUOTE
|
||||||
|
@ -407,23 +402,23 @@ expand_macro_env (scm *e, scm *a)
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
eval_begin_env (scm *e, scm *a)
|
begin (scm *e, scm *a)
|
||||||
{
|
{
|
||||||
scm *r = &scm_unspecified;
|
scm *r = &scm_unspecified;
|
||||||
while (e != &scm_nil) {
|
while (e != &scm_nil) {
|
||||||
r = eval_env (e->car, a);
|
r = builtin_eval (e->car, a);
|
||||||
e = e->cdr;
|
e = e->cdr;
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
if_env (scm *e, scm *a)
|
builtin_if (scm *e, scm *a)
|
||||||
{
|
{
|
||||||
if (eval_env (car (e), a) != &scm_f)
|
if (builtin_eval (car (e), a) != &scm_f)
|
||||||
return eval_env (cadr (e), a);
|
return builtin_eval (cadr (e), a);
|
||||||
if (cddr (e) != &scm_nil)
|
if (cddr (e) != &scm_nil)
|
||||||
return eval_env (caddr (e), a);
|
return builtin_eval (caddr (e), a);
|
||||||
return &scm_unspecified;
|
return &scm_unspecified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,10 +429,10 @@ eval_quasiquote (scm *e, scm *a)
|
||||||
if (e == &scm_nil) return e;
|
if (e == &scm_nil) return e;
|
||||||
else if (atom_p (e) == &scm_t) return e;
|
else if (atom_p (e) == &scm_t) return e;
|
||||||
else if (eq_p (car (e), &symbol_unquote) == &scm_t)
|
else if (eq_p (car (e), &symbol_unquote) == &scm_t)
|
||||||
return eval_env (cadr (e), a);
|
return builtin_eval (cadr (e), a);
|
||||||
else if (e->type == PAIR && e->car->type == PAIR
|
else if (e->type == PAIR && e->car->type == PAIR
|
||||||
&& eq_p (caar (e), &symbol_unquote_splicing) == &scm_t)
|
&& eq_p (caar (e), &symbol_unquote_splicing) == &scm_t)
|
||||||
return append2 (eval_env (cadar (e), a), eval_quasiquote (cdr (e), a));
|
return append2 (builtin_eval (cadar (e), a), eval_quasiquote (cdr (e), a));
|
||||||
return cons (eval_quasiquote (car (e), a), eval_quasiquote (cdr (e), a));
|
return cons (eval_quasiquote (car (e), a), eval_quasiquote (cdr (e), a));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,10 +442,10 @@ eval_quasisyntax (scm *e, scm *a)
|
||||||
if (e == &scm_nil) return e;
|
if (e == &scm_nil) return e;
|
||||||
else if (atom_p (e) == &scm_t) return e;
|
else if (atom_p (e) == &scm_t) return e;
|
||||||
else if (eq_p (car (e), &symbol_unsyntax) == &scm_t)
|
else if (eq_p (car (e), &symbol_unsyntax) == &scm_t)
|
||||||
return eval_env (cadr (e), a);
|
return builtin_eval (cadr (e), a);
|
||||||
else if (e->type == PAIR && e->car->type == PAIR
|
else if (e->type == PAIR && e->car->type == PAIR
|
||||||
&& eq_p (caar (e), &symbol_unsyntax_splicing) == &scm_t)
|
&& eq_p (caar (e), &symbol_unsyntax_splicing) == &scm_t)
|
||||||
return append2 (eval_env (cadar (e), a), eval_quasisyntax (cdr (e), a));
|
return append2 (builtin_eval (cadar (e), a), eval_quasisyntax (cdr (e), a));
|
||||||
return cons (eval_quasisyntax (car (e), a), eval_quasisyntax (cdr (e), a));
|
return cons (eval_quasisyntax (car (e), a), eval_quasisyntax (cdr (e), a));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -467,7 +462,12 @@ scm*eval_quasisyntax (scm *e, scm *a){}
|
||||||
scm *
|
scm *
|
||||||
builtin_p (scm *x)
|
builtin_p (scm *x)
|
||||||
{
|
{
|
||||||
return BUILTIN_P(x);
|
return (x->type == FUNCTION0
|
||||||
|
|| x->type == FUNCTION1
|
||||||
|
|| x->type == FUNCTION2
|
||||||
|
|| x->type == FUNCTION3
|
||||||
|
|| x->type == FUNCTIONn)
|
||||||
|
? &scm_t : &scm_f;
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
|
@ -946,11 +946,11 @@ display_helper (FILE* f, scm *x, bool cont, char const *sep, bool quote)
|
||||||
}
|
}
|
||||||
else if (x->type == NUMBER) fprintf (f, "%d", x->value);
|
else if (x->type == NUMBER) fprintf (f, "%d", x->value);
|
||||||
else if (x->type == PAIR) {
|
else if (x->type == PAIR) {
|
||||||
if (car (x) == &symbol_circ) {
|
if (car (x) == &scm_circular) {
|
||||||
fprintf (f, "(*circ* . #-1#)");
|
fprintf (f, "(*circ* . #-1#)");
|
||||||
return &scm_unspecified;
|
return &scm_unspecified;
|
||||||
}
|
}
|
||||||
if (car (x) == &symbol_closure) {
|
if (car (x) == &scm_closure) {
|
||||||
fprintf (f, "(*closure* . #-1#)");
|
fprintf (f, "(*closure* . #-1#)");
|
||||||
return &scm_unspecified;
|
return &scm_unspecified;
|
||||||
}
|
}
|
||||||
|
@ -993,7 +993,7 @@ ungetchar (int c) //int
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
peek_char () //int
|
peekchar () //int
|
||||||
{
|
{
|
||||||
int c = getchar ();
|
int c = getchar ();
|
||||||
ungetchar (c);
|
ungetchar (c);
|
||||||
|
@ -1001,9 +1001,9 @@ peek_char () //int
|
||||||
}
|
}
|
||||||
|
|
||||||
scm*
|
scm*
|
||||||
builtin_peek_char ()
|
peek_char ()
|
||||||
{
|
{
|
||||||
return make_char (peek_char ());
|
return make_char (peekchar ());
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
|
@ -1026,7 +1026,7 @@ write_char (scm *x/*...*/)
|
||||||
}
|
}
|
||||||
|
|
||||||
scm*
|
scm*
|
||||||
builtin_ungetchar (scm *c)
|
unget_char (scm *c)
|
||||||
{
|
{
|
||||||
assert (c->type == NUMBER || c->type == CHAR);
|
assert (c->type == NUMBER || c->type == CHAR);
|
||||||
ungetchar (c->value);
|
ungetchar (c->value);
|
||||||
|
@ -1043,7 +1043,7 @@ readcomment (int c)
|
||||||
int
|
int
|
||||||
readblock (int c)
|
readblock (int c)
|
||||||
{
|
{
|
||||||
if (c == '!' && peek_char () == '#') return getchar ();
|
if (c == '!' && peekchar () == '#') return getchar ();
|
||||||
return readblock (getchar ());
|
return readblock (getchar ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1061,34 +1061,34 @@ readword (int c, char *w, scm *a)
|
||||||
if (c == '(') {ungetchar (c); return lookup (w, a);}
|
if (c == '(') {ungetchar (c); return lookup (w, a);}
|
||||||
if (c == ')' && !w) {ungetchar (c); return &scm_nil;}
|
if (c == ')' && !w) {ungetchar (c); return &scm_nil;}
|
||||||
if (c == ')') {ungetchar (c); return lookup (w, a);}
|
if (c == ')') {ungetchar (c); return lookup (w, a);}
|
||||||
if (c == ',' && peek_char () == '@') {getchar (); return cons (lookup (",@", a),
|
if (c == ',' && peekchar () == '@') {getchar (); return cons (lookup (",@", a),
|
||||||
cons (readword (getchar (), w, a),
|
cons (readword (getchar (), w, a),
|
||||||
&scm_nil));}
|
&scm_nil));}
|
||||||
if ((c == '\''
|
if ((c == '\''
|
||||||
|| c == '`'
|
|| c == '`'
|
||||||
|| c == ',')
|
|| c == ',')
|
||||||
&& !w) {return cons (lookup_char (c, a),
|
&& !w) {return cons (lookup_char (c, a),
|
||||||
cons (readword (getchar (), w, a),
|
cons (readword (getchar (), w, a),
|
||||||
&scm_nil));}
|
&scm_nil));}
|
||||||
if (c == '#' && peek_char () == ',' && !w) {
|
if (c == '#' && peekchar () == ',' && !w) {
|
||||||
getchar ();
|
getchar ();
|
||||||
if (peek_char () == '@'){getchar (); return cons (lookup ("#,@", a),
|
if (peekchar () == '@'){getchar (); return cons (lookup ("#,@", a),
|
||||||
cons (readword (getchar (), w, a),
|
cons (readword (getchar (), w, a),
|
||||||
&scm_nil));}
|
&scm_nil));}
|
||||||
return cons (lookup ("#,", a), cons (readword (getchar (), w, a), &scm_nil));
|
return cons (lookup ("#,", a), cons (readword (getchar (), w, a), &scm_nil));
|
||||||
}
|
}
|
||||||
if (c == '#'
|
if (c == '#'
|
||||||
&& (peek_char () == '\''
|
&& (peekchar () == '\''
|
||||||
|| peek_char () == '`')
|
|| peekchar () == '`')
|
||||||
&& !w) {char buf[3] = "#"; buf[1] = getchar (); return cons (lookup (buf, a),
|
&& !w) {char buf[3] = "#"; buf[1] = getchar (); return cons (lookup (buf, a),
|
||||||
cons (readword (getchar (), w, a),
|
cons (readword (getchar (), w, a),
|
||||||
&scm_nil));}
|
&scm_nil));}
|
||||||
if (c == ';') {readcomment (c); return readword ('\n', w, a);}
|
if (c == ';') {readcomment (c); return readword ('\n', w, a);}
|
||||||
if (c == '#' && peek_char () == 'x') {getchar (); return read_hex ();}
|
if (c == '#' && peekchar () == 'x') {getchar (); return read_hex ();}
|
||||||
if (c == '#' && peek_char () == '\\') {getchar (); return read_character ();}
|
if (c == '#' && peekchar () == '\\') {getchar (); return read_character ();}
|
||||||
if (c == '#' && !w && peek_char () == '(') {getchar (); return list_to_vector (readlist (a));}
|
if (c == '#' && !w && peekchar () == '(') {getchar (); return list_to_vector (readlist (a));}
|
||||||
if (c == '#' && peek_char () == '(') {ungetchar (c); return lookup (w, a);}
|
if (c == '#' && peekchar () == '(') {ungetchar (c); return lookup (w, a);}
|
||||||
if (c == '#' && peek_char () == '!') {getchar (); readblock (getchar ()); return readword (getchar (), w, a);}
|
if (c == '#' && peekchar () == '!') {getchar (); readblock (getchar ()); return readword (getchar (), w, a);}
|
||||||
char buf[STRING_MAX] = {0};
|
char buf[STRING_MAX] = {0};
|
||||||
char ch = c;
|
char ch = c;
|
||||||
char *p = w ? w + strlen (w) : buf;
|
char *p = w ? w + strlen (w) : buf;
|
||||||
|
@ -1101,7 +1101,7 @@ scm *
|
||||||
read_hex ()
|
read_hex ()
|
||||||
{
|
{
|
||||||
int n = 0;
|
int n = 0;
|
||||||
int c = peek_char ();
|
int c = peekchar ();
|
||||||
while ((c >= '0' && c <= '9')
|
while ((c >= '0' && c <= '9')
|
||||||
|| (c >= 'A' && c <= 'F')
|
|| (c >= 'A' && c <= 'F')
|
||||||
|| (c >= 'a' && c <= 'f')) {
|
|| (c >= 'a' && c <= 'f')) {
|
||||||
|
@ -1110,7 +1110,7 @@ read_hex ()
|
||||||
else if (c >= 'A') n += c - 'A' + 10;
|
else if (c >= 'A') n += c - 'A' + 10;
|
||||||
else n+= c - '0';
|
else n+= c - '0';
|
||||||
getchar ();
|
getchar ();
|
||||||
c = peek_char ();
|
c = peekchar ();
|
||||||
}
|
}
|
||||||
return make_number (n);
|
return make_number (n);
|
||||||
}
|
}
|
||||||
|
@ -1120,19 +1120,19 @@ read_character ()
|
||||||
{
|
{
|
||||||
int c = getchar ();
|
int c = getchar ();
|
||||||
if (c >= '0' && c <= '7'
|
if (c >= '0' && c <= '7'
|
||||||
&& peek_char () >= '0' && peek_char () <= '7') {
|
&& peekchar () >= '0' && peekchar () <= '7') {
|
||||||
c = c - '0';
|
c = c - '0';
|
||||||
while (peek_char () >= '0' && peek_char () <= '7') {
|
while (peekchar () >= '0' && peekchar () <= '7') {
|
||||||
c <<= 3;
|
c <<= 3;
|
||||||
c += getchar () - '0';
|
c += getchar () - '0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (c >= 'a' && c <= 'z'
|
else if (c >= 'a' && c <= 'z'
|
||||||
&& peek_char () >= 'a' && peek_char () <= 'z') {
|
&& peekchar () >= 'a' && peekchar () <= 'z') {
|
||||||
char buf[STRING_MAX];
|
char buf[STRING_MAX];
|
||||||
char *p = buf;
|
char *p = buf;
|
||||||
*p++ = c;
|
*p++ = c;
|
||||||
while (peek_char () >= 'a' && peek_char () <= 'z') {
|
while (peekchar () >= 'a' && peekchar () <= 'z') {
|
||||||
*p++ = getchar ();
|
*p++ = getchar ();
|
||||||
}
|
}
|
||||||
*p = 0;
|
*p = 0;
|
||||||
|
@ -1160,8 +1160,8 @@ readstring ()
|
||||||
int c = getchar ();
|
int c = getchar ();
|
||||||
while (true) {
|
while (true) {
|
||||||
if (c == '"') break;
|
if (c == '"') break;
|
||||||
if (c == '\\' && peek_char () == '"') *p++ = getchar ();
|
if (c == '\\' && peekchar () == '"') *p++ = getchar ();
|
||||||
else if (c == '\\' && peek_char () == 'n') {getchar (); *p++ = '\n';}
|
else if (c == '\\' && peekchar () == 'n') {getchar (); *p++ = '\n';}
|
||||||
else if (c == EOF) assert (!"EOF in string");
|
else if (c == EOF) assert (!"EOF in string");
|
||||||
else *p++ = c;
|
else *p++ = c;
|
||||||
c = getchar ();
|
c = getchar ();
|
||||||
|
@ -1175,7 +1175,7 @@ eat_whitespace (int c)
|
||||||
{
|
{
|
||||||
while (c == ' ' || c == '\t' || c == '\n') c = getchar ();
|
while (c == ' ' || c == '\t' || c == '\n') c = getchar ();
|
||||||
if (c == ';') return eat_whitespace (readcomment (c));
|
if (c == ';') return eat_whitespace (readcomment (c));
|
||||||
if (c == '#' && peek_char () == '!') {getchar (); readblock (getchar ()); return eat_whitespace (getchar ());}
|
if (c == '#' && peekchar () == '!') {getchar (); readblock (getchar ()); return eat_whitespace (getchar ());}
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1363,27 +1363,27 @@ mes_environment ()
|
||||||
a = cons (cons (&symbol_begin, &symbol_begin), a);
|
a = cons (cons (&symbol_begin, &symbol_begin), a);
|
||||||
a = cons (cons (&symbol_quote, &scm_quote), a);
|
a = cons (cons (&symbol_quote, &scm_quote), a);
|
||||||
a = cons (cons (&symbol_syntax, &scm_syntax), a);
|
a = cons (cons (&symbol_syntax, &scm_syntax), a);
|
||||||
|
|
||||||
#if MES_FULL
|
#if MES_FULL
|
||||||
#include "environment.i"
|
#include "environment.i"
|
||||||
#else
|
#else
|
||||||
a = add_environment (a, "display", &scm_display);
|
a = add_environment (a, "display", &scm_display);
|
||||||
a = add_environment (a, "newline", &scm_newline);
|
a = add_environment (a, "newline", &scm_newline);
|
||||||
#endif
|
#endif
|
||||||
a = cons (cons (&symbol_closure, a), a);
|
a = cons (cons (&scm_closure, a), a);
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
make_lambda (scm *args, scm *body)
|
make_lambda (scm *args, scm *body)
|
||||||
{
|
{
|
||||||
return cons (&symbol_lambda, cons (args, body));
|
return cons (&scm_lambda, cons (args, body));
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
make_closure (scm *args, scm *body, scm *a)
|
make_closure (scm *args, scm *body, scm *a)
|
||||||
{
|
{
|
||||||
return cons (&symbol_closure, cons (cons (&symbol_circ, a), cons (args, body)));
|
return cons (&scm_closure, cons (cons (&scm_circular, a), cons (args, body)));
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
|
@ -1392,11 +1392,11 @@ define (scm *x, scm *a)
|
||||||
scm *e;
|
scm *e;
|
||||||
scm *name = cadr (x);
|
scm *name = cadr (x);
|
||||||
if (name->type != PAIR)
|
if (name->type != PAIR)
|
||||||
e = eval_env (caddr (x), cons (cons (cadr (x), cadr (x)), a));
|
e = builtin_eval (caddr (x), cons (cons (cadr (x), cadr (x)), a));
|
||||||
else {
|
else {
|
||||||
name = car (name);
|
name = car (name);
|
||||||
scm *p = pairlis (cadr (x), cadr (x), a);
|
scm *p = pairlis (cadr (x), cadr (x), a);
|
||||||
e = eval_env (make_lambda (cdadr (x), cddr (x)), p);
|
e = builtin_eval (make_lambda (cdadr (x), cddr (x)), p);
|
||||||
}
|
}
|
||||||
if (eq_p (car (x), &symbol_define_macro) == &scm_t)
|
if (eq_p (car (x), &symbol_define_macro) == &scm_t)
|
||||||
e = make_macro (e, name->name);
|
e = make_macro (e, name->name);
|
||||||
|
@ -1404,17 +1404,20 @@ define (scm *x, scm *a)
|
||||||
scm *aa = cons (entry, &scm_nil);
|
scm *aa = cons (entry, &scm_nil);
|
||||||
set_cdr_x (aa, cdr (a));
|
set_cdr_x (aa, cdr (a));
|
||||||
set_cdr_x (a, aa);
|
set_cdr_x (a, aa);
|
||||||
scm *cl = assq (&symbol_closure, a);
|
scm *cl = assq (&scm_closure, a);
|
||||||
set_cdr_x (cl, aa);
|
set_cdr_x (cl, aa);
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
lookup_macro (scm *x, scm *a)
|
define_macro (scm *x, scm *a)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
scm *
|
||||||
|
lookup_macro (scm *x, scm *a)
|
||||||
|
{
|
||||||
scm *m = assq (x, a);
|
scm *m = assq (x, a);
|
||||||
if (m != &scm_f && macro_p (cdr (m)) != &scm_f)
|
if (m != &scm_f && macro_p (cdr (m)) != &scm_f)
|
||||||
return cdr (m)->macro;
|
return cdr (m)->macro;
|
||||||
|
@ -1425,7 +1428,12 @@ scm *
|
||||||
read_file (scm *e, scm *a)
|
read_file (scm *e, scm *a)
|
||||||
{
|
{
|
||||||
if (e == &scm_nil) return e;
|
if (e == &scm_nil) return e;
|
||||||
|
#if DEBUG
|
||||||
|
scm *x = cons (e, read_file (read_env (a), a));
|
||||||
|
display_ (stderr, x);
|
||||||
|
#else
|
||||||
return cons (e, read_file (read_env (a), a));
|
return cons (e, read_file (read_env (a), a));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -1434,10 +1442,7 @@ main (int argc, char *argv[])
|
||||||
if (argc > 1 && !strcmp (argv[1], "--help")) return puts ("Usage: mes < FILE\n");
|
if (argc > 1 && !strcmp (argv[1], "--help")) return puts ("Usage: mes < FILE\n");
|
||||||
if (argc > 1 && !strcmp (argv[1], "--version")) return puts ("Mes 0.0\n");
|
if (argc > 1 && !strcmp (argv[1], "--version")) return puts ("Mes 0.0\n");
|
||||||
scm *a = mes_environment ();
|
scm *a = mes_environment ();
|
||||||
#if STATIC_PRIMITIVES
|
display_ (stderr, builtin_eval (cons (&symbol_begin, read_file (read_env (a), a)), a));
|
||||||
mes_primitives ();
|
|
||||||
#endif
|
|
||||||
display_ (stderr, eval_env (cons (&symbol_begin, read_file (read_env (a), a)), a));
|
|
||||||
fputs ("", stderr);
|
fputs ("", stderr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,9 +26,8 @@
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(define eval eval-env)
|
|
||||||
(define (apply f x) (apply-env f x (current-module)))
|
(define (apply f x) (apply-env f x (current-module)))
|
||||||
(define (primitive-eval e) (eval-env e (current-module)))
|
(define (primitive-eval e) (eval e (current-module)))
|
||||||
(define (expand-macro e) (expand-macro-env e (current-module)))
|
(define (expand-macro e) (expand-macro-env e (current-module)))
|
||||||
|
|
||||||
(define quotient /)
|
(define quotient /)
|
||||||
|
|
|
@ -147,7 +147,7 @@ along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
(begin
|
(begin
|
||||||
(meta (cadr sexp))
|
(meta (cadr sexp))
|
||||||
(loop a))
|
(loop a))
|
||||||
(let ((e (eval-env sexp a)))
|
(let ((e (eval sexp a)))
|
||||||
(if (eq? e *unspecified*) (loop a)
|
(if (eq? e *unspecified*) (loop a)
|
||||||
(let ((id (string->symbol (string-append "$" (number->string count)))))
|
(let ((id (string->symbol (string-append "$" (number->string count)))))
|
||||||
(set! count (+ count 1))
|
(set! count (+ count 1))
|
||||||
|
|
Loading…
Reference in a new issue