snarf scm functions and environment.
This commit is contained in:
parent
f89507414e
commit
72d96eb485
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -4,3 +4,4 @@
|
||||||
*~
|
*~
|
||||||
/boot.mes
|
/boot.mes
|
||||||
/mes
|
/mes
|
||||||
|
/mes.h
|
||||||
|
|
17
GNUmakefile
17
GNUmakefile
|
@ -6,6 +6,23 @@ default: all
|
||||||
|
|
||||||
all: mes boot.mes
|
all: mes boot.mes
|
||||||
|
|
||||||
|
#mes.o: mes.c mes.h
|
||||||
|
mes: mes.c mes.h
|
||||||
|
|
||||||
|
mes.h: mes.c GNUmakefile
|
||||||
|
# $(info FUNCTIONS:$(FUNCTIONS))
|
||||||
|
( echo '#if MES'; echo '#if MES' 1>&2;\
|
||||||
|
grep -E '^(scm [*])*[a-z_]+ \(.*\)( {|$$)' $< | grep -Ev '\(.*(char |bool |int )' | sed -e 's,^scm [*],,' | sort |\
|
||||||
|
while read f; do\
|
||||||
|
fun=$$(echo $$f | sed -e 's,^scm [*],,' -e 's,{.*,,');\
|
||||||
|
name=$$(echo $$fun | sed -e 's,^scm [\*],,' | grep -o '^[^ ]*');\
|
||||||
|
scm_name=$$(echo $$name | sed -e 's,_p$$,?,' -e 's,^builtin_,,' -re 's,(.*)_$$,c:\1,' | sed -e 's,^less?$$,<,' -e 's,^minus$$,-,' -e 's,_,-,g');\
|
||||||
|
args=$$(echo $$fun | grep -o 'scm [\*]' | wc -l);\
|
||||||
|
echo "scm *$$fun;";\
|
||||||
|
echo "scm scm_$$name = {FUNCTION$$args, .name=\"$$scm_name\", .function$$args=&$$name};";\
|
||||||
|
echo "a = add_environment (a, \"$$scm_name\", &scm_$$name);" 1>&2;\
|
||||||
|
done; echo '#endif'; echo '#endif' 1>&2) > $@ 2>environment.i
|
||||||
|
|
||||||
check: all
|
check: all
|
||||||
./mes.test
|
./mes.test
|
||||||
./mes.test ./mes
|
./mes.test ./mes
|
||||||
|
|
180
mes.c
180
mes.c
|
@ -28,7 +28,6 @@
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -66,6 +65,11 @@ typedef struct scm_t {
|
||||||
};
|
};
|
||||||
} scm;
|
} scm;
|
||||||
|
|
||||||
|
#define MES 1
|
||||||
|
#include "mes.h"
|
||||||
|
|
||||||
|
scm *display_helper (scm*, bool, char*, bool);
|
||||||
|
|
||||||
scm scm_nil = {ATOM, "()"};
|
scm scm_nil = {ATOM, "()"};
|
||||||
scm scm_dot = {ATOM, "."};
|
scm scm_dot = {ATOM, "."};
|
||||||
scm scm_t = {ATOM, "#t"};
|
scm scm_t = {ATOM, "#t"};
|
||||||
|
@ -91,7 +95,6 @@ atom_p (scm *x)
|
||||||
{
|
{
|
||||||
return x->type == PAIR ? &scm_f : &scm_t;
|
return x->type == PAIR ? &scm_f : &scm_t;
|
||||||
}
|
}
|
||||||
scm scm_atom = {FUNCTION1, .name="atom", .function1 = &atom_p};
|
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
car (scm *x)
|
car (scm *x)
|
||||||
|
@ -148,26 +151,23 @@ scm *eval (scm*, scm*);
|
||||||
|
|
||||||
scm *display (scm*);
|
scm *display (scm*);
|
||||||
|
|
||||||
scm scm_quote;
|
|
||||||
scm *
|
scm *
|
||||||
quote (scm *x)
|
quote (scm *x)
|
||||||
{
|
{
|
||||||
return cons (&scm_quote, x);
|
return cons (&scm_symbol_quote, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if QUASIQUOTE
|
#if QUASIQUOTE
|
||||||
scm scm_unquote;
|
|
||||||
scm *
|
scm *
|
||||||
unquote (scm *x)
|
unquote (scm *x)
|
||||||
{
|
{
|
||||||
return cons (&scm_unquote, x);
|
return cons (&scm_symbol_unquote, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
scm scm_quasiquote;
|
|
||||||
scm *
|
scm *
|
||||||
quasiquote (scm *x)
|
quasiquote (scm *x)
|
||||||
{
|
{
|
||||||
return cons (&scm_quasiquote, x);
|
return cons (&scm_symbol_quasiquote, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *eval_quasiquote (scm *, scm *);
|
scm *eval_quasiquote (scm *, scm *);
|
||||||
|
@ -175,8 +175,6 @@ scm *eval_quasiquote (scm *, scm *);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Library functions
|
//Library functions
|
||||||
scm scm_read;
|
|
||||||
|
|
||||||
|
|
||||||
// Derived, non-primitives
|
// Derived, non-primitives
|
||||||
scm *caar (scm *x) {return car (car (x));}
|
scm *caar (scm *x) {return car (car (x));}
|
||||||
|
@ -189,32 +187,6 @@ scm *cdadr (scm *x) {return cdr (car (cdr (x)));}
|
||||||
scm *cadar (scm *x) {return car (cdr (car (x)));}
|
scm *cadar (scm *x) {return car (cdr (car (x)));}
|
||||||
scm *cddar (scm *x) {return cdr (cdr (car (x)));}
|
scm *cddar (scm *x) {return cdr (cdr (car (x)));}
|
||||||
scm *cdddr (scm *x) {return cdr (cdr (cdr (x)));}
|
scm *cdddr (scm *x) {return cdr (cdr (cdr (x)));}
|
||||||
scm scm_caar = {FUNCTION1, .name="caar ", .function1 = &caar };
|
|
||||||
scm scm_cadr = {FUNCTION1, .name="cadr ", .function1 = &cadr };
|
|
||||||
scm scm_cdar = {FUNCTION1, .name="cdar ", .function1 = &cdar };
|
|
||||||
scm scm_cddr = {FUNCTION1, .name="cddr ", .function1 = &cddr };
|
|
||||||
scm scm_caadr = {FUNCTION1, .name="caadr", .function1 = &caadr};
|
|
||||||
scm scm_caddr = {FUNCTION1, .name="caddr", .function1 = &caddr};
|
|
||||||
scm scm_cdadr = {FUNCTION1, .name="cdadr", .function1 = &cdadr};
|
|
||||||
scm scm_cadar = {FUNCTION1, .name="cadar", .function1 = &cadar};
|
|
||||||
scm scm_cddar = {FUNCTION1, .name="cddar", .function1 = &cddar};
|
|
||||||
scm scm_cdddr = {FUNCTION1, .name="cdddr", .function1 = &cdddr};
|
|
||||||
|
|
||||||
scm *
|
|
||||||
list (scm *x, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
scm *lst = &scm_nil;
|
|
||||||
|
|
||||||
va_start (args, x);
|
|
||||||
while (x != &scm_unspecified)
|
|
||||||
{
|
|
||||||
lst = cons (x, lst);
|
|
||||||
x = va_arg (args, scm*);
|
|
||||||
}
|
|
||||||
va_end (args);
|
|
||||||
return lst;
|
|
||||||
}
|
|
||||||
|
|
||||||
scm* make_atom (char const *);
|
scm* make_atom (char const *);
|
||||||
|
|
||||||
|
@ -235,7 +207,6 @@ pairlis (scm *x, scm *y, scm *a)
|
||||||
return cons (cons (car (x), car (y)),
|
return cons (cons (car (x), car (y)),
|
||||||
pairlis (cdr (x), cdr (y), a));
|
pairlis (cdr (x), cdr (y), a));
|
||||||
}
|
}
|
||||||
scm scm_pairlis = {FUNCTION3, .name="pairlis", .function3 = &pairlis};
|
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
assoc (scm *x, scm *a)
|
assoc (scm *x, scm *a)
|
||||||
|
@ -250,7 +221,6 @@ assoc (scm *x, scm *a)
|
||||||
return car (a);
|
return car (a);
|
||||||
return assoc (x, cdr (a));
|
return assoc (x, cdr (a));
|
||||||
}
|
}
|
||||||
scm scm_assoc = {FUNCTION2, .name="assoc", .function2 = &assoc};
|
|
||||||
|
|
||||||
scm *apply (scm*, scm*, scm*);
|
scm *apply (scm*, scm*, scm*);
|
||||||
scm *eval_ (scm*, scm*);
|
scm *eval_ (scm*, scm*);
|
||||||
|
@ -395,8 +365,6 @@ evcon (scm *c, scm *a)
|
||||||
return evcon_ (c, a);
|
return evcon_ (c, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
scm scm_evcon = {FUNCTION2, .name="evcon", .function2 = &evcon};
|
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
evlis (scm *m, scm *a)
|
evlis (scm *m, scm *a)
|
||||||
{
|
{
|
||||||
|
@ -410,29 +378,6 @@ evlis (scm *m, scm *a)
|
||||||
scm *e = eval (car (m), a);
|
scm *e = eval (car (m), a);
|
||||||
return cons (e, evlis (cdr (m), a));
|
return cons (e, evlis (cdr (m), a));
|
||||||
}
|
}
|
||||||
scm scm_evlis = {FUNCTION2, .name="evlis", .function2 = &evlis};
|
|
||||||
|
|
||||||
|
|
||||||
//Primitives
|
|
||||||
scm scm_car = {FUNCTION1, "car", .function1 = &car};
|
|
||||||
scm scm_cdr = {FUNCTION1, "cdr", .function1 = &cdr};
|
|
||||||
scm scm_cons = {FUNCTION2, "cons", .function2 = &cons};
|
|
||||||
scm scm_cond = {FUNCTION2, "cond", .function2 = &evcon};
|
|
||||||
scm scm_eq_p = {FUNCTION2, "eq", .function2 = &eq_p};
|
|
||||||
scm scm_null_p = {FUNCTION1, "null", .function1 = &null_p};
|
|
||||||
scm scm_pair_p = {FUNCTION1, "pair", .function1 = &pair_p};
|
|
||||||
scm scm_quote = {FUNCTION1, "quote", .function1 = "e};
|
|
||||||
|
|
||||||
#if QUASIQUOTE
|
|
||||||
scm scm_unquote = {FUNCTION1, "unquote", .function1 = &unquote};
|
|
||||||
scm scm_quasiquote = {FUNCTION1, "quasiquote", .function1 = &quasiquote};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
scm scm_eval = {FUNCTION2, .name="eval", .function2 = &eval};
|
|
||||||
scm scm_apply = {FUNCTION3, .name="apply", .function3 = &apply};
|
|
||||||
|
|
||||||
scm scm_apply_ = {FUNCTION3, .name="c:apply", .function3 = &apply_};
|
|
||||||
scm scm_eval_ = {FUNCTION2, .name="c:eval", .function2 = &eval_};
|
|
||||||
|
|
||||||
//Helpers
|
//Helpers
|
||||||
|
|
||||||
|
@ -445,26 +390,18 @@ builtin_p (scm *x)
|
||||||
|| x->type == FUNCTION3)
|
|| x->type == FUNCTION3)
|
||||||
? &scm_t : &scm_f;
|
? &scm_t : &scm_f;
|
||||||
}
|
}
|
||||||
scm scm_builtin_p = {FUNCTION1, .name="builtin", .function1 = &builtin_p};
|
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
number_p (scm *x)
|
number_p (scm *x)
|
||||||
{
|
{
|
||||||
return x->type == NUMBER ? &scm_t : &scm_f;
|
return x->type == NUMBER ? &scm_t : &scm_f;
|
||||||
}
|
}
|
||||||
scm scm_number_p = {FUNCTION1, .name="number", .function1 = &number_p};
|
|
||||||
|
|
||||||
scm *display_helper (scm*, bool, char*, bool);
|
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
display (scm *x)
|
display (scm *x)
|
||||||
{
|
{
|
||||||
return display_helper (x, false, "", false);
|
return display_helper (x, false, "", false);
|
||||||
}
|
}
|
||||||
scm scm_display = {FUNCTION1, .name="display", .function1 = &display};
|
|
||||||
|
|
||||||
scm *call (scm*, scm*);
|
|
||||||
scm scm_call = {FUNCTION2, .name="call", .function2 = &call};
|
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
call (scm *fn, scm *x)
|
call (scm *fn, scm *x)
|
||||||
|
@ -498,8 +435,6 @@ append (scm *x, scm *y)
|
||||||
assert (x->type == PAIR);
|
assert (x->type == PAIR);
|
||||||
return cons (car (x), append (cdr (x), y));
|
return cons (car (x), append (cdr (x), y));
|
||||||
}
|
}
|
||||||
scm scm_append = {FUNCTION2, .name="append", .function2 = &append};
|
|
||||||
|
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
make_atom (char const *s)
|
make_atom (char const *s)
|
||||||
|
@ -572,7 +507,6 @@ builtin_lookup (scm *l, scm *a)
|
||||||
{
|
{
|
||||||
return lookup (list2str (l), a);
|
return lookup (list2str (l), a);
|
||||||
}
|
}
|
||||||
scm scm_lookup = {FUNCTION2, .name="lookup", .function2 = &builtin_lookup};
|
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
cossa (scm *x, scm *a)
|
cossa (scm *x, scm *a)
|
||||||
|
@ -589,7 +523,6 @@ newline ()
|
||||||
puts ("");
|
puts ("");
|
||||||
return &scm_unspecified;
|
return &scm_unspecified;
|
||||||
}
|
}
|
||||||
scm scm_newline = {FUNCTION0, .name="newline", .function0 = &newline};
|
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
display_helper (scm *x, bool cont, char *sep, bool quote)
|
display_helper (scm *x, bool cont, char *sep, bool quote)
|
||||||
|
@ -634,13 +567,13 @@ display_helper (scm *x, bool cont, char *sep, bool quote)
|
||||||
// READ
|
// READ
|
||||||
|
|
||||||
int
|
int
|
||||||
ungetchar (int c)
|
ungetchar (int c) //int
|
||||||
{
|
{
|
||||||
return ungetc (c, stdin);
|
return ungetc (c, stdin);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
peekchar ()
|
peekchar () //int
|
||||||
{
|
{
|
||||||
int c = getchar ();
|
int c = getchar ();
|
||||||
ungetchar (c);
|
ungetchar (c);
|
||||||
|
@ -652,23 +585,20 @@ builtin_getchar ()
|
||||||
{
|
{
|
||||||
return make_number (getchar ());
|
return make_number (getchar ());
|
||||||
}
|
}
|
||||||
scm scm_getchar = {FUNCTION0, .name="getchar", .function0 = &builtin_getchar};
|
|
||||||
|
|
||||||
scm*
|
scm*
|
||||||
builtin_peekchar ()
|
builtin_peekchar ()
|
||||||
{
|
{
|
||||||
return make_number (peekchar ());
|
return make_number (peekchar ());
|
||||||
}
|
}
|
||||||
scm scm_peekchar = {FUNCTION0, .name="peekchar", .function0 = &builtin_peekchar};
|
|
||||||
|
|
||||||
scm*
|
scm*
|
||||||
builtin_ungetchar (scm* c)
|
builtin_ungetchar (scm *c)
|
||||||
{
|
{
|
||||||
assert (c->type == NUMBER);
|
assert (c->type == NUMBER);
|
||||||
ungetchar (c->value);
|
ungetchar (c->value);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
scm scm_ungetchar = {FUNCTION1, .name="ungetchar", .function1 = &builtin_ungetchar};
|
|
||||||
|
|
||||||
int
|
int
|
||||||
readcomment (int c)
|
readcomment (int c)
|
||||||
|
@ -740,7 +670,6 @@ readenv (scm *a)
|
||||||
{
|
{
|
||||||
return readword (getchar (), 0, a);
|
return readword (getchar (), 0, a);
|
||||||
}
|
}
|
||||||
scm scm_readenv = {FUNCTION1, .name="readenv", .function1 = &readenv};
|
|
||||||
|
|
||||||
// Extras to make interesting program
|
// Extras to make interesting program
|
||||||
|
|
||||||
|
@ -750,8 +679,6 @@ hello_world ()
|
||||||
puts ("c: hello world");
|
puts ("c: hello world");
|
||||||
return &scm_unspecified;
|
return &scm_unspecified;
|
||||||
}
|
}
|
||||||
scm scm_hello_world = {FUNCTION0, .name="hello-world", .function0 = &hello_world};
|
|
||||||
|
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
less_p (scm *a, scm *b)
|
less_p (scm *a, scm *b)
|
||||||
|
@ -783,9 +710,6 @@ minus (scm *a, scm *b)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
scm scm_less_p = {FUNCTION2, .name="<", .function2 = &less_p};
|
|
||||||
scm scm_minus = {FUNCTION2, .name="-", .function2 = &minus};
|
|
||||||
|
|
||||||
#if QUASIQUOTE
|
#if QUASIQUOTE
|
||||||
scm *
|
scm *
|
||||||
eval_quasiquote (scm *e, scm *a)
|
eval_quasiquote (scm *e, scm *a)
|
||||||
|
@ -813,17 +737,16 @@ eval_quasiquote (scm *e, scm *a)
|
||||||
return cdar (e);
|
return cdar (e);
|
||||||
return cons (car (e), eval_quasiquote (cdr (e), a));
|
return cons (car (e), eval_quasiquote (cdr (e), a));
|
||||||
}
|
}
|
||||||
scm scm_eval_quasiquote = {FUNCTION2, .name="c:eval-quasiquote", .function2 = &eval_quasiquote};
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
add_environment (scm *a, char *name, scm* x)
|
add_environment (scm *a, char *name, scm *x)
|
||||||
{
|
{
|
||||||
return cons (cons (make_atom (name), x), a);
|
return cons (cons (make_atom (name), x), a);
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
initial_environment ()
|
mes_environment ()
|
||||||
{
|
{
|
||||||
scm *a = &scm_nil;
|
scm *a = &scm_nil;
|
||||||
|
|
||||||
|
@ -831,76 +754,19 @@ initial_environment ()
|
||||||
a = add_environment (a, "#t", &scm_t);
|
a = add_environment (a, "#t", &scm_t);
|
||||||
a = add_environment (a, "#f", &scm_f);
|
a = add_environment (a, "#f", &scm_f);
|
||||||
a = add_environment (a, "*unspecified*", &scm_unspecified);
|
a = add_environment (a, "*unspecified*", &scm_unspecified);
|
||||||
|
|
||||||
a = add_environment (a, "label", &scm_label);
|
a = add_environment (a, "label", &scm_label);
|
||||||
a = add_environment (a, "lambda", &scm_lambda);
|
a = add_environment (a, "lambda", &scm_lambda);
|
||||||
|
|
||||||
a = add_environment (a, "atom", &scm_atom);
|
|
||||||
a = add_environment (a, "car", &scm_car);
|
|
||||||
a = add_environment (a, "cdr", &scm_cdr);
|
|
||||||
a = add_environment (a, "cons", &scm_cons);
|
|
||||||
a = add_environment (a, "cond", &scm_cond);
|
|
||||||
a = add_environment (a, "eq", &scm_eq_p);
|
|
||||||
|
|
||||||
a = add_environment (a, "null", &scm_null_p);
|
|
||||||
a = add_environment (a, "pair", &scm_pair_p);
|
|
||||||
a = add_environment (a, "quote", &scm_quote);
|
|
||||||
a = add_environment (a, "'", &scm_quote);
|
|
||||||
|
|
||||||
#if QUASIQUOTE
|
|
||||||
a = add_environment (a, "quasiquote", &scm_quasiquote);
|
|
||||||
a = add_environment (a, "unquote", &scm_unquote);
|
|
||||||
a = add_environment (a, ",", &scm_unquote);
|
|
||||||
a = add_environment (a, "`", &scm_quasiquote);
|
|
||||||
a = add_environment (a, "eval-quasiquote", &scm_eval_quasiquote);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
a = add_environment (a, "evlis", &scm_evlis);
|
|
||||||
a = add_environment (a, "evcon", &scm_evcon);
|
|
||||||
a = add_environment (a, "pairlis", &scm_pairlis);
|
|
||||||
a = add_environment (a, "assoc", &scm_assoc);
|
|
||||||
|
|
||||||
a = add_environment (a, "c:eval", &scm_eval_);
|
|
||||||
a = add_environment (a, "c:apply", &scm_apply_);
|
|
||||||
a = add_environment (a, "eval", &scm_eval);
|
|
||||||
a = add_environment (a, "apply", &scm_apply);
|
|
||||||
|
|
||||||
a = add_environment (a, "getchar", &scm_getchar);
|
|
||||||
a = add_environment (a, "peekchar", &scm_peekchar);
|
|
||||||
a = add_environment (a, "ungetchar", &scm_ungetchar);
|
|
||||||
a = add_environment (a, "lookup", &scm_lookup);
|
|
||||||
|
|
||||||
a = add_environment (a, "readenv", &scm_readenv);
|
|
||||||
a = add_environment (a, "display", &scm_display);
|
|
||||||
a = add_environment (a, "newline", &scm_newline);
|
|
||||||
|
|
||||||
a = add_environment (a, "builtin", &scm_builtin_p);
|
|
||||||
a = add_environment (a, "number", &scm_number_p);
|
|
||||||
a = add_environment (a, "call", &scm_call);
|
|
||||||
|
|
||||||
|
|
||||||
a = add_environment (a, "hello-world", &scm_hello_world);
|
|
||||||
a = add_environment (a, "<", &scm_less_p);
|
|
||||||
a = add_environment (a, "-", &scm_minus);
|
|
||||||
|
|
||||||
// DERIVED
|
|
||||||
a = add_environment (a, "caar", &scm_caar);
|
|
||||||
a = add_environment (a, "cadr", &scm_cadr);
|
|
||||||
a = add_environment (a, "cdar", &scm_cdar);
|
|
||||||
a = add_environment (a, "cddr", &scm_cddr);
|
|
||||||
a = add_environment (a, "caadr", &scm_caadr);
|
|
||||||
a = add_environment (a, "caddr", &scm_caddr);
|
|
||||||
a = add_environment (a, "cdadr", &scm_cdadr);
|
|
||||||
a = add_environment (a, "cadar", &scm_cadar);
|
|
||||||
a = add_environment (a, "cddar", &scm_cddar);
|
|
||||||
a = add_environment (a, "cdddr", &scm_cdddr);
|
|
||||||
|
|
||||||
a = add_environment (a, "append", &scm_append);
|
|
||||||
|
|
||||||
//
|
|
||||||
a = add_environment (a, "*macro*", &scm_nil);
|
a = add_environment (a, "*macro*", &scm_nil);
|
||||||
a = add_environment (a, "*dot*", &scm_dot);
|
a = add_environment (a, "*dot*", &scm_dot);
|
||||||
a = add_environment (a, "current-module", &scm_symbol_current_module);
|
a = add_environment (a, "current-module", &scm_symbol_current_module);
|
||||||
|
|
||||||
|
a = add_environment (a, "'", &scm_quote);
|
||||||
|
#if QUASIQUOTE
|
||||||
|
a = add_environment (a, ",", &scm_unquote);
|
||||||
|
a = add_environment (a, "`", &scm_quasiquote);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "environment.i"
|
||||||
|
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
@ -966,14 +832,14 @@ loop (scm *r, scm *e, scm *a)
|
||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
scm *a = initial_environment ();
|
scm *a = mes_environment ();
|
||||||
display (loop (&scm_unspecified, readenv (a), a));
|
display (loop (&scm_unspecified, readenv (a), a));
|
||||||
newline ();
|
newline ();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
scm *
|
scm *
|
||||||
apply (scm* fn, scm *x, scm *a)
|
apply (scm *fn, scm *x, scm *a)
|
||||||
{
|
{
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
printf ("\nc:apply fn=");
|
printf ("\nc:apply fn=");
|
||||||
|
|
106
mes.mes
106
mes.mes
|
@ -36,8 +36,8 @@
|
||||||
;; (define (pairlis x y a)
|
;; (define (pairlis x y a)
|
||||||
;; ;;(debug "pairlis x=~a y=~a a=~a\n" x y a)
|
;; ;;(debug "pairlis x=~a y=~a a=~a\n" x y a)
|
||||||
;; (cond
|
;; (cond
|
||||||
;; ((null x) a)
|
;; ((null? x) a)
|
||||||
;; ((atom x) (cons (cons x y) a))
|
;; ((atom? x) (cons (cons x y) a))
|
||||||
;; (#t (cons (cons (car x) (car y))
|
;; (#t (cons (cons (car x) (car y))
|
||||||
;; (pairlis (cdr x) (cdr y) a)))))
|
;; (pairlis (cdr x) (cdr y) a)))))
|
||||||
|
|
||||||
|
@ -45,8 +45,8 @@
|
||||||
;; ;;(stderr "assoc x=~a\n" x)
|
;; ;;(stderr "assoc x=~a\n" x)
|
||||||
;; ;;(debug "assoc x=~a a=~a\n" x a)
|
;; ;;(debug "assoc x=~a a=~a\n" x a)
|
||||||
;; (cond
|
;; (cond
|
||||||
;; ((null a) #f)
|
;; ((null? a) #f)
|
||||||
;; ((eq (caar a) x) (car a))
|
;; ((eq? (caar a) x) (car a))
|
||||||
;; (#t (assoc x (cdr a)))))
|
;; (#t (assoc x (cdr a)))))
|
||||||
|
|
||||||
;; ;; Page 13
|
;; ;; Page 13
|
||||||
|
@ -60,7 +60,7 @@
|
||||||
;; single-statement cond
|
;; single-statement cond
|
||||||
;; ((eval (caar c) a) (eval (cadar c) a))
|
;; ((eval (caar c) a) (eval (cadar c) a))
|
||||||
((eval (caar c) a)
|
((eval (caar c) a)
|
||||||
(cond ((null (cddar c)) (eval (cadar c) a))
|
(cond ((null? (cddar c)) (eval (cadar c) a))
|
||||||
(#t (eval (cadar c) a)
|
(#t (eval (cadar c) a)
|
||||||
(evcon
|
(evcon
|
||||||
(cons (cons #t (cddar c)) '())
|
(cons (cons #t (cddar c)) '())
|
||||||
|
@ -73,7 +73,7 @@
|
||||||
;; (display m)
|
;; (display m)
|
||||||
;; (newline)
|
;; (newline)
|
||||||
(cond
|
(cond
|
||||||
((null m) '())
|
((null? m) '())
|
||||||
(#t (cons (eval (car m) a) (evlis (cdr m) a)))))
|
(#t (cons (eval (car m) a) (evlis (cdr m) a)))))
|
||||||
|
|
||||||
|
|
||||||
|
@ -84,33 +84,33 @@
|
||||||
;; (display fn)
|
;; (display fn)
|
||||||
;; (newline)
|
;; (newline)
|
||||||
;; (display 'builtin:)
|
;; (display 'builtin:)
|
||||||
;; (display (builtin fn))
|
;; (display (builtin? fn))
|
||||||
;; (newline)
|
;; (newline)
|
||||||
;; (display 'x:)
|
;; (display 'x:)
|
||||||
;; (display x)
|
;; (display x)
|
||||||
;; (newline)
|
;; (newline)
|
||||||
(cond
|
(cond
|
||||||
((atom fn)
|
((atom? fn)
|
||||||
(cond
|
(cond
|
||||||
((eq fn 'current-module) ;; FIXME
|
((eq? fn 'current-module) ;; FIXME
|
||||||
(c:apply current-module '() a))
|
(c:apply current-module '() a))
|
||||||
((builtin fn)
|
((builtin? fn)
|
||||||
(call fn x))
|
(call fn x))
|
||||||
(#t (apply (eval fn a) x a))))
|
(#t (apply (eval fn a) x a))))
|
||||||
((eq (car fn) 'lambda)
|
((eq? (car fn) 'lambda)
|
||||||
(cond ((null (cdr (cddr fn)))
|
(cond ((null? (cdr (cddr fn)))
|
||||||
(eval (caddr fn) (pairlis (cadr fn) x a)))
|
(eval (caddr fn) (pairlis (cadr fn) x a)))
|
||||||
(#t
|
(#t
|
||||||
(eval (caddr fn) (pairlis (cadr fn) x a))
|
(eval (caddr fn) (pairlis (cadr fn) x a))
|
||||||
(apply (cons (car fn) (cons (cadr fn) (cdddr fn)))
|
(apply (cons (car fn) (cons (cadr fn) (cdddr fn)))
|
||||||
x
|
x
|
||||||
(pairlis (cadr fn) x a)))))
|
(pairlis (cadr fn) x a)))))
|
||||||
((eq (car fn) 'label) (apply (caddr fn) x (cons (cons (cadr fn)
|
((eq? (car fn) 'label) (apply (caddr fn) x (cons (cons (cadr fn)
|
||||||
(caddr fn)) a)))))
|
(caddr fn)) a)))))
|
||||||
|
|
||||||
(define (eval e a)
|
(define (eval e a)
|
||||||
;;(debug "eval e=~a a=~a\n" e a)
|
;;(debug "eval e=~a a=~a\n" e a)
|
||||||
;;(debug "eval (atom ~a)=~a\n" e (atom e))
|
;;(debug "eval (atom? ~a)=~a\n" e (atom? e))
|
||||||
;; (display 'mes-eval:)
|
;; (display 'mes-eval:)
|
||||||
;; (display e)
|
;; (display e)
|
||||||
;; (newline)
|
;; (newline)
|
||||||
|
@ -118,19 +118,19 @@
|
||||||
;; (display a)
|
;; (display a)
|
||||||
;; (newline)
|
;; (newline)
|
||||||
(cond
|
(cond
|
||||||
((number e) e)
|
((number? e) e)
|
||||||
((eq e #t) #t)
|
((eq? e #t) #t)
|
||||||
((eq e #f) #f)
|
((eq? e #f) #f)
|
||||||
((atom e) (cdr (assoc e a)))
|
((atom? e) (cdr (assoc e a)))
|
||||||
((builtin e) e)
|
((builtin? e) e)
|
||||||
((atom (car e))
|
((atom? (car e))
|
||||||
(cond
|
(cond
|
||||||
((eq (car e) 'quote) (cadr e))
|
((eq? (car e) 'quote) (cadr e))
|
||||||
((eq (car e) 'lambda) e)
|
((eq? (car e) 'lambda) e)
|
||||||
((eq (car e) 'unquote) (eval (cadr e) a))
|
((eq? (car e) 'unquote) (eval (cadr e) a))
|
||||||
((eq (car e) 'quasiquote) (eval-quasiquote (cadr e) a))
|
((eq? (car e) 'quasiquote) (eval-quasiquote (cadr e) a))
|
||||||
((eq (car e) 'cond) (evcon (cdr e) a))
|
((eq? (car e) 'cond) (evcon (cdr e) a))
|
||||||
((pair (assoc (car e) (cdr (assoc '*macro* a))))
|
((pair? (assoc (car e) (cdr (assoc '*macro* a))))
|
||||||
(c:eval
|
(c:eval
|
||||||
(c:apply
|
(c:apply
|
||||||
(cdr (assoc (car e) (cdr (assoc '*macro* a))))
|
(cdr (assoc (car e) (cdr (assoc '*macro* a))))
|
||||||
|
@ -144,12 +144,12 @@
|
||||||
;; (display 'mes-eval-quasiquote:)
|
;; (display 'mes-eval-quasiquote:)
|
||||||
;; (display e)
|
;; (display e)
|
||||||
;; (newline)
|
;; (newline)
|
||||||
(cond ((null e) e)
|
(cond ((null? e) e)
|
||||||
((atom e) e)
|
((atom? e) e)
|
||||||
((atom (car e)) (cons (car e) (eval-quasiquote (cdr e) a)))
|
((atom? (car e)) (cons (car e) (eval-quasiquote (cdr e) a)))
|
||||||
((eq (caar e) 'unquote) (cons (eval (cadar e) a) '()))
|
((eq? (caar e) 'unquote) (cons (eval (cadar e) a) '()))
|
||||||
((eq (caar e) 'quote) (cons (cadar e) '()))
|
((eq? (caar e) 'quote) (cons (cadar e) '()))
|
||||||
((eq (caar e) 'quasiquote) (cons (cadar e) '()))
|
((eq? (caar e) 'quasiquote) (cons (cadar e) '()))
|
||||||
(#t (cons (car e) (eval-quasiquote (cdr e) a)))))
|
(#t (cons (car e) (eval-quasiquote (cdr e) a)))))
|
||||||
|
|
||||||
;; readenv et al works, but slows down dramatically
|
;; readenv et al works, but slows down dramatically
|
||||||
|
@ -160,31 +160,31 @@
|
||||||
;; (display 'mes-readword:)
|
;; (display 'mes-readword:)
|
||||||
;; (display c)
|
;; (display c)
|
||||||
;; (newline)
|
;; (newline)
|
||||||
(cond ((eq c -1) ;; eof
|
(cond ((eq? c -1) ;; eof
|
||||||
(cond ((eq w '()) '())
|
(cond ((eq? w '()) '())
|
||||||
(#t (lookup w a))))
|
(#t (lookup w a))))
|
||||||
((eq c 10) ;; \n
|
((eq? c 10) ;; \n
|
||||||
(cond ((eq w '()) (readword (getchar) w a))
|
(cond ((eq? w '()) (readword (getchar) w a))
|
||||||
;; DOT ((eq w '(*dot*)) (car (readword (getchar) '() a)))
|
;; DOT ((eq? w '(*dot*)) (car (readword (getchar) '() a)))
|
||||||
(#t (lookup w a))))
|
(#t (lookup w a))))
|
||||||
((eq c 32) ;; \space
|
((eq? c 32) ;; \space
|
||||||
(readword 10 w a))
|
(readword 10 w a))
|
||||||
((eq c 40) ;; (
|
((eq? c 40) ;; (
|
||||||
(cond ((eq w '()) (readlis a))
|
(cond ((eq? w '()) (readlis a))
|
||||||
(#t (ungetchar c) (lookup w a))))
|
(#t (ungetchar c) (lookup w a))))
|
||||||
((eq c 41) ;; )
|
((eq? c 41) ;; )
|
||||||
(cond ((eq w '()) (ungetchar c) w)
|
(cond ((eq? w '()) (ungetchar c) w)
|
||||||
(#t (ungetchar c) (lookup w a))))
|
(#t (ungetchar c) (lookup w a))))
|
||||||
((eq c 39) ;; '
|
((eq? c 39) ;; '
|
||||||
(cond ((eq w '())
|
(cond ((eq? w '())
|
||||||
(cons (lookup (cons c '()) a)
|
(cons (lookup (cons c '()) a)
|
||||||
(cons (readword (getchar) w a) '())))
|
(cons (readword (getchar) w a) '())))
|
||||||
(#t (ungetchar c) (lookup w a))))
|
(#t (ungetchar c) (lookup w a))))
|
||||||
((eq c 59) ;; ;
|
((eq? c 59) ;; ;
|
||||||
(readcomment c)
|
(readcomment c)
|
||||||
(readword 10 w a))
|
(readword 10 w a))
|
||||||
((eq c 35) ;; #
|
((eq? c 35) ;; #
|
||||||
(cond ((eq (peekchar) 33) ;; !
|
(cond ((eq? (peekchar) 33) ;; !
|
||||||
(getchar)
|
(getchar)
|
||||||
(readblock (getchar))
|
(readblock (getchar))
|
||||||
(readword 10 w a))
|
(readword 10 w a))
|
||||||
|
@ -195,27 +195,27 @@
|
||||||
;; (display 'mes-readblock:)
|
;; (display 'mes-readblock:)
|
||||||
;; (display c)
|
;; (display c)
|
||||||
;; (newline)
|
;; (newline)
|
||||||
(cond ((eq c 33) (cond ((eq (peekchar) 35) (getchar))
|
(cond ((eq? c 33) (cond ((eq? (peekchar) 35) (getchar))
|
||||||
(#t (readblock (getchar)))))
|
(#t (readblock (getchar)))))
|
||||||
(#t (readblock (getchar)))))
|
(#t (readblock (getchar)))))
|
||||||
|
|
||||||
(define (eat-whitespace)
|
(define (eat-whitespace)
|
||||||
(cond ((eq (peekchar) 10) (getchar) (eat-whitespace))
|
(cond ((eq? (peekchar) 10) (getchar) (eat-whitespace))
|
||||||
((eq (peekchar) 32) (getchar) (eat-whitespace))
|
((eq? (peekchar) 32) (getchar) (eat-whitespace))
|
||||||
((eq (peekchar) 35) (getchar) (eat-whitespace))
|
((eq? (peekchar) 35) (getchar) (eat-whitespace))
|
||||||
(#t #t)))
|
(#t #t)))
|
||||||
|
|
||||||
(define (readlis a)
|
(define (readlis a)
|
||||||
;; (display 'mes-readlis:)
|
;; (display 'mes-readlis:)
|
||||||
;; (newline)
|
;; (newline)
|
||||||
(eat-whitespace)
|
(eat-whitespace)
|
||||||
(cond ((eq (peekchar) 41) ;; )
|
(cond ((eq? (peekchar) 41) ;; )
|
||||||
(getchar)
|
(getchar)
|
||||||
'())
|
'())
|
||||||
;; TODO *dot*
|
;; TODO *dot*
|
||||||
(#t (cons (readword (getchar) '() a) (readlis a)))))
|
(#t (cons (readword (getchar) '() a) (readlis a)))))
|
||||||
|
|
||||||
(define (readcomment c)
|
(define (readcomment c)
|
||||||
(cond ((eq c 10) ;; \n
|
(cond ((eq? c 10) ;; \n
|
||||||
c)
|
c)
|
||||||
(#t (readcomment (getchar)))))
|
(#t (readcomment (getchar)))))
|
||||||
|
|
54
mes.scm
54
mes.scm
|
@ -81,7 +81,7 @@ exec guile -L $(pwd) -e '(mes)' -s "$0" "$@"
|
||||||
;;(define debug stderr)
|
;;(define debug stderr)
|
||||||
|
|
||||||
;; TODO
|
;; TODO
|
||||||
(define (atom x)
|
(define (atom? x)
|
||||||
(cond
|
(cond
|
||||||
((guile:pair? x) #f)
|
((guile:pair? x) #f)
|
||||||
((guile:null? x) #f)
|
((guile:null? x) #f)
|
||||||
|
@ -91,17 +91,33 @@ exec guile -L $(pwd) -e '(mes)' -s "$0" "$@"
|
||||||
(define car guile:car)
|
(define car guile:car)
|
||||||
(define cdr guile:cdr)
|
(define cdr guile:cdr)
|
||||||
(define cons guile:cons)
|
(define cons guile:cons)
|
||||||
(define eq guile:eq?)
|
(define eq? guile:eq?)
|
||||||
(define null guile:null?)
|
(define null? guile:null?)
|
||||||
(define pair guile:pair?)
|
(define pair? guile:pair?)
|
||||||
(define builtin guile:procedure?)
|
(define builtin? guile:procedure?)
|
||||||
(define number guile:number?)
|
(define number? guile:number?)
|
||||||
(define call guile:apply)
|
(define call guile:apply)
|
||||||
|
|
||||||
(include "mes.mes")
|
(include "mes.mes")
|
||||||
|
|
||||||
|
(define (pairlis x y a)
|
||||||
|
;;(debug "pairlis x=~a y=~a a=~a\n" x y a)
|
||||||
|
(cond
|
||||||
|
((null? x) a)
|
||||||
|
((atom? x) (cons (cons x y) a))
|
||||||
|
(#t (cons (cons (car x) (car y))
|
||||||
|
(pairlis (cdr x) (cdr y) a)))))
|
||||||
|
|
||||||
|
(define (assoc x a)
|
||||||
|
;;(stderr "assoc x=~a\n" x)
|
||||||
|
;;(debug "assoc x=~a a=~a\n" x a)
|
||||||
|
(cond
|
||||||
|
((null? a) #f)
|
||||||
|
((eq? (caar a) x) (car a))
|
||||||
|
(#t (assoc x (cdr a)))))
|
||||||
|
|
||||||
(define (append x y)
|
(define (append x y)
|
||||||
(cond ((null x) y)
|
(cond ((null? x) y)
|
||||||
(#t (cons (car x) (append (cdr x) y)))))
|
(#t (cons (car x) (append (cdr x) y)))))
|
||||||
|
|
||||||
(define (eval-environment e a)
|
(define (eval-environment e a)
|
||||||
|
@ -123,15 +139,15 @@ exec guile -L $(pwd) -e '(mes)' -s "$0" "$@"
|
||||||
|
|
||||||
(*unspecified* . ,*unspecified*)
|
(*unspecified* . ,*unspecified*)
|
||||||
|
|
||||||
(atom . ,atom)
|
(atom? . ,atom?)
|
||||||
(car . ,car)
|
(car . ,car)
|
||||||
(cdr . ,cdr)
|
(cdr . ,cdr)
|
||||||
(cons . ,cons)
|
(cons . ,cons)
|
||||||
(cond . ,evcon)
|
(cond . ,evcon)
|
||||||
(eq . ,eq)
|
(eq? . ,eq?)
|
||||||
|
|
||||||
(null . ,null)
|
(null? . ,null?)
|
||||||
(pair . ,guile:pair?)
|
(pair? . ,guile:pair?)
|
||||||
;;(quote . ,quote)
|
;;(quote . ,quote)
|
||||||
|
|
||||||
(evlis . ,evlis)
|
(evlis . ,evlis)
|
||||||
|
@ -146,8 +162,8 @@ exec guile -L $(pwd) -e '(mes)' -s "$0" "$@"
|
||||||
(display . ,guile:display)
|
(display . ,guile:display)
|
||||||
(newline . ,guile:newline)
|
(newline . ,guile:newline)
|
||||||
|
|
||||||
(builtin . ,builtin)
|
(builtin? . ,builtin?)
|
||||||
(number . ,number)
|
(number? . ,number?)
|
||||||
(call . ,call)
|
(call . ,call)
|
||||||
|
|
||||||
(< . ,guile:<)
|
(< . ,guile:<)
|
||||||
|
@ -177,7 +193,7 @@ exec guile -L $(pwd) -e '(mes)' -s "$0" "$@"
|
||||||
(cons (caadr x) (cons 'lambda (cons (cdadr x) (cddr x)))))
|
(cons (caadr x) (cons 'lambda (cons (cdadr x) (cddr x)))))
|
||||||
|
|
||||||
(define (mes-define x a)
|
(define (mes-define x a)
|
||||||
(if (atom (cadr x))
|
(if (atom? (cadr x))
|
||||||
(cons (cadr x) (eval (caddr x) a))
|
(cons (cadr x) (eval (caddr x) a))
|
||||||
(mes-define-lambda x a)))
|
(mes-define-lambda x a)))
|
||||||
|
|
||||||
|
@ -187,15 +203,15 @@ exec guile -L $(pwd) -e '(mes)' -s "$0" "$@"
|
||||||
(cdr (assoc '*macro* a)))))
|
(cdr (assoc '*macro* a)))))
|
||||||
|
|
||||||
(define (loop r e a)
|
(define (loop r e a)
|
||||||
(cond ((null e) r)
|
(cond ((null? e) r)
|
||||||
((eq e 'exit)
|
((eq? e 'exit)
|
||||||
(apply (cdr (assoc 'loop a))
|
(apply (cdr (assoc 'loop a))
|
||||||
(cons *unspecified* (cons #t (cons a '())))
|
(cons *unspecified* (cons #t (cons a '())))
|
||||||
a))
|
a))
|
||||||
((atom e) (loop (eval e a) (readenv a) a))
|
((atom? e) (loop (eval e a) (readenv a) a))
|
||||||
((eq (car e) 'define)
|
((eq? (car e) 'define)
|
||||||
(loop *unspecified* (readenv a) (cons (mes-define e a) a)))
|
(loop *unspecified* (readenv a) (cons (mes-define e a) a)))
|
||||||
((eq (car e) 'define-macro)
|
((eq? (car e) 'define-macro)
|
||||||
(loop *unspecified* (readenv a) (cons (mes-define-macro e a) a)))
|
(loop *unspecified* (readenv a) (cons (mes-define-macro e a) a)))
|
||||||
(#t (loop (eval e a) (readenv a) a))))
|
(#t (loop (eval e a) (readenv a) a))))
|
||||||
|
|
||||||
|
|
24
scm.mes
24
scm.mes
|
@ -24,7 +24,7 @@
|
||||||
(define (list . rest) rest)
|
(define (list . rest) rest)
|
||||||
|
|
||||||
(define (scm-define x a)
|
(define (scm-define x a)
|
||||||
(cond ((atom (cadr x)) (cons (cadr x) (eval (caddr x) a)))
|
(cond ((atom? (cadr x)) (cons (cadr x) (eval (caddr x) a)))
|
||||||
(#t (cons (caadr x) (cons 'lambda (cons (cdadr x) (cddr x)))))))
|
(#t (cons (caadr x) (cons 'lambda (cons (cdadr x) (cddr x)))))))
|
||||||
|
|
||||||
(define (scm-define-macro x a)
|
(define (scm-define-macro x a)
|
||||||
|
@ -38,15 +38,15 @@
|
||||||
;; (display 'e:)
|
;; (display 'e:)
|
||||||
;; (display e)
|
;; (display e)
|
||||||
;; (newline)
|
;; (newline)
|
||||||
(cond ((null e) r)
|
(cond ((null? e) r)
|
||||||
((eq e 'EOF2)
|
((eq? e 'EOF2)
|
||||||
(display 'loop2-exiting...)
|
(display 'loop2-exiting...)
|
||||||
(newline))
|
(newline))
|
||||||
((atom e)
|
((atom? e)
|
||||||
(loop2 (eval e a) (readenv a) a))
|
(loop2 (eval e a) (readenv a) a))
|
||||||
((eq (car e) 'define)
|
((eq? (car e) 'define)
|
||||||
(loop2 *unspecified* (readenv a) (cons (scm-define e a) a)))
|
(loop2 *unspecified* (readenv a) (cons (scm-define e a) a)))
|
||||||
((eq (car e) 'define-macro)
|
((eq? (car e) 'define-macro)
|
||||||
(loop2 *unspecified* (readenv a) (cons (scm-define-macro e a) a)))
|
(loop2 *unspecified* (readenv a) (cons (scm-define-macro e a) a)))
|
||||||
|
|
||||||
(#t (loop2 (eval e a) (readenv a) a))
|
(#t (loop2 (eval e a) (readenv a) a))
|
||||||
|
@ -68,12 +68,12 @@ EOF
|
||||||
(#t y)))
|
(#t y)))
|
||||||
|
|
||||||
(define (split-params bindings params)
|
(define (split-params bindings params)
|
||||||
(cond ((null bindings) params)
|
(cond ((null? bindings) params)
|
||||||
(#t (split-params (cdr bindings)
|
(#t (split-params (cdr bindings)
|
||||||
(append params (cons (caar bindings) '()))))))
|
(append params (cons (caar bindings) '()))))))
|
||||||
|
|
||||||
(define (split-values bindings values)
|
(define (split-values bindings values)
|
||||||
(cond ((null bindings) values)
|
(cond ((null? bindings) values)
|
||||||
(#t (split-values (cdr bindings)
|
(#t (split-values (cdr bindings)
|
||||||
(append values (cdar bindings) '())))))
|
(append values (cdar bindings) '())))))
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ EOF
|
||||||
(split-values bindings '())))
|
(split-values bindings '())))
|
||||||
|
|
||||||
(define (expand-let* bindings body)
|
(define (expand-let* bindings body)
|
||||||
(cond ((null bindings)
|
(cond ((null? bindings)
|
||||||
(cons (cons 'lambda (cons '() body)) '()))
|
(cons (cons 'lambda (cons '() body)) '()))
|
||||||
(#t
|
(#t
|
||||||
(cons
|
(cons
|
||||||
|
@ -94,7 +94,7 @@ EOF
|
||||||
(expand-let* bindings body))
|
(expand-let* bindings body))
|
||||||
|
|
||||||
(define (map f l . r)
|
(define (map f l . r)
|
||||||
(cond ((null l) '())
|
(cond ((null? l) '())
|
||||||
((null r) (cons (f (car l)) (map f (cdr l))))
|
((null? r) (cons (f (car l)) (map f (cdr l))))
|
||||||
((null (cdr r))
|
((null? (cdr r))
|
||||||
(cons (f (car l) (caar r)) (map f (cdr l) (cdar r))))))
|
(cons (f (car l) (caar r)) (map f (cdr l) (cdar r))))))
|
||||||
|
|
Loading…
Reference in a new issue