core: Integrate garbage collector/jam scraper.

* mes.c (r0, r1, r2, r3, stack):  New globals.
  (gc_loop): Handle MACRO and SCM.
  (gc_copy): Handle FUNCTION, allow for pre-allocated SCM and SYMBOL.
  (assq): Flag any BROKEN_HEARTs.
  (vm_call): New function.  Enables moving C stack to GC stack.
  (evlis_env, apply_env, eval_env, expand_macro_env, begin_env,
  if_env): Use vm_call-indirection.
  (call_lambda): New function.
  (vm_apply_env): Rename from apply_env.  Remove parameters, instead
  use r1, r2 and r0.
  (vm_evlis_env, vm_eval_env, vm_expand_macro_env, vm_begin_env,
  vm_if_env): Likewise.
  (acons): New function.
  (mes_environment) [!MES_FULL, MES_MINI]: Add cpp switches to create minimally
  filled environment, for debugging.
  (main): Print free value at exit.
* define.c (define_env): Use vm_call-indirection.
  (vm_define_env): Rename from define_env.
* quasiquote.c (eval_quasiquote): Use vm_call-indirection.
  (vm_eval_quasiquote): Rename from eval_quasiquote.
* tests/gc-2.test: New test.
  tests/gc-2a.test: New test.
  tests/gc-3.test: New test.
This commit is contained in:
Jan Nieuwenhuizen 2016-10-28 18:42:03 +02:00
parent c035a59094
commit 25c29ecb6d
9 changed files with 1294 additions and 174 deletions

View file

@ -20,33 +20,41 @@
#if !BOOT #if !BOOT
scm * scm *
define_env (scm *x, scm *a) define_env (scm *e, scm *a)
{ {
scm *e; return vm_call (vm_define_env, e, &scm_undefined, a);
scm *name = cadr (x); }
scm *
vm_define_env ()
{
scm *x;
scm *name = cadr (r1);
if (name->type != PAIR) if (name->type != PAIR)
e = eval_env (caddr (x), cons (cons (cadr (x), cadr (x)), a)); x = eval_env (caddr (r1), cons (cons (cadr (r1), cadr (r1)), r0));
else { else {
name = car (name); name = car (name);
scm *p = pairlis (cadr (x), cadr (x), a); scm *p = pairlis (cadr (r1), cadr (r1), r0);
cache_invalidate_range (p, a); cache_invalidate_range (p, r0);
e = eval_env (make_lambda (cdadr (x), cddr (x)), p); x = eval_env (make_lambda (cdadr (r1), cddr (r1)), p);
} }
if (eq_p (car (x), &symbol_define_macro) == &scm_t) if (eq_p (car (r1), &symbol_define_macro) == &scm_t)
e = make_macro (name, e); x = make_macro (name, x);
scm *entry = cons (name, e);
scm *entry = cons (name, x);
scm *aa = cons (entry, &scm_nil); scm *aa = cons (entry, &scm_nil);
set_cdr_x (aa, cdr (a)); set_cdr_x (aa, cdr (r0));
set_cdr_x (a, aa); set_cdr_x (r0, aa);
scm *cl = assq (&scm_closure, a); scm *cl = assq (&scm_closure, r0);
set_cdr_x (cl, aa); set_cdr_x (cl, aa);
return entry; return entry;
} }
#else // BOOT #else // BOOT
scm*define_env (scm *x, scm *a){} scm*define_env (scm *r1, scm *a){}
scm*vm_define_env (scm *r1, scm *a){}
#endif #endif
scm * scm *
define_macro (scm *x, scm *a) define_macro (scm *r1, scm *a)
{ {
} }

1
lib.c
View file

@ -29,6 +29,7 @@ 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 *cadddr (scm *x) {return car (cdr (cdr (cdr (x))));}
scm * scm *
length (scm *x) length (scm *x)

463
mes.c
View file

@ -30,19 +30,29 @@
#define DEBUG 0 #define DEBUG 0
#define QUASIQUOTE 1 #define QUASIQUOTE 1
//#define QUASISYNTAX 0 //#define QUASISYNTAX 0
#define GC 1 #define GC 1
#if GC // call gc from builtin_eval () -- dumps core #define MES_FULL 1
//int ARENA_SIZE = 1024 * 1024 * 1024; #define MES_MINI 0 // 1 for gc-2a.test, gc-3.test
/* 28000 cells triggers a gc for mes-check just afre passing the first test */
int ARENA_SIZE = 28000; // sizeof(scm) = 24 #if MES_FULL
int ARENA_SIZE = 300000000; // need this much for tests/match.scm
//int ARENA_SIZE = 30000000; // need this much for tests/record.scm
//int ARENA_SIZE = 500000; // enough for tests/scm.test
//int ARENA_SIZE = 60000; // enough for tests/base.test
int GC_SAFETY = 10000;
int GC_FREE = 20000;
#else
// just enough for empty environment and tests/gc-2.test.
//int ARENA_SIZE = 7500; // gc-3.test, gc-2a.test
//int ARENA_SIZE = 10000; // gc-2a.test
int ARENA_SIZE = 18000; // gc-2.test -->KRAK
//int ARENA_SIZE = 23000; // gc-2.test OK
int GC_SAFETY = 1000; int GC_SAFETY = 1000;
#else // testing int GC_FREE = 1000;
int ARENA_SIZE = 11;
int GC_SAFETY = 0;
#endif #endif
enum type {CHAR, FUNCTION, MACRO, NUMBER, PAIR, SCM, STRING, SYMBOL, REF, VALUES, VECTOR, BROKEN_HEART}; enum type {CHAR, FUNCTION, MACRO, NUMBER, PAIR, SCM, STRING, SYMBOL, REF, VALUES, VECTOR, BROKEN_HEART};
typedef struct scm_t* (*function0_t) (void); typedef struct scm_t* (*function0_t) (void);
typedef struct scm_t* (*function1_t) (struct scm_t*); typedef struct scm_t* (*function1_t) (struct scm_t*);
typedef struct scm_t* (*function2_t) (struct scm_t*, struct scm_t*); typedef struct scm_t* (*function2_t) (struct scm_t*, struct scm_t*);
@ -90,6 +100,13 @@ typedef struct scm_t {
scm *display_ (FILE* f, scm *x); scm *display_ (FILE* f, scm *x);
scm *display_helper (FILE*, scm*, bool, char const*, bool); scm *display_helper (FILE*, scm*, bool, char const*, bool);
scm *symbols = 0;
scm *stack = 0;
scm *r0 = 0; // a/env
scm *r1 = 0; // param 1
scm *r2 = 0; // param 2
scm *r3 = 0; // param 3
scm scm_nil = {SCM, "()"}; scm scm_nil = {SCM, "()"};
scm scm_dot = {SCM, "."}; scm scm_dot = {SCM, "."};
scm scm_f = {SCM, "#f"}; scm scm_f = {SCM, "#f"};
@ -102,7 +119,7 @@ scm scm_circular = {SCM, "*circular*"};
scm scm_label = { scm scm_label = {
SCM, "label"}; SCM, "label"};
#endif #endif
scm scm_begin = {SCM, "begin"}; scm scm_begin = {SCM, "*begin*"};
scm symbol_lambda = {SYMBOL, "lambda"}; scm symbol_lambda = {SYMBOL, "lambda"};
scm symbol_begin = {SYMBOL, "begin"}; scm symbol_begin = {SYMBOL, "begin"};
@ -162,8 +179,6 @@ scm *
alloc (int n) alloc (int n)
{ {
#if GC #if GC
// haha, where are we going to get our root, i.e., a=environment?
//if (g_free - g_cells + n >= ARENA_SIZE) gc ();
assert (g_free.value + n < ARENA_SIZE); assert (g_free.value + n < ARENA_SIZE);
scm* x = &g_cells[g_free.value]; scm* x = &g_cells[g_free.value];
g_free.value += n; g_free.value += n;
@ -185,33 +200,36 @@ gc_alloc (int n)
scm * scm *
gc (scm *a) gc (scm *a)
{ {
fprintf (stderr, "***GC***\n"); fprintf (stderr, "***gc[%d]...", g_free.value);
g_free.value = 0; g_free.value = 0;
//gc_show (); scm *new = gc_copy (stack);
scm *new = gc_copy (a); gc_copy (symbols);
return gc_loop (new); return gc_loop (new);
} }
scm * scm *
gc_loop (scm *new) gc_loop (scm *scan)
{ {
while (new - g_news < g_free.value) while (scan - g_news < g_free.value)
{ {
//gc_show (); if (scan->type == MACRO
if (new->type == PAIR || scan->type == PAIR
|| new->type == REF || scan->type == REF
|| new->type == STRING || (scan->type == SCM && scan->car->type == PAIR)
|| new->type == SYMBOL) || (scan->type == STRING && scan->car->type == PAIR)
|| (scan->type == SYMBOL && scan->car->type == PAIR))
{ {
scm *car = gc_copy (new->car); scm *car = gc_copy (scan->car);
gc_relocate_car (new, car); gc_relocate_car (scan, car);
} }
if (new->type == PAIR) if ((scan->type == MACRO
|| scan->type == PAIR)
&& scan->cdr) // allow for 0 terminated list of symbols
{ {
scm *cdr = gc_copy (new->cdr); scm *cdr = gc_copy (scan->cdr);
gc_relocate_cdr (new, cdr); gc_relocate_cdr (scan, cdr);
} }
new++; scan++;
} }
return gc_flip (); return gc_flip ();
} }
@ -220,7 +238,9 @@ scm *
gc_copy (scm *old) gc_copy (scm *old)
{ {
if (old->type == BROKEN_HEART) return old->car; if (old->type == BROKEN_HEART) return old->car;
if (old->type == FUNCTION) return old;
if (old->type == SCM) return old; if (old->type == SCM) return old;
if (old < g_cells && old < g_news) return old;
scm *new = &g_news[g_free.value++]; scm *new = &g_news[g_free.value++];
*new = *old; *new = *old;
if (new->type == VECTOR) if (new->type == VECTOR)
@ -231,12 +251,6 @@ gc_copy (scm *old)
return new; return new;
} }
scm *
gc_move (scm* dest, scm *src)
{
*dest = *src;
}
scm * scm *
gc_relocate_car (scm *new, scm *car) gc_relocate_car (scm *new, scm *car)
{ {
@ -259,6 +273,24 @@ gc_flip ()
g_news = cells; g_news = cells;
(g_cells-1)->vector = g_news; (g_cells-1)->vector = g_news;
(g_news-1)->vector = g_cells; (g_news-1)->vector = g_cells;
fprintf (stderr, " => jam[%d]\n", g_free.value);
// Reduce arena size to quickly get multiple GC's.
// Startup memory footprint is relatively high because of builtin
// function names
//ARENA_SIZE = g_free.value + GC_FREE + GC_SAFETY;
// fprintf (stderr, "ARENA SIZE => %d\n", ARENA_SIZE - GC_SAFETY);
symbols = &g_cells[1];
return &g_cells[0];
}
scm *
gc_bump ()
{
g_cells += g_free.value;
g_news += g_free.value;
ARENA_SIZE -= g_free.value;
g_free.value = 0;
return &scm_unspecified; return &scm_unspecified;
} }
@ -391,7 +423,12 @@ pairlis (scm *x, scm *y, scm *a)
scm * scm *
assq (scm *x, scm *a) assq (scm *x, scm *a)
{ {
while (a != &scm_nil && eq_p (x, a->car->car) == &scm_f) a = a->cdr; while (a != &scm_nil && eq_p (x, a->car->car) == &scm_f)
{
if (a->type == BROKEN_HEART || a->car->type == BROKEN_HEART)
fprintf (stderr, "oops, broken heart\n");
a = a->cdr;
}
return a != &scm_nil ? a->car : &scm_f; return a != &scm_nil ? a->car : &scm_f;
} }
@ -501,48 +538,145 @@ assert_defined (scm *x, scm *e)
return e; return e;
} }
scm *
vm_call (function0_t f, scm *p1, scm *p2, scm *a)
{
scm *frame = cons (r1, cons (r2, cons (r3, cons (r0, &scm_nil))));
stack = cons (frame, stack);
r1 = p1;
r2 = p2;
r0 = a;
//if (f == vm_expand_macro_env && g_free.value + GC_SAFETY > ARENA_SIZE)
if (g_free.value + GC_SAFETY > ARENA_SIZE)
{
frame = cons (r1, cons (r2, cons (r3, cons (r0, &scm_nil))));
stack = cons (frame, stack);
scm *x = gc (stack);
*stack = *x;
frame = car (stack);
stack = cdr (stack);
r1 = car (frame);
r2 = cadr (frame);
r3 = caddr (frame);
r0 = cadddr (frame);
}
scm *r = f ();
frame = car (stack);
stack = cdr (stack);
r1 = car (frame);
r2 = cadr (frame);
r3 = caddr (frame);
r0 = cadddr (frame);
return r;
}
scm * scm *
evlis_env (scm *m, scm *a) evlis_env (scm *m, scm *a)
{ {
if (m == &scm_nil) return &scm_nil; return vm_call (vm_evlis_env, m, &scm_undefined, a);
if (m->type != PAIR) return eval_env (m, a);
scm *e = eval_env (car (m), a);
return cons (e, evlis_env (cdr (m), a));
} }
scm * scm *
apply_env (scm *fn, scm *x, scm *a) apply_env (scm *fn, scm *x, scm *a)
{ {
if (fn->type != PAIR) return vm_call (vm_apply_env, fn, x, a);
}
scm *
eval_env (scm *e, scm *a)
{ {
if (fn->type == FUNCTION) return call (fn, x); return vm_call (vm_eval_env, e, &scm_undefined, a);
if (fn == &symbol_call_with_values)
return call (&scm_call_with_values_env, append2 (x, cons (a, &scm_nil)));
if (fn == &symbol_current_module) return a;
} }
else if (fn->car == &symbol_lambda) {
scm *p = pairlis (cadr (fn), x, a); scm *
cache_invalidate_range (p, a->cdr); expand_macro_env (scm *e, scm *a)
scm *r = begin_env (cddr (fn), cons (cons (&scm_closure, p), p)); {
cache_invalidate_range (p, a->cdr); return vm_call (vm_expand_macro_env, e, &scm_undefined, a);
}
scm *
begin_env (scm *e, scm *a)
{
return vm_call (vm_begin_env, e, &scm_undefined, a);
}
scm *
if_env (scm *e, scm *a)
{
return vm_call (vm_if_env, e, &scm_undefined, a);
}
scm *
call_lambda (scm *e, scm *x, scm* aa, scm *a) ///((internal))
{
scm *cl = cons (cons (&scm_closure, x), x);
r1 = e;
r0 = cl;
r2 = a;
r3 = aa;
cache_invalidate_range (r0, r3->cdr);
scm *r = vm_call_lambda ();
cache_invalidate_range (r0, r3->cdr);
return r; return r;
} }
else if (fn->car == &scm_closure) {
scm *args = caddr (fn); scm *
scm *body = cdddr (fn); vm_evlis_env ()
a = cdadr (fn); {
a = cdr (a); if (r1 == &scm_nil) return &scm_nil;
scm *p = pairlis (args, x, a); if (r1->type != PAIR) return eval_env (r1, r0);
cache_invalidate_range (p, a->cdr); r2 = eval_env (car (r1), r0);
scm *r = begin_env (body, cons (cons (&scm_closure, p), p)); r1 = evlis_env (cdr (r1), r0);
cache_invalidate_range (p, a->cdr); return cons (r2, r1);
return r; }
scm *
vm_call_lambda ()
{
return vm_call (vm_begin_env, r1, &scm_undefined, r0);
}
scm *
vm_apply_env ()
{
if (r1->type != PAIR)
{
if (r1->type == FUNCTION) return call (r1, r2);
if (r1 == &symbol_call_with_values)
return call (&scm_call_with_values_env, append2 (r2, cons (r0, &scm_nil)));
if (r1 == &symbol_current_module) return r0;
}
else if (r1->car == &symbol_lambda) {
scm *args = cadr (r1);
scm *body = cddr (r1);
scm *p = pairlis (args, r2, r0);
return call_lambda (body, p, p, r0);
// r2 = p;
// cache_invalidate_range (r2, r0->cdr);
// scm *r = begin_env (cddr (r1), cons (cons (&scm_closure, p), p));
// cache_invalidate_range (r2, r0->cdr);
// return r;
}
else if (r1->car == &scm_closure) {
scm *args = caddr (r1);
scm *body = cdddr (r1);
scm *aa = cdadr (r1);
aa = cdr (aa);
scm *p = pairlis (args, r2, aa);
return call_lambda (body, p, aa, r0);
// r2 = p;
// r3 = aa;
// cache_invalidate_range (r2, r3->cdr);
// scm *r = begin_env (body, cons (cons (&scm_closure, p), p));
// cache_invalidate_range (r2, r3->cdr);
// return r;
} }
#if BOOT #if BOOT
else if (fn->car == &scm_label) else if (r1->car == &scm_label)
return apply_env (caddr (fn), x, cons (cons (cadr (fn), caddr (fn)), a)); return apply_env (caddr (r1), r2, cons (cons (cadr (r1), caddr (r1)), r0));
#endif #endif
scm *e = eval_env (fn, a); scm *e = eval_env (r1, r0);
char const* type = 0; char const* type = 0;
if (e == &scm_f || e == &scm_t) type = "bool"; if (e == &scm_f || e == &scm_t) type = "bool";
if (e->type == CHAR) type = "char"; if (e->type == CHAR) type = "char";
@ -554,122 +688,129 @@ apply_env (scm *fn, scm *x, scm *a)
{ {
fprintf (stderr, "cannot apply: %s: ", type); fprintf (stderr, "cannot apply: %s: ", type);
display_ (stderr, e); display_ (stderr, e);
fprintf (stderr, " ("); fprintf (stderr, " [");
display_ (stderr, fn); display_ (stderr, r1);
fprintf (stderr, ")\n"); fprintf (stderr, "]\n");
assert (!"cannot apply"); assert (!"cannot apply");
} }
return apply_env (e, x, a); return apply_env (e, r2, r0);
} }
scm*cstring_to_list (char const* s);
scm * scm *
eval_env (scm *e, scm *a) vm_eval_env ()
{ {
#if GC switch (r1->type)
if (g_free.value + GC_SAFETY > ARENA_SIZE) gc (a);
#endif
switch (e->type)
{ {
case PAIR: case PAIR:
{ {
if (e->car == &symbol_quote) if (r1->car == &symbol_quote)
return cadr (e); return cadr (r1);
#if QUASISYNTAX #if QUASISYNTAX
if (e->car == &symbol_syntax) if (r1->car == &symbol_syntax)
return e; return r1;
#endif #endif
if (e->car == &symbol_begin) if (r1->car == &symbol_begin)
return begin_env (e, a); return begin_env (r1, r0);
if (e->car == &symbol_lambda) if (r1->car == &symbol_lambda)
return make_closure (cadr (e), cddr (e), assq (&scm_closure, a)); return make_closure (cadr (r1), cddr (r1), assq (&scm_closure, r0));
if (e->car == &scm_closure) if (r1->car == &scm_closure)
return e; return r1;
if (e->car == &symbol_if) if (r1->car == &symbol_if)
return builtin_if (cdr (e), a); return if_env (cdr (r1), r0);
#if !BOOT #if !BOOT
if (e->car == &symbol_define) if (r1->car == &symbol_define)
return define_env (e, a); return define_env (r1, r0);
if (e->car == &symbol_define_macro) if (r1->car == &symbol_define_macro)
return define_env (e, a); return define_env (r1, r0);
if (e->car == &symbol_primitive_load) if (r1->car == &symbol_primitive_load)
return load_env (a); return load_env (r0);
#else #else
if (e->car == &symbol_define) { if (r1->car == &symbol_define) {
fprintf (stderr, "C DEFINE: "); fprintf (stderr, "C DEFINE: ");
display_ (stderr, display_ (stderr,
e->cdr->car->type == SYMBOL r1->cdr->car->type == SYMBOL
? e->cdr->car->string ? r1->cdr->car->string
: e->cdr->car->car->string); : r1->cdr->car->car->string);
fprintf (stderr, "\n"); fprintf (stderr, "\n");
} }
assert (e->car != &symbol_define); assert (r1->car != &symbol_define);
assert (e->car != &symbol_define_macro); assert (r1->car != &symbol_define_macro);
#endif
#if 1 //!BOOT
if (r1->car == &symbol_set_x)
return set_env_x (cadr (r1), eval_env (caddr (r1), r0), r0);
#else
assert (r1->car != &symbol_set_x);
#endif #endif
if (e->car == &symbol_set_x)
return set_env_x (cadr (e), eval_env (caddr (e), a), a);
#if QUASIQUOTE #if QUASIQUOTE
if (e->car == &symbol_unquote) if (r1->car == &symbol_unquote)
return eval_env (cadr (e), a); return eval_env (cadr (r1), r0);
if (e->car == &symbol_quasiquote) if (r1->car == &symbol_quasiquote)
return eval_quasiquote (cadr (e), add_unquoters (a)); return eval_quasiquote (cadr (r1), add_unquoters (r0));
#endif //QUASIQUOTE #endif //QUASIQUOTE
#if QUASISYNTAX #if QUASISYNTAX
if (e->car == &symbol_unsyntax) if (r1->car == &symbol_unsyntax)
return eval_env (cadr (e), a); return eval_env (cadr (r1), r0);
if (e->car == &symbol_quasisyntax) if (r1->car == &symbol_quasisyntax)
return eval_quasisyntax (cadr (e), add_unsyntaxers (a)); return eval_quasisyntax (cadr (r1), add_unsyntaxers (r0));
#endif //QUASISYNTAX #endif //QUASISYNTAX
scm *x = expand_macro_env (e, a); scm *x = expand_macro_env (r1, r0);
if (x != e) return eval_env (x, a); if (x != r1)
return apply_env (e->car, evlis_env (e->cdr, a), a); return eval_env (x, r0);
scm *m = evlis_env (r1->cdr, r0);
return apply_env (r1->car, m, r0);
} }
case SYMBOL: return assert_defined (e, assq_ref_cache (e, a)); case SYMBOL: return assert_defined (r1, assq_ref_cache (r1, r0));
default: return e; default: return r1;
} }
} }
scm * scm *
expand_macro_env (scm *e, scm *a) vm_expand_macro_env ()
{ {
if (car (e)->type == STRING && string_to_symbol (car (e)) == &symbol_noexpand) if (car (r1)->type == STRING && string_to_symbol (car (r1)) == &symbol_noexpand)
return cadr (e); return cadr (r1);
scm *macro; scm *macro;
if (e->type == PAIR
&& (macro = lookup_macro (e->car, a)) != &scm_f)
return apply_env (macro, e->cdr, a);
scm *expanders; scm *expanders;
if (e->type == PAIR if (r1->type == PAIR
&& car (e)->type == SYMBOL && (macro = lookup_macro (r1->car, r0)) != &scm_f)
&& ((expanders = assq_ref_cache (&symbol_sc_expander_alist, a)) != &scm_undefined) return apply_env (macro, r1->cdr, r0);
&& ((macro = assq (car (e), expanders)) != &scm_f)) else if (r1->type == PAIR
&& car (r1)->type == SYMBOL
&& ((expanders = assq_ref_cache (&symbol_sc_expander_alist, r0)) != &scm_undefined)
&& ((macro = assq (car (r1), expanders)) != &scm_f))
{ {
scm *sc_expand = assq_ref_cache (&symbol_expand_macro, a); scm *sc_expand = assq_ref_cache (&symbol_expand_macro, r0);
if (sc_expand != &scm_undefined && sc_expand != &scm_f) if (sc_expand != &scm_undefined && sc_expand != &scm_f)
e = apply_env (sc_expand, cons (e, &scm_nil), a); r1 = apply_env (sc_expand, cons (r1, &scm_nil), r0);
} }
return e; return r1;
} }
scm * scm *
begin_env (scm *e, scm *a) vm_begin_env ()
{ {
scm *r = &scm_unspecified; scm *r = &scm_unspecified;
while (e != &scm_nil) { while (r1 != &scm_nil) {
r = eval_env (e->car, a); if (car (r1)->type == PAIR && caar (r1) == &symbol_begin)
e = e->cdr; r1 = append2 (cdar (r1), cdr (r1));
r = eval_env (r1->car, r0);
r1 = r1->cdr;
} }
return r; return r;
} }
scm * scm *
builtin_if (scm *e, scm *a) vm_if_env ()
{ {
if (eval_env (car (e), a) != &scm_f) scm *x = eval_env (car (r1), r0);
return eval_env (cadr (e), a); if (x != &scm_f)
if (cddr (e) != &scm_nil) return eval_env (cadr (r1), r0);
return eval_env (caddr (e), a); if (cddr (r1) != &scm_nil)
return eval_env (caddr (r1), r0);
return &scm_unspecified; return &scm_unspecified;
} }
@ -773,8 +914,6 @@ cstring_to_list (char const* s)
return p; return p;
} }
scm *symbols = 0;
scm * scm *
list_of_char_equal_p (scm *a, scm *b) list_of_char_equal_p (scm *a, scm *b)
{ {
@ -965,12 +1104,9 @@ force_output (scm *p) ///((arity . n))
fflush (f); fflush (f);
} }
int display_depth = 1000;
scm * scm *
display_helper (FILE* f, scm *x, bool cont, char const *sep, bool quote) display_helper (FILE* f, scm *x, bool cont, char const *sep, bool quote)
{ {
//if (!display_depth) return &scm_unspecified;
display_depth--;
scm *r; scm *r;
fprintf (f, "%s", sep); fprintf (f, "%s", sep);
switch (x->type) switch (x->type)
@ -1012,7 +1148,7 @@ display_helper (FILE* f, scm *x, bool cont, char const *sep, bool quote)
} }
if (!cont) fprintf (f, "("); if (!cont) fprintf (f, "(");
display_ (f, car (x)); display_ (f, car (x));
if (cdr (x)->type == PAIR) if (cdr (x) && cdr (x)->type == PAIR)
display_helper (f, cdr (x), true, " ", false); display_helper (f, cdr (x), true, " ", false);
else if (cdr (x) != &scm_nil) { else if (cdr (x) != &scm_nil) {
fprintf (f, " . "); fprintf (f, " . ");
@ -1271,10 +1407,16 @@ read_env (scm *a)
return readword (getchar (), &scm_nil, a); return readword (getchar (), &scm_nil, a);
} }
scm *
acons (scm *key, scm *value, scm *alist)
{
return cons (cons (key, value), alist);
}
scm * scm *
add_environment (scm *a, char const *name, scm *x) add_environment (scm *a, char const *name, scm *x)
{ {
return cons (cons (make_symbol (cstring_to_list (name)), x), a); return acons (make_symbol (cstring_to_list (name)), x, a);
} }
scm * scm *
@ -1292,9 +1434,11 @@ mes_environment () ///((internal))
g_news[0].length = ARENA_SIZE - 1; g_news[0].length = ARENA_SIZE - 1;
g_news[0].vector = &g_news[1]; g_news[0].vector = &g_news[1];
a = add_environment (a, "%free", &g_free); g_cells++;
a = add_environment (a, "%the-cells", g_cells++); g_news++;
a = add_environment (a, "%new-cells", g_news++); // a = add_environment (a, "%free", &g_free); hihi, gets <3 moved
// a = add_environment (a, "%the-cells", g_cells);
// a = add_environment (a, "%new-cells", g_news);
#include "mes.symbols.i" #include "mes.symbols.i"
@ -1304,6 +1448,7 @@ mes_environment () ///((internal))
#endif #endif
a = cons (cons (&symbol_begin, &scm_begin), a); a = cons (cons (&symbol_begin, &scm_begin), a);
#if MES_FULL
#include "posix.environment.i" #include "posix.environment.i"
#include "string.environment.i" #include "string.environment.i"
#include "math.environment.i" #include "math.environment.i"
@ -1312,10 +1457,43 @@ mes_environment () ///((internal))
//#include "quasiquote.environment.i" //#include "quasiquote.environment.i"
#include "define.environment.i" #include "define.environment.i"
#include "type.environment.i" #include "type.environment.i"
#else
a = add_environment (a, "cons", &scm_cons);
a = add_environment (a, "eq?", &scm_eq_p);
a = add_environment (a, "display", &scm_display);
a = add_environment (a, "newline", &scm_newline);
#if !MES_MINI
a = add_environment (a, "*", &scm_multiply);
a = add_environment (a, "list", &scm_list);
//
a = add_environment (a, "car", &scm_car);
a = add_environment (a, "cdr", &scm_cdr);
a = add_environment (a, "+", &scm_plus);
a = add_environment (a, "quote", &scm_quote);
a = add_environment (a, "null?", &scm_null_p);
a = add_environment (a, "=", &scm_is_p);
// a = add_environment (a, "gc", &scm_gc);
// a = add_environment (a, "apply-env", &scm_apply_env);
// a = add_environment (a, "eval-env", &scm_eval_env);
// a = add_environment (a, "cadr", &scm_cadr);
#endif
#endif
a = add_environment (a, "sc-expand", &scm_f); a = add_environment (a, "sc-expand", &scm_f);
a = cons (cons (&scm_closure, a), a); a = cons (cons (&scm_closure, a), a);
internal_lookup_symbol (&scm_nil);
gc_bump (); // secure the .string of builtins, scm and symbols
r0 = a;
r1 = make_char (0);
r2 = make_char (0);
r3 = make_char (0);
stack = cons (&scm_nil, &scm_nil);
return a; return a;
} }
@ -1370,5 +1548,6 @@ main (int argc, char *argv[])
scm *a = mes_environment (); scm *a = mes_environment ();
display_ (stderr, load_env (a)); display_ (stderr, load_env (a));
fputs ("", stderr); fputs ("", stderr);
fprintf (stderr, "\nstats: [%d]\n", g_free.value);
return 0; return 0;
} }

View file

@ -37,7 +37,7 @@
((label loop-0 ((label loop-0
(lambda (r e a) (lambda (r e a)
;; (display "***LOOP-0*** ... e=") (display e) (newline) ;; (display "***LOOP-0*** ... e=") (display e) (newline)
(if (null? e) (eval-env (cons 'begin (read-file-env (read-env a) a)) a) (if (null? e) (eval-env (cons 'begin (read-input-file-env (read-env a) a)) a)
(if (atom? e) (loop-0 (eval-env e a) (read-env a) a) (if (atom? e) (loop-0 (eval-env e a) (read-env a) a)
(if (eq? (car e) 'define) (if (eq? (car e) 'define)
((lambda (aa) ; env:define ((lambda (aa) ; env:define

View file

@ -36,14 +36,24 @@ unquote_splicing (scm *x) ///((no-environment))
scm * scm *
eval_quasiquote (scm *e, scm *a) eval_quasiquote (scm *e, scm *a)
{ {
if (e == &scm_nil) return e; return vm_call (vm_eval_quasiquote, e, &scm_undefined, a);
else if (atom_p (e) == &scm_t) return e; }
else if (eq_p (car (e), &symbol_unquote) == &scm_t)
return eval_env (cadr (e), a); scm *
else if (e->type == PAIR && e->car->type == PAIR vm_eval_quasiquote ()
&& eq_p (caar (e), &symbol_unquote_splicing) == &scm_t) {
return append2 (eval_env (cadar (e), a), eval_quasiquote (cdr (e), a)); if (r1 == &scm_nil) return r1;
return cons (eval_quasiquote (car (e), a), eval_quasiquote (cdr (e), a)); else if (atom_p (r1) == &scm_t) return r1;
else if (eq_p (car (r1), &symbol_unquote) == &scm_t)
return eval_env (cadr (r1), r0);
else if (r1->type == PAIR && r1->car->type == PAIR
&& eq_p (caar (r1), &symbol_unquote_splicing) == &scm_t)
{
r2 = eval_env (cadar (r1), r0);
return append2 (r2, eval_quasiquote (cdr (r1), r0));
}
r2 = eval_quasiquote (car (r1), r0);
return cons (r2, eval_quasiquote (cdr (r1), r0));
} }
scm * scm *

View file

@ -1,6 +1,5 @@
#! /bin/sh #! /bin/sh
# -*-scheme-*- # -*-scheme-*-
set -x
echo ' ()' | cat $($(dirname $0)/../scripts/include.mes $0) $0 /dev/stdin | $(dirname $0)/../scripts/mes "$@" echo ' ()' | cat $($(dirname $0)/../scripts/include.mes $0) $0 /dev/stdin | $(dirname $0)/../scripts/mes "$@"
#paredit:|| #paredit:||
exit $? exit $?
@ -37,12 +36,11 @@ exit $?
(pass-if "begin" (seq? (begin 'a 'b (+ 1 2)) 3)) (pass-if "begin" (seq? (begin 'a 'b (+ 1 2)) 3))
(pass-if "lambda" (symbol? 'lambda)) (pass-if "lambda" (symbol? 'lambda))
(begin (define *top-begin-a* '*top-begin-a*)) (define *top-define-a* '*top-define-a*)
(pass-if "top begin " (seq? *top-begin-a* '*top-begin-a*)) (pass-if "top define " (seq? *top-define-a* '*top-define-a*))
(begin (begin (define *top-begin-begin-a* '*top-begin-begin-a*)))
(pass-if "top begin begin " (seq? *top-begin-begin-a* '*top-begin-begin-a*))
(begin (define *top-begin-define-a* '*top-begin-define-a*))
(pass-if "top begin define " (seq? *top-begin-define-a* '*top-begin-define-a*))
(pass-if "if" (seq? (if #t 'true) 'true)) (pass-if "if" (seq? (if #t 'true) 'true))
(pass-if "if 2" (seq? (if #f #f) *unspecified*)) (pass-if "if 2" (seq? (if #f #f) *unspecified*))
(pass-if "if 3" (seq? (if (seq? 0 '0) 'true 'false) 'true)) (pass-if "if 3" (seq? (if (seq? 0 '0) 'true 'false) 'true))
@ -73,7 +71,6 @@ exit $?
(pass-if "apply" (sequal? (apply list '(1)) '(1))) (pass-if "apply" (sequal? (apply list '(1)) '(1)))
(pass-if "apply 2" (sequal? (apply list 1 '(2)) '(1 2))) (pass-if "apply 2" (sequal? (apply list 1 '(2)) '(1 2)))
(pass-if "apply 3" (sequal? (apply list 1 2 '(3)) '(1 2 3))) (pass-if "apply 3" (sequal? (apply list 1 2 '(3)) '(1 2 3)))
(begin (begin
(define local-answer 41)) (define local-answer 41))
(pass-if-equal "begin 2" 41 (begin local-answer)) (pass-if-equal "begin 2" 41 (begin local-answer))

360
tests/gc-2.test Executable file
View file

@ -0,0 +1,360 @@
#! /bin/sh
# -*-scheme-*-
set -x
echo ' ()' | cat $($(dirname $0)/../scripts/include.mes $0) $0 /dev/stdin | $(dirname $0)/../scripts/mes "$@"
#paredit:||
exit $?
!#
;;; -*-scheme-*-
;;; Mes --- Maxwell Equations of Software
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with Mes. If not, see <http://www.gnu.org/licenses/>.
;; (define *top-define-a* '*top-define-a*)
;; (display (eq? *top-define-a* '*top-define-a*))
;; (newline)
;; (begin (define *top-begin-define-a* '*top-begin-define-a*))
;; (display (eq? *top-begin-define-a* '*top-begin-define-a*))
;; (newline)
(display 'HALLO) (newline)
(define (result r)
(display 'result:) (display r) (newline))
(define (cadr x) (car (cdr x)))
(define (simple-map f l)
(if (null? l) '()
(cons (f (car l)) (simple-map f (cdr l)))))
(define-macro (simple-let bindings . rest)
(cons (cons 'lambda (cons (simple-map car bindings) rest))
(simple-map cadr bindings)))
(define-macro (let bindings . rest)
(cons 'simple-let (cons bindings rest)))
(define blub? #t)
;; (define result
;; (let ((pass 0)
;; (fail 0))
;; (lambda (. t)
;; (display 'result:) (display t) (newline)
;; (set! pass (+ pass 1)))))
(display "OKAY\n")
(define-macro (or . x)
(if (null? x) #f
(if (null? (cdr x)) (car x)
(list 'if (car x) (car x)
(cons 'or (cdr x))))))
(define-macro (cond . clauses)
(list 'if (null? clauses) *unspecified*
(if (null? (cdr clauses))
(list 'if (car (car clauses))
(list (cons 'lambda (cons '() (cons (car (car clauses)) (cdr (car clauses))))))
*unspecified*)
(if (eq? (car (cadr clauses)) 'else)
(list 'if (car (car clauses))
(list (cons 'lambda (cons '() (car clauses))))
(list (cons 'lambda (cons '() (cons *unspecified* (cdr (cadr clauses)))))))
(list 'if (car (car clauses))
(list (cons 'lambda (cons '() (car clauses))))
(cons 'cond (cdr clauses)))))))
(define result
(let ((pass 0)
(fail 0))
(lambda (. t)
(display 'result:) (display t) (newline)
(set! pass (+ pass 1)))))
(define result
(let ((pass 0)
(fail 0))
(lambda (. t)
(cond ((or (null? t) (eq? (car t) result)) (list pass fail))
((eq? (car t) 'report)
(newline)
(display "passed: ") (display pass) (newline)
(display "failed: ") (display fail) (newline)
(display "total: ") (display (+ pass fail)) (newline)
;;(exit fail)
)
((car t)
#t
#t
#t
;;(blaat)
(display ": pass")
;;(newline)
;;(set! pass (+ pass 1))
#t
)
(#t (display ": fail") (newline) (set! fail (+ fail 1)))))))
(define-macro (pass-if name t)
(list
'begin
(list display ''xxxtest:) (list display name)
(list result t)))
(display 'foo-test:) (newline)
(display 1)(newline)
(display 2)(newline)
(display 3)(newline)
(display 4)(newline)
(display 5)(newline)
(display 6)(newline)
(display 7)(newline)
(display 8)(newline)
(display 9)(newline)
(pass-if "if" (eq? (if #t 'true) 'true))
(pass-if "if 2" (eq? (if #f #f) *unspecified*))
(pass-if "if 3" (eq? (if (eq? 0 '0) 'true 'false) 'true))
(pass-if "if 4" (eq? (if (= 1 2) 'true 'false) 'false))
(display 10)(newline)
(display 11)(newline)
(display 12)(newline)
(display 13)(newline)
(display 14)(newline)
(display 15)(newline)
(display 16)(newline)
(display 17)(newline)
(display 18)(newline)
(display 19)(newline)
(display 14)(newline)
(display 15)(newline)
(display 16)(newline)
(display 17)(newline)
(display 18)(newline)
(display 19)(newline)
(define (m x) (* 2 x))
(display 'multiply:)
(display (m 1)) (newline)
(display (m 2)) (newline)
(display (m 3)) (newline)
(display (m 4)) (newline)
;; (define (result r)
;; (display 'result:) (display r) (newline))
(define-macro (pass-if name t)
(list
'begin
(list display ''xxxtest:) (list display name)
(list result t)))
(pass-if 'first-dummy: #t)
(display 20)(newline)
(display 21)(newline)
(display 22)(newline)
(display 23)(newline)
(display 24)(newline)
(display 25)(newline)
(display 26)(newline)
(display 27)(newline)
(display 28)(newline)
(display 29)(newline)
(display 30)(newline)
(define *top-define-a* '*top-define-a*)
(display (eq? *top-define-a* '*top-define-a*))
(newline)
(begin (define *top-begin-define-a* '*top-begin-define-a*))
(display (eq? *top-begin-define-a* '*top-begin-define-a*))
(newline)
(display 31)(newline)
(display 32)(newline)
(display 33)(newline)
(display 34)(newline)
(display 35)(newline)
(display 36)(newline)
(display 37)(newline)
(display 38)(newline)
(display 39)(newline)
(display 40)(newline)
;; (display 41)(newline)
;; (display 42)(newline)
;; (display 43)(newline)
;; (display 44)(newline)
;; (display 45)(newline)
;; (display 46)(newline)
;; (display 47)(newline)
;; (display 48)(newline)
;; (display 49)(newline)
;; (display 50)(newline)
;; (display 51)(newline)
;; (display 52)(newline)
;; (display 53)(newline)
;; (display 54)(newline)
;; (display 55)(newline)
;; (display 56)(newline)
;; (display 57)(newline)
;; (display 58)(newline)
;; (display 59)(newline)
;; (display 60)(newline)
;; (display 61)(newline)
;; (display 62)(newline)
;; (display 63)(newline)
;; (display 64)(newline)
;; (display 65)(newline)
;; (display 66)(newline)
;; (display 67)(newline)
;; (display 68)(newline)
;; (display 69)(newline)
;; (display 70)(newline)
;; (display 71)(newline)
;; (display 72)(newline)
;; (display 73)(newline)
;; (display 74)(newline)
;; (display 75)(newline)
;; (display 76)(newline)
;; (display 77)(newline)
;; (display 78)(newline)
;; (display 79)(newline)
;; (display 80)(newline)
;; (display 81)(newline)
;; (display 82)(newline)
;; (display 83)(newline)
;; (display 84)(newline)
;; (display 85)(newline)
;; (display 86)(newline)
;; (display 87)(newline)
;; (display 88)(newline)
;; (display 89)(newline)
;; (display 90)(newline)
;; (display 91)(newline)
;; (display 92)(newline)
;; (display 93)(newline)
;; (display 94)(newline)
;; (display 95)(newline)
;; (display 96)(newline)
;; (display 97)(newline)
;; (display 98)(newline)
;; (display 99)(newline)
;; (display 100)(newline)
;; (display 101)(newline)
;; (display 102)(newline)
;; (display 103)(newline)
;; (display 104)(newline)
;; (display 105)(newline)
;; (display 106)(newline)
;; (display 107)(newline)
;; (display 108)(newline)
;; (display 109)(newline)
;; (display 110)(newline)
;; (display 111)(newline)
;; (display 112)(newline)
;; (display 113)(newline)
;; (display 114)(newline)
;; (display 115)(newline)
;; (display 116)(newline)
;; (display 117)(newline)
;; (display 118)(newline)
;; (display 119)(newline)
;; (display 120)(newline)
;; (display 121)(newline)
;; (display 122)(newline)
;; (display 123)(newline)
;; (display 124)(newline)
;; (display 125)(newline)
;; (display 126)(newline)
;; (display 127)(newline)
;; (display 128)(newline)
;; (display 129)(newline)
;; (display 130)(newline)
;; (display 131)(newline)
;; (display 132)(newline)
;; (display 133)(newline)
;; (display 134)(newline)
;; (display 135)(newline)
;; (display 136)(newline)
;; (display 137)(newline)
;; (display 138)(newline)
;; (display 139)(newline)
;; (display 140)(newline)
;; (display 141)(newline)
;; (display 142)(newline)
;; (display 143)(newline)
;; (display 144)(newline)
;; (display 145)(newline)
;; (display 146)(newline)
;; (display 147)(newline)
;; (display 148)(newline)
;; (display 149)(newline)
;; (display 150)(newline)
;; (display 151)(newline)
;; (display 152)(newline)
;; (display 153)(newline)
;; (display 154)(newline)
;; (display 155)(newline)
;; (display 156)(newline)
;; (display 157)(newline)
;; (display 158)(newline)
;; (display 159)(newline)
;; (display 160)(newline)
;; (display 161)(newline)
;; (display 162)(newline)
;; (display 163)(newline)
;; (display 164)(newline)
;; (display 165)(newline)
;; (display 166)(newline)
;; (display 167)(newline)
;; (display 168)(newline)
;; (display 169)(newline)
;; (display 170)(newline)
;; (display 171)(newline)
;; (display 172)(newline)
;; (display 173)(newline)
;; (display 174)(newline)
;; (display 175)(newline)
;; (display 176)(newline)
;; (display 177)(newline)
;; (display 178)(newline)
;; (display 179)(newline)
;; (display 180)(newline)
;; (display 181)(newline)
;; (display 182)(newline)
;; (display 183)(newline)
;; (display 184)(newline)
;; (display 185)(newline)
;; (display 186)(newline)
;; (display 187)(newline)
;; (display 188)(newline)
;; (display 189)(newline)
;; (display 190)(newline)
;; (display 191)(newline)
;; (display 192)(newline)
;; (display 193)(newline)
;; (display 194)(newline)
;; (display 195)(newline)
;; (display 196)(newline)
;; (display 197)(newline)
;; (display 198)(newline)
;; (display 199)(newline)
;; (display 200)(newline)

324
tests/gc-2a.test Executable file
View file

@ -0,0 +1,324 @@
#! /bin/sh
# -*-scheme-*-
set -x
echo ' ()' | cat $($(dirname $0)/../scripts/include.mes $0) $0 /dev/stdin | $(dirname $0)/../scripts/mes "$@"
#paredit:||
exit $?
!#
;;; -*-scheme-*-
;;; Mes --- Maxwell Equations of Software
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with Mes. If not, see <http://www.gnu.org/licenses/>.
;; (cons 0 1)
;; (display 1)(newline)
(define (blup?)
#t)
(blup?)
(define a 'a)
(display a)
(display 2)(newline)
(display 3)(newline)
(display 4)(newline)
(display 5)(newline)
(display 6)(newline)
(display 7)(newline)
(display 8)(newline)
(display 9)(newline)
(define *top-define-a* '*top-define-a*)
(display (eq? *top-define-a* '*top-define-a*))
(newline)
(begin (define *top-begin-define-a* '*top-begin-define-a*))
(display (eq? *top-begin-define-a* '*top-begin-define-a*))
(newline)
(define (blup?) #t)
(display 'HALLO) (newline)
(blup?)
(define *top-define-a* '*top-define-a*)
(define *top-define-b* '*top-define-b*)
(display (eq? *top-define-a* '*top-define-a*))
(newline)
(display 'HALLO2) (newline)
(define (bla? x y) (eq? x y))
(begin (define *top-begin-define-a* '*top-begin-define-a*))
(display (eq? *top-begin-define-a* '*top-begin-define-a*))
(newline)
(display 'HALLO3) (newline)
(display "OKAY\n")
(define (m x) (* 2 x))
(display 'multiply:)
(display (m 1)) (newline)
(display (m 2)) (newline)
(display (m 3)) (newline)
(display (m 4)) (newline)
(define (result r)
(display 'result:) (display r) (newline))
(define-macro (pass-if name t)
(list
'begin
(list display ''xxxtest:) (list display name)
(list result t)))
(display 'foo-test:) (newline)
(display 1)(newline)
(display 2)(newline)
(display 3)(newline)
(display 4)(newline)
(display 5)(newline)
(display 6)(newline)
(display 7)(newline)
(display 8)(newline)
(display 9)(newline)
(pass-if "if" (eq? (if #t 'true) 'true))
(pass-if "if 2" (eq? (if #f #f) *unspecified*))
(pass-if "if 3" (eq? (if (eq? 0 '0) 'true 'false) 'true))
(pass-if "if 4" (eq? (if (= 1 2) 'true 'false) 'false))
;; (display 10)(newline)
;; (display 11)(newline)
;; (display 12)(newline)
;; (display 13)(newline)
;; (display 14)(newline)
;; (display 15)(newline)
;; (display 16)(newline)
;; (display 17)(newline)
;; (display 18)(newline)
;; (display 19)(newline)
;; (display 14)(newline)
;; (display 15)(newline)
;; (display 16)(newline)
;; (display 17)(newline)
;; (display 18)(newline)
;; (display 19)(newline)
;; (define (result r)
;; (display 'result:) (display r) (newline))
;; (define-macro (pass-if name t)
;; (list
;; 'begin
;; (list display ''xxxtest:) (list display name)
;; (list result t)))
;; (pass-if 'first-dummy: #t)
;; (display 20)(newline)
;; (display 21)(newline)
;; (display 22)(newline)
;; (display 23)(newline)
;; (display 24)(newline)
;; (display 25)(newline)
;; (display 26)(newline)
;; (display 27)(newline)
;; (display 28)(newline)
;; (display 29)(newline)
;; (display 30)(newline)
;; (define *top-define-a* '*top-define-a*)
;; (display (eq? *top-define-a* '*top-define-a*))
;; (newline)
;; (begin (define *top-begin-define-a* '*top-begin-define-a*))
;; (display (eq? *top-begin-define-a* '*top-begin-define-a*))
;; (newline)
;; (display 31)(newline)
;; (display 32)(newline)
;; (display 33)(newline)
;; (display 34)(newline)
;; (display 35)(newline)
;; (display 36)(newline)
;; (display 37)(newline)
;; (display 38)(newline)
;; (display 39)(newline)
;; (display 40)(newline)
;; (display 41)(newline)
;; (display 42)(newline)
;; (display 43)(newline)
;; (display 44)(newline)
;; (display 45)(newline)
;; (display 46)(newline)
;; (display 47)(newline)
;; (display 48)(newline)
;; (display 49)(newline)
;; (display 50)(newline)
;; (display 51)(newline)
;; (display 52)(newline)
;; (display 53)(newline)
;; (display 54)(newline)
;; (display 55)(newline)
;; (display 56)(newline)
;; (display 57)(newline)
;; (display 58)(newline)
;; (display 59)(newline)
;; (display 60)(newline)
;; (display 61)(newline)
;; (display 62)(newline)
;; (display 63)(newline)
;; (display 64)(newline)
;; (display 65)(newline)
;; (display 66)(newline)
;; (display 67)(newline)
;; (display 68)(newline)
;; (display 69)(newline)
;; (display 70)(newline)
;; (display 71)(newline)
;; (display 72)(newline)
;; (display 73)(newline)
;; (display 74)(newline)
;; (display 75)(newline)
;; (display 76)(newline)
;; (display 77)(newline)
;; (display 78)(newline)
;; (display 79)(newline)
;; (display 80)(newline)
;; (display 81)(newline)
;; (display 82)(newline)
;; (display 83)(newline)
;; (display 84)(newline)
;; (display 85)(newline)
;; (display 86)(newline)
;; (display 87)(newline)
;; (display 88)(newline)
;; (display 89)(newline)
;; (display 90)(newline)
;; (display 91)(newline)
;; (display 92)(newline)
;; (display 93)(newline)
;; (display 94)(newline)
;; (display 95)(newline)
;; (display 96)(newline)
;; (display 97)(newline)
;; (display 98)(newline)
;; (display 99)(newline)
;; (display 100)(newline)
;; (display 101)(newline)
;; (display 102)(newline)
;; (display 103)(newline)
;; (display 104)(newline)
;; (display 105)(newline)
;; (display 106)(newline)
;; (display 107)(newline)
;; (display 108)(newline)
;; (display 109)(newline)
;; (display 110)(newline)
;; (display 111)(newline)
;; (display 112)(newline)
;; (display 113)(newline)
;; (display 114)(newline)
;; (display 115)(newline)
;; (display 116)(newline)
;; (display 117)(newline)
;; (display 118)(newline)
;; (display 119)(newline)
;; (display 120)(newline)
;; (display 121)(newline)
;; (display 122)(newline)
;; (display 123)(newline)
;; (display 124)(newline)
;; (display 125)(newline)
;; (display 126)(newline)
;; (display 127)(newline)
;; (display 128)(newline)
;; (display 129)(newline)
;; (display 130)(newline)
;; (display 131)(newline)
;; (display 132)(newline)
;; (display 133)(newline)
;; (display 134)(newline)
;; (display 135)(newline)
;; (display 136)(newline)
;; (display 137)(newline)
;; (display 138)(newline)
;; (display 139)(newline)
;; (display 140)(newline)
;; (display 141)(newline)
;; (display 142)(newline)
;; (display 143)(newline)
;; (display 144)(newline)
;; (display 145)(newline)
;; (display 146)(newline)
;; (display 147)(newline)
;; (display 148)(newline)
;; (display 149)(newline)
;; (display 150)(newline)
;; (display 151)(newline)
;; (display 152)(newline)
;; (display 153)(newline)
;; (display 154)(newline)
;; (display 155)(newline)
;; (display 156)(newline)
;; (display 157)(newline)
;; (display 158)(newline)
;; (display 159)(newline)
;; (display 160)(newline)
;; (display 161)(newline)
;; (display 162)(newline)
;; (display 163)(newline)
;; (display 164)(newline)
;; (display 165)(newline)
;; (display 166)(newline)
;; (display 167)(newline)
;; (display 168)(newline)
;; (display 169)(newline)
;; (display 170)(newline)
;; (display 171)(newline)
;; (display 172)(newline)
;; (display 173)(newline)
;; (display 174)(newline)
;; (display 175)(newline)
;; (display 176)(newline)
;; (display 177)(newline)
;; (display 178)(newline)
;; (display 179)(newline)
;; (display 180)(newline)
;; (display 181)(newline)
;; (display 182)(newline)
;; (display 183)(newline)
;; (display 184)(newline)
;; (display 185)(newline)
;; (display 186)(newline)
;; (display 187)(newline)
;; (display 188)(newline)
;; (display 189)(newline)
;; (display 190)(newline)
;; (display 191)(newline)
;; (display 192)(newline)
;; (display 193)(newline)
;; (display 194)(newline)
;; (display 195)(newline)
;; (display 196)(newline)
;; (display 197)(newline)
;; (display 198)(newline)
;; (display 199)(newline)
;; (display 200)(newline)

241
tests/gc-3.test Executable file
View file

@ -0,0 +1,241 @@
#! /bin/sh
# -*-scheme-*-
set -x
echo ' ()' | cat $($(dirname $0)/../scripts/include.mes $0) $0 /dev/stdin | $(dirname $0)/../scripts/mes "$@"
#paredit:||
exit $?
!#
;;; -*-scheme-*-
;;; Mes --- Maxwell Equations of Software
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with Mes. If not, see <http://www.gnu.org/licenses/>.
;; (define *top-define-a* '*top-define-a*)
;; (display (eq? *top-define-a* '*top-define-a*))
;; (newline)
;; (begin (define *top-begin-define-a* '*top-begin-define-a*))
;; (display (eq? *top-begin-define-a* '*top-begin-define-a*))
;; (newline)
(display 'HALLO) (newline)
(display 'foo-test:) (newline)
(display 1)(newline)
(display 2)(newline)
(display 3)(newline)
(display 4)(newline)
(display 5)(newline)
(display 6)(newline)
(display 7)(newline)
(display 8)(newline)
(display 9)(newline)
(display 10)(newline)
(display 11)(newline)
(display 12)(newline)
(display 13)(newline)
(display 14)(newline)
(display 15)(newline)
(display 16)(newline)
(display 17)(newline)
(display 18)(newline)
(display 19)(newline)
(display 20)(newline)
(display 21)(newline)
(display 22)(newline)
(display 23)(newline)
(display 24)(newline)
(display 25)(newline)
(display 26)(newline)
(display 27)(newline)
(display 28)(newline)
(display 29)(newline)
(display 30)(newline)
(display 31)(newline)
(display 32)(newline)
(display 33)(newline)
(display 34)(newline)
(display 35)(newline)
(display 36)(newline)
(display 37)(newline)
(display 38)(newline)
(display 39)(newline)
(display 40)(newline)
;; (display 41)(newline)
;; (display 42)(newline)
;; (display 43)(newline)
;; (display 44)(newline)
;; (display 45)(newline)
;; (display 46)(newline)
;; (display 47)(newline)
;; (display 48)(newline)
;; (display 49)(newline)
;; (display 50)(newline)
;; (display 51)(newline)
;; (display 52)(newline)
;; (display 53)(newline)
;; (display 54)(newline)
;; (display 55)(newline)
;; (display 56)(newline)
;; (display 57)(newline)
;; (display 58)(newline)
;; (display 59)(newline)
;; (display 60)(newline)
;; (display 61)(newline)
;; (display 62)(newline)
;; (display 63)(newline)
;; (display 64)(newline)
;; (display 65)(newline)
;; (display 66)(newline)
;; (display 67)(newline)
;; (display 68)(newline)
;; (display 69)(newline)
;; (display 70)(newline)
;; (display 71)(newline)
;; (display 72)(newline)
;; (display 73)(newline)
;; (display 74)(newline)
;; (display 75)(newline)
;; (display 76)(newline)
;; (display 77)(newline)
;; (display 78)(newline)
;; (display 79)(newline)
;; (display 80)(newline)
;; (display 81)(newline)
;; (display 82)(newline)
;; (display 83)(newline)
;; (display 84)(newline)
;; (display 85)(newline)
;; (display 86)(newline)
;; (display 87)(newline)
;; (display 88)(newline)
;; (display 89)(newline)
;; (display 90)(newline)
;; (display 91)(newline)
;; (display 92)(newline)
;; (display 93)(newline)
;; (display 94)(newline)
;; (display 95)(newline)
;; (display 96)(newline)
;; (display 97)(newline)
;; (display 98)(newline)
;; (display 99)(newline)
;; (display 100)(newline)
;; (display 101)(newline)
;; (display 102)(newline)
;; (display 103)(newline)
;; (display 104)(newline)
;; (display 105)(newline)
;; (display 106)(newline)
;; (display 107)(newline)
;; (display 108)(newline)
;; (display 109)(newline)
;; (display 110)(newline)
;; (display 111)(newline)
;; (display 112)(newline)
;; (display 113)(newline)
;; (display 114)(newline)
;; (display 115)(newline)
;; (display 116)(newline)
;; (display 117)(newline)
;; (display 118)(newline)
;; (display 119)(newline)
;; (display 120)(newline)
;; (display 121)(newline)
;; (display 122)(newline)
;; (display 123)(newline)
;; (display 124)(newline)
;; (display 125)(newline)
;; (display 126)(newline)
;; (display 127)(newline)
;; (display 128)(newline)
;; (display 129)(newline)
;; (display 130)(newline)
;; (display 131)(newline)
;; (display 132)(newline)
;; (display 133)(newline)
;; (display 134)(newline)
;; (display 135)(newline)
;; (display 136)(newline)
;; (display 137)(newline)
;; (display 138)(newline)
;; (display 139)(newline)
;; (display 140)(newline)
;; (display 141)(newline)
;; (display 142)(newline)
;; (display 143)(newline)
;; (display 144)(newline)
;; (display 145)(newline)
;; (display 146)(newline)
;; (display 147)(newline)
;; (display 148)(newline)
;; (display 149)(newline)
;; (display 150)(newline)
;; (display 151)(newline)
;; (display 152)(newline)
;; (display 153)(newline)
;; (display 154)(newline)
;; (display 155)(newline)
;; (display 156)(newline)
;; (display 157)(newline)
;; (display 158)(newline)
;; (display 159)(newline)
;; (display 160)(newline)
;; (display 161)(newline)
;; (display 162)(newline)
;; (display 163)(newline)
;; (display 164)(newline)
;; (display 165)(newline)
;; (display 166)(newline)
;; (display 167)(newline)
;; (display 168)(newline)
;; (display 169)(newline)
;; (display 170)(newline)
;; (display 171)(newline)
;; (display 172)(newline)
;; (display 173)(newline)
;; (display 174)(newline)
;; (display 175)(newline)
;; (display 176)(newline)
;; (display 177)(newline)
;; (display 178)(newline)
;; (display 179)(newline)
;; (display 180)(newline)
;; (display 181)(newline)
;; (display 182)(newline)
;; (display 183)(newline)
;; (display 184)(newline)
;; (display 185)(newline)
;; (display 186)(newline)
;; (display 187)(newline)
;; (display 188)(newline)
;; (display 189)(newline)
;; (display 190)(newline)
;; (display 191)(newline)
;; (display 192)(newline)
;; (display 193)(newline)
;; (display 194)(newline)
;; (display 195)(newline)
;; (display 196)(newline)
;; (display 197)(newline)
;; (display 198)(newline)
;; (display 199)(newline)
;; (display 200)(newline)