[comp.sources.misc] v08i052: Elk

allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (09/24/89)

Posting-number: Volume 8, Issue 52
Submitted-by: net@tub.UUCP (Oliver Laumann)
Archive-name: elk/part04

[Let this be a lesson to submitters:  this was submitted as uuencoded,
compressed files.  I lost the source information while unpacking it; this
is the best approximation I could come up with.  ++bsa]

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 4 (of 14)."
# Contents:  src/list.c src/proc.c src/char.c src/symbol.c src/macros.h
#   src/prim.c src/stack.s.vax scm
# Wrapped by net@tub on Sun Sep 17 17:32:22 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f src/list.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"src/list.c\"
else
echo shar: Extracting \"src/list.c\" \(6515 characters\)
sed "s/^X//" >src/list.c <<'END_OF_src/list.c'
X/* Lists
X */
X
X#include "scheme.h"
X
XObject P_Cons (car, cdr) Object car, cdr; {
X    register char *p;
X    register f = 0;
X    Object cell;
X    GC_Node2;
X
X    p = Hp;
X    ALIGN(p);
X    if (p + sizeof (struct S_Pair) <= Heap_End) {
X	Hp = p + sizeof (struct S_Pair);
X    } else {
X	GC_Link2 (car, cdr);
X	p = Get_Bytes (sizeof (struct S_Pair));
X	f++;
X    }
X    SET(cell, T_Pair, (struct S_Pair *)p);
X    Car (cell) = car;
X    Cdr (cell) = cdr;
X    if (f)
X	GC_Unlink;
X    return cell;
X}
X
XObject P_Car (x) Object x; {
X    Check_List (x);
X    return Nullp (x) ? Null : Car (x);
X}
X
XObject P_Cdr (x) Object x; {
X    Check_List (x);
X    return Nullp (x) ? Null : Cdr (x);
X}
X
XObject Cxr (x, pat, len) Object x; register char *pat; register len; {
X    Object ret;
X
X    for (ret = x, pat += len; !Nullp (ret) && len > 0; len--)
X	switch (*--pat) {
X	case 'a': ret = P_Car (ret); break;
X	case 'd': ret = P_Cdr (ret); break;
X	default: Primitive_Error ("invalid pattern");
X	}
X    return ret;
X}
X
XObject P_Cddr  (x) Object x; { return Cxr (x,  "dd", 2); }
XObject P_Cdar  (x) Object x; { return Cxr (x,  "da", 2); }
XObject P_Cadr  (x) Object x; { return Cxr (x,  "ad", 2); }
XObject P_Caar  (x) Object x; { return Cxr (x,  "aa", 2); }
XObject P_Cdddr (x) Object x; { return Cxr (x, "ddd", 3); }
XObject P_Cddar (x) Object x; { return Cxr (x, "dda", 3); }
XObject P_Cdadr (x) Object x; { return Cxr (x, "dad", 3); }
XObject P_Cdaar (x) Object x; { return Cxr (x, "daa", 3); }
XObject P_Caddr (x) Object x; { return Cxr (x, "add", 3); }
XObject P_Cadar (x) Object x; { return Cxr (x, "ada", 3); }
XObject P_Caadr (x) Object x; { return Cxr (x, "aad", 3); }
XObject P_Caaar (x) Object x; { return Cxr (x, "aaa", 3); }
X
XObject P_Cxr (x, pat) Object x, pat; {
X    Check_List (x);
X    if (TYPE(pat) == T_Symbol)
X	pat = SYMBOL(pat)->name;
X    else if (TYPE(pat) != T_String)
X	Wrong_Type_Combination (pat, "string or symbol");
X    return Cxr (x, STRING(pat)->data, STRING(pat)->size);
X}
X
XObject P_Nullp (x) Object x; {
X    return Nullp (x) ? True : False;
X}
X
XObject P_Pairp (x) Object x; {
X    return TYPE(x) == T_Pair ? True : False;
X}
X
XObject P_Setcar (x, new) Object x, new; {
X    Check_Type (x, T_Pair);
X    return Car (x) = new;
X}
X
XObject P_Setcdr (x, new) Object x, new; {
X    Check_Type (x, T_Pair);
X    return Cdr (x) = new;
X}
X
XObject General_Member (key, list, comp) Object key, list; register comp; {
X    register r;
X
X    for ( ; !Nullp (list); list = Cdr (list)) {
X	Check_List (list);
X	if (comp == 0)
X	    r = EQ(Car (list), key);
X	else if (comp == 1)
X	    r = Eqv (Car (list), key);
X	else
X	    r = Equal (Car (list), key);
X	if (r) return list;
X    }
X    return False;
X}
X
XObject P_Memq (key, list) Object key, list; {
X    return General_Member (key, list, 0);
X}
X
XObject P_Memv (key, list) Object key, list; {
X    return General_Member (key, list, 1);
X}
X
XObject P_Member (key, list) Object key, list; {
X    return General_Member (key, list, 2);
X}
X
XObject General_Assoc (key, alist, comp) Object key, alist; register comp; {
X    Object elem;
X    register r;
X
X    for ( ; !Nullp (alist); alist = Cdr (alist)) {
X	Check_List (alist);
X	elem = Car (alist);
X	if (TYPE(elem) != T_Pair)
X	    continue;
X	if (comp == 0)
X	    r = EQ(Car (elem), key);
X	else if (comp == 1)
X	    r = Eqv (Car (elem), key);
X	else
X	    r = Equal (Car (elem), key);
X	if (r) return elem;
X    }
X    return False;
X}
X
XObject P_Assq (key, alist) Object key, alist; {
X    return General_Assoc (key, alist, 0);
X}
X
XObject P_Assv (key, alist) Object key, alist; {
X    return General_Assoc (key, alist, 1);
X}
X
XObject P_Assoc (key, alist) Object key, alist; {
X    return General_Assoc (key, alist, 2);
X}
X
XInternal_Length (list) Object list; {
X    Object tail;
X    register i;
X
X    for (i = 0, tail = list; TYPE(tail) == T_Pair; tail = Cdr (tail), i++)
X	;
X    return i;
X}
X
XObject P_Length (list) Object list; {
X    Object tail;
X    register i;
X
X    for (i = 0, tail = list; !Nullp (tail); tail = Cdr (tail), i++)
X	Check_List (tail);
X    return Make_Integer (i);
X}
X
XObject P_Make_List (n, init) Object n, init; {
X    register len;
X    Object list;
X    GC_Node;
X
X    if ((len = Get_Integer (n)) < 0)
X	Range_Error (n);
X    list = Null;
X    GC_Link (init);
X    while (len-- > 0)
X	list = Cons (init, list);
X    GC_Unlink;
X    return list;
X}
X
XObject P_List (argc, argv) Object *argv; {
X    Object list, tail, cell;
X    GC_Node2;
X
X    GC_Link2 (list, tail);
X    for (list = tail = Null; argc-- > 0; tail = cell) {
X	cell = Cons (*argv++, Null);
X	if (Nullp (list))
X	    list = cell;
X	else
X	    P_Setcdr (tail, cell);
X    }
X    GC_Unlink;
X    return list;
X}
X
XObject P_Last_Pair (x) Object x; {
X    Check_Type (x, T_Pair);
X    for ( ; TYPE(Cdr (x)) == T_Pair; x = Cdr (x)) ;
X    return x;
X}
X
XObject P_Append (argc, argv) Object *argv; {
X    Object list, last, tail, cell;
X    register i;
X    GC_Node3;
X
X    list = last = Null;
X    GC_Link3 (list, last, tail);
X    for (i = 0; i < argc-1; i++) {
X	for (tail = argv[i]; !Nullp (tail); tail = Cdr (tail)) {
X	    Check_List (tail);
X	    cell = Cons (Car (tail), Null);
X	    if (Nullp (list))
X		list = cell;
X	    else
X		P_Setcdr (last, cell);
X	    last = cell;
X	}
X    }
X    if (argc)
X	if (Nullp (list))
X	    list = argv[i];
X	else
X	    P_Setcdr (last, argv[i]);
X    GC_Unlink;
X    return list;
X}
X
XObject P_Append_Set (argc, argv) Object *argv; {
X    register i, j;
X
X    for (i = j = 0; i < argc; i++)
X	if (!Nullp (argv[i]))
X	    argv[j++] = argv[i];
X    if (j == 0)
X	return Null;
X    for (i = 0; i < j-1; i++)
X	P_Setcdr (P_Last_Pair (argv[i]), argv[i+1]);
X    return *argv;
X}
X
XObject P_Reverse (x) Object x; {
X    Object ret;
X    GC_Node;
X
X    GC_Link (x);
X    for (ret = Null; !Nullp (x); x = Cdr (x)) {
X	Check_List (x);
X	ret = Cons (Car (x), ret);
X    }
X    GC_Unlink;
X    return ret;
X}
X
XObject P_Reverse_Set (x) Object x; {
X    Object prev, tail;
X
X    for (prev = Null; !Nullp (x); prev = x, x = tail) {
X	Check_List (x);
X	tail = Cdr (x);
X	P_Setcdr (x, prev);
X    }
X    return prev;
X}
X
XObject P_List_Tail (x, num) Object x, num; {
X    register n;
X
X    for (n = Get_Integer (num); n > 0 && !Nullp (x); n--, x = P_Cdr (x)) ;
X    return x;
X}
X
XObject P_List_Ref (x, num) Object x, num; {
X    return P_Car (P_List_Tail (x, num));
X}
X
XObject Copy_List (x) Object x; {
X    Object car, cdr;
X    GC_Node3;
X
X    if (TYPE(x) == T_Pair) {
X	if (stksize () > maxstack)
X	    Uncatchable_Error ("Out of stack space");
X	car = cdr = Null;
X	GC_Link3 (x, car, cdr);
X	car = Copy_List (Car (x));
X	cdr = Copy_List (Cdr (x));
X	x = Cons (car, cdr);
X	GC_Unlink;
X    }
X    return x;
X}
END_OF_src/list.c
if test 6515 -ne `wc -c <src/list.c`; then
    echo shar: \"src/list.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f src/proc.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"src/proc.c\"
else
echo shar: Extracting \"src/proc.c\" \(13760 characters\)
sed "s/^X//" >src/proc.c <<'END_OF_src/proc.c'
X/* Eval, apply, etc.
X */
X
X#include "scheme.h"
X
Xchar *Error_Tag;
X
X/* "Tail_Call" indicates whether we are executing the last form in a
X * sequence of forms.  If it is true and we are about to call a compound
X * procedure, we are allowed to check whether a tail-call can be
X * performed instead.
X */
Xint Tail_Call = 0;
X
XObject Sym_Lambda,
X       Sym_Macro;
X
XObject Macro_Expand();
X
XInit_Proc () {
X    Define_Symbol (&Sym_Lambda, "lambda");
X    Define_Symbol (&Sym_Macro, "macro");
X}
X
XCheck_Procedure (x) Object x; {
X    register t = TYPE(x);
X
X    if (t != T_Primitive && t != T_Compound)
X	Wrong_Type_Combination (x, "procedure");
X    if (t == T_Primitive && PRIM(x)->disc == NOEVAL)
X	Primitive_Error ("invalid procedure: ~s", x);
X}
X
XObject P_Procedurep (x) Object x; {
X    register t = TYPE(x);
X    return t == T_Primitive || t == T_Compound || t == T_Control_Point
X	 ? True : False;
X}
X
XObject P_Primitivep (x) Object x; {
X    return TYPE(x) == T_Primitive ? True : False;
X}
X
XObject P_Compoundp (x) Object x; {
X    return TYPE(x) == T_Compound ? True : False;
X}
X
XObject P_Macrop (x) Object x; {
X    return TYPE(x) == T_Macro ? True : False;
X}
X
XObject Make_Compound () {
X    Object proc;
X    register char *p;
X
X    p = Get_Bytes (sizeof (struct S_Compound));
X    SET(proc, T_Compound, (struct S_Compound *)p);
X    COMPOUND(proc)->closure = COMPOUND(proc)->env = COMPOUND(proc)->name = Null;
X    return proc;
X}
X
XObject Make_Primitive (fun, name, min, max, disc) Object (*fun)(); char *name;
X	enum discipline disc; {
X    Object prim;
X    register char *p;
X    register struct S_Primitive *pr;
X
X    p = Get_Bytes (sizeof (struct S_Primitive));
X    SET(prim, T_Primitive, (struct S_Primitive *)p);
X    pr = PRIM(prim);
X    pr->tag = Null;
X    pr->fun = fun;
X    pr->name = name;
X    pr->minargs = min;
X    pr->maxargs = max;
X    pr->disc = disc;
X    return prim;
X}
X
XObject P_Begin (forms) Object forms; {
X    GC_Node;
X    TC_Prolog;
X
X    if (Nullp (forms))
X	return Null;
X    GC_Link (forms);
X    TC_Disable;
X    for ( ; !Nullp (Cdr (forms)); forms = Cdr (forms))
X	(void)Eval (Car (forms));
X    GC_Unlink;
X    TC_Enable;
X    return Eval (Car (forms));
X}
X
XObject P_Begin1 (forms) Object forms; {
X    register n;
X    Object r, ret;
X    GC_Node;
X    TC_Prolog;
X
X    GC_Link (forms);
X    TC_Disable;
X    for (n = 1; !Nullp (Cdr (forms)); n = 0, forms = Cdr (forms)) {
X	r = Eval (Car (forms));
X	if (n)
X	    ret = r;
X    }
X    GC_Unlink;
X    TC_Enable;
X    r = Eval (Car (forms));
X    return n ? r : ret;
X}
X
XObject Eval (form) Object form; {
X    register t;
X    register struct S_Symbol *sym;
X    Object fun, binding, args, ret;
X    GC_Node;
X
Xagain:
X    t = TYPE(form);
X    if (t == T_Symbol) {
X	sym = SYMBOL(form);
X	if (EQ(sym->value,Unbound)) {
X	    binding = Lookup_Symbol (form, 1);
X	    sym->value = Cdr (binding);
X	}
X	ret = sym->value;
X	if (TYPE(ret) == T_Autoload)
X	    ret = Do_Autoload (form, ret);
X	return ret;
X    }
X    if (t != T_Pair)
X	return form;
X    if (stksize () > maxstack)
X	Uncatchable_Error ("Out of stack space");
X    GC_Link (form);
X    fun = Eval (Car (form));
X    args = Cdr (form);
X    Check_List (args);
X    if (TYPE(fun) == T_Macro) {
X	form = Macro_Expand (fun, args);
X	GC_Unlink;
X	goto again;
X    }
X    ret = Funcall (fun, args, 1);
X    GC_Unlink;
X    return ret;
X}
X
XObject P_Eval (argc, argv) Object *argv; {
X    Object ret, oldenv;
X    GC_Node;
X
X    if (argc == 1)
X	return Eval (argv[0]);
X    Check_Type (argv[1], T_Environment);
X    oldenv = The_Environment;
X    GC_Link (oldenv);
X    Switch_Environment (argv[1]);
X    ret = Eval (argv[0]);
X    Switch_Environment (oldenv);
X    GC_Unlink;
X    return ret;
X}
X
XObject P_Apply (argc, argv) Object *argv; {
X    Object ret, list, tail, cell, last;
X    register i;
X    GC_Node3;
X
X    Check_Procedure (argv[0]);
X    /* Make a list of all args but the last, then append the
X     * last arg (which must be a proper list) to this list.
X     */
X    list = tail = last = Null;
X    GC_Link3 (list, tail, last);
X    for (i = 1; i < argc-1; i++, tail = cell) {
X	cell = Cons (argv[i], Null);
X	if (Nullp (list))
X	    list = cell;
X	else
X	    P_Setcdr (tail, cell);
X    }
X    for (last = argv[argc-1]; !Nullp (last); last = Cdr (last), tail = cell) {
X	cell = Cons (P_Car (last), Null);
X	if (Nullp (list))
X	    list = cell;
X	else
X	    P_Setcdr (tail, cell);
X    }
X    ret = Funcall (argv[0], list, 0);
X    GC_Unlink;
X    return ret;
X}
X
XArglist_Length (list) Object list; {
X    Object tail;
X    register i;
X
X    for (i = 0, tail = list; TYPE(tail) == T_Pair; tail = Cdr (tail), i++)
X	;
X    if (Nullp (tail))
X	return i;
X    Primitive_Error ("argument list is improper");
X    /*NOTREACHED*/
X}
X
XObject Funcall_Primitive (fun, argl, eval) Object fun, argl; {
X    register struct S_Primitive *prim;
X    register argc, i;
X    char *last;
X    register Object *argv;
X    Object abuf[8], ret;
X    GC_Node2; GCNODE gcv;
X    TC_Prolog;
X
X    prim = PRIM(fun);
X    last = Error_Tag;
X    Error_Tag = prim->name;
X    argc = Arglist_Length (argl);
X    if (argc < prim->minargs
X	    || (prim->maxargs != MANY && argc > prim->maxargs))
X	Primitive_Error ("wrong number of arguments");
X    if (prim->disc == NOEVAL) {
X	ret = (prim->fun)(argl);
X    } else {
X	/* Tail recursion is not possible while evaluating the arguments
X	 * of a primitive procedure.
X	 */
X	TC_Disable;
X	if (argc <= 8)
X	    argv = abuf;
X	else
X	    argv = (Object *)alloca (argc * sizeof (Object));
X	GC_Link2 (argl, fun);
X	gcv.gclen = 1; gcv.gcobj = argv; gcv.next = &gc2; GC_List = &gcv;
X	for (i = 0; i < argc; i++, argl = Cdr (argl)) {
X	    argv[i] = eval ? Eval (Car (argl)) : Car (argl);
X	    gcv.gclen++;
X	}
X	TC_Enable;
X	prim = PRIM(fun);   /* fun has possibly been moved during gc */
X	if (prim->disc == VARARGS) {
X	    ret = (prim->fun)(argc, argv);
X	} else {
X	    switch (argc) {
X	    case 0:
X		ret = (prim->fun)(); break;
X	    case 1:
X		ret = (prim->fun)(argv[0]); break;
X	    case 2:
X		ret = (prim->fun)(argv[0], argv[1]); break;
X	    case 3:
X		ret = (prim->fun)(argv[0], argv[1], argv[2]); break;
X	    case 4:
X		ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3]); break;
X	    case 5:
X		ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4]);
X		break;
X	    case 6:
X		ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4],
X		                  argv[5]); break;
X	    case 7:
X		ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4],
X		                  argv[5], argv[6]); break;
X	    case 8:
X		ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4],
X		                  argv[5], argv[6], argv[7]); break;
X	    case 9:
X		ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4],
X		                  argv[5], argv[6], argv[7], argv[8]); break;
X	    case 10:
X		ret = (prim->fun)(argv[0], argv[1], argv[2], argv[3], argv[4],
X		                  argv[5], argv[6], argv[7], argv[8], argv[9]);
X		break;
X	    default:
X		Panic ("too many args for primitive");
X	    }
X	}
X	GC_Unlink;
X    }
X    Error_Tag = last;
X    return ret;
X}
X
X/* If we are in a tail recursion, we are reusing the old procedure
X * frame; we just assign new values to the formal parameters:
X */
X#define Lambda_Bind(var,val)\
Xif (tail_calling) {\
X    frame = Lookup_Symbol (var, 1);\
X    Cdr (frame) = val;\
X    SYMBOL(var)->value = val;\
X} else {\
X    frame = Add_Binding (frame, var, val);\
X}
X
XObject Funcall_Compound (fun, argl, eval) Object fun, argl; {
X    register argc, i, tail_calling = 0;
X    Object oldenv;
X    Object *argv, abuf[4], rest, ret, frame, tail, tail_call_env;
X    GC_Node5; GCNODE gcv;
X    TC_Prolog;
X
X#ifdef lint
X    tail_call_env = Null;
X#endif
X    frame = oldenv = tail = Null;
X    GC_Link5 (argl, oldenv, frame, tail, fun);
Xagain:
X    argc = Arglist_Length (argl);
X    if (tail_calling) {
X	tail = The_Environment;
X	Switch_Environment (tail_call_env);
X    } else {
X	if (argc <= 4)
X	    argv = abuf;
X	else
X	    argv = (Object *)alloca (argc * sizeof (Object));
X    }
X    TC_Disable;
X    gcv.gclen = 1; gcv.gcobj = argv; gcv.next = &gc5; GC_List = &gcv;
X    for (i = 0; i < argc; i++, argl = Cdr (argl)) {
X	argv[i] = eval ? Eval (Car (argl)) : Car (argl);
X	gcv.gclen++;
X    }
X    TC_Enable;
X    if (tail_calling)
X	Switch_Environment (tail);
X    tail = Car (Cdr (COMPOUND(fun)->closure));
X    if (TYPE(tail) == T_Symbol) {
X	rest = P_List (argc, argv);
X	Lambda_Bind (tail, rest);
X    } else {
X	for (i = 0; TYPE(tail) == T_Pair; tail = Cdr (tail), i++) {
X	    Check_Type (Car (tail), T_Symbol);
X	    if (i == argc)
X		Primitive_Error ("too few arguments for ~s", fun);
X	    Lambda_Bind (Car (tail), argv[i]);
X	}
X	if (Nullp (tail)) {
X	    if (i < argc)
X		Primitive_Error ("too many arguments for ~s", fun);
X	} else {
X	    Check_Type (tail, T_Symbol);
X	    rest = P_List (argc-i, argv+i);
X	    Lambda_Bind (tail, rest);
X	}
X    }
X    if (!tail_calling) {
X	oldenv = The_Environment;
X	Switch_Environment (COMPOUND(fun)->env);
X	Push_Frame (frame);
X    }
X    Tail_Call = 1;
X    ret = Begin (Cdr (Cdr (COMPOUND(fun)->closure)));
X    if (TYPE(ret) == T_Special) {
X	argl = Car (ret);
X	tail_call_env = Cdr (ret);
X	tail_calling = 1;
X	eval = 1;
X	goto again;
X    }
X    Tail_Call = 0;
X    Pop_Frame ();
X    Switch_Environment (oldenv);
X    GC_Unlink;
X    return ret;
X}
X
XObject Funcall (fun, argl, eval) Object fun, argl; {
X    register t;
X    static struct S_Pair tail_call_info;
X    Object ret, env;
X    Tag_Node;
X
X    t = TYPE(fun);
X    if (Tail_Call && eval && t == T_Compound) {
X	register GCNODE *p;
X	Object f;
X
X	for (p = GC_List; p; p = p->next) {
X	    f = *(p->gcobj);
X	    if (p->gclen == TAG_FUN && TYPE(f) == T_Compound) {
X		if (EQ(f,fun)) {
X		    SET(ret, T_Special, &tail_call_info);
X		    Car (ret) = argl;
X		    Cdr (ret) = The_Environment;
X		    return ret;
X		}
X		break;
X	    }
X	}
X    }
X    env = The_Environment;
X    Tag_Link (argl, fun, env);
X    if (t == T_Primitive) {
X	ret = Funcall_Primitive (fun, argl, eval);
X    } else if (t == T_Compound) {
X	ret = Funcall_Compound (fun, argl, eval);
X    } else if (t == T_Control_Point) {
X	Funcall_Control_Point (fun, argl, eval);
X	/*NOTREACHED*/
X    } else Primitive_Error ("application of non-procedure (~s)", fun);
X    GC_Unlink;
X    return ret;
X}
X
XObject P_Lambda (argl) Object argl; {
X    Object proc, args, closure;
X    GC_Node2;
X
X    proc = Null;
X    args = Car (argl);
X    if (TYPE(args) != T_Symbol && TYPE(args) != T_Pair && !Nullp (args))
X	Wrong_Type_Combination (args, "list or symbol");
X    GC_Link2 (argl, proc);
X    proc = Make_Compound ();
X    closure = Cons (Sym_Lambda, argl);
X    COMPOUND(proc)->closure = closure;
X    COMPOUND(proc)->env = The_Environment;
X    GC_Unlink;
X    return proc;
X}
X
XObject P_Procedure_Lambda (p) Object p; {
X    Check_Type (p, T_Compound);
X    return Copy_List (COMPOUND(p)->closure);
X}
X
XObject P_Procedure_Env (p) Object p; {
X    Check_Type (p, T_Compound);
X    return COMPOUND(p)->env;
X}
X
XObject General_Map (argc, argv, accum) Object *argv; register accum; {
X    register i;
X    Object *args;
X    Object head, list, tail, cell, arglist, val;
X    GC_Node2; GCNODE gcv;
X
X    Check_Procedure (argv[0]);
X    args = (Object *)alloca ((argc-1) * sizeof (Object));
X    list = tail = Null;
X    GC_Link2 (list, tail);
X    gcv.gclen = argc; gcv.gcobj = args; gcv.next = &gc2; GC_List = &gcv;
X    while (1) {
X	for (i = 1; i < argc; i++) {
X	    head = argv[i];
X	    if (Nullp (head)) {
X		GC_Unlink;
X		return list;
X	    }
X	    Check_Type (head, T_Pair);
X	    args[i-1] = Car (head);
X	    argv[i] = Cdr (head);
X	}
X	arglist = P_List (argc-1, args);
X	val = Funcall (argv[0], arglist, 0);
X	if (!accum)
X	    continue;
X	cell = Cons (val, Null);
X	if (Nullp (list))
X	    list = cell;
X	else
X	    P_Setcdr (tail, cell);
X	tail = cell;
X    }
X    /*NOTREACHED*/
X}
X
XObject P_Map (argc, argv) Object *argv; {
X    return General_Map (argc, argv, 1);
X}
X
XObject P_For_Each (argc, argv) Object *argv; {
X    return General_Map (argc, argv, 0);
X}
X
XObject Make_Macro () {
X    Object mac;
X    register char *p;
X
X    p = Get_Bytes (sizeof (struct S_Macro));
X    SET(mac, T_Macro, (struct S_Macro *)p);
X    MACRO(mac)->body = MACRO(mac)->name = Null;
X    return mac;
X}
X
XObject P_Macro (argl) Object argl; {
X    Object mac, args, body;
X    GC_Node2;
X
X    mac = Null;
X    args = Car (argl);
X    if (TYPE(args) != T_Symbol && TYPE(args) != T_Pair && !Nullp (args))
X	Wrong_Type_Combination (args, "list or symbol");
X    GC_Link2 (argl, mac);
X    mac = Make_Macro ();
X    body = Cons (Sym_Macro, argl);
X    MACRO(mac)->body = body;
X    GC_Unlink;
X    return mac;
X}
X
XObject P_Macro_Body (m) Object m; {
X    Check_Type (m, T_Macro);
X    return Copy_List (MACRO(m)->body);
X}
X
XObject Macro_Expand (mac, argl) Object mac, argl; {
X    register argc, i, tail_calling = 0;
X    Object frame, ret, tail;
X    GC_Node4;
X    TC_Prolog;
X
X    frame = tail = Null;
X    GC_Link4 (argl, frame, tail, mac);
X    argc = Arglist_Length (argl);
X    tail = Car (Cdr (MACRO(mac)->body));
X    if (TYPE(tail) == T_Symbol) {
X	Lambda_Bind (tail, argl);
X    } else {
X	for (i = 0; TYPE(tail) == T_Pair; tail = Cdr (tail), i++) {
X	    Check_Type (Car (tail), T_Symbol);
X	    if (i == argc)
X		Primitive_Error ("too few arguments for ~s", mac);
X	    Lambda_Bind (Car (tail), Car (argl));
X	    argl = Cdr (argl);
X	}
X	if (Nullp (tail)) {
X	    if (i < argc)
X		Primitive_Error ("too many arguments for ~s", mac);
X	} else {
X	    Check_Type (tail, T_Symbol);
X	    Lambda_Bind (tail, argl);
X	}
X    }
X    Push_Frame (frame);
X    TC_Disable;
X    ret = Begin (Cdr (Cdr (MACRO(mac)->body)));
X    TC_Enable;
X    Pop_Frame ();
X    GC_Unlink;
X    return ret;
X}
X
XObject P_Macro_Expand (form) Object form; {
X    Object ret, mac;
X    GC_Node;
X
X    Check_Type (form, T_Pair);
X    GC_Link (form);
X    mac = Eval (Car (form));
X    if (TYPE(mac) != T_Macro)
X	ret = form;
X    else
X	ret = Macro_Expand (mac, Cdr (form));
X    GC_Unlink;
X    return ret;
X}
END_OF_src/proc.c
if test 13760 -ne `wc -c <src/proc.c`; then
    echo shar: \"src/proc.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f src/char.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"src/char.c\"
else
echo shar: Extracting \"src/char.c\" \(2740 characters\)
sed "s/^X//" >src/char.c <<'END_OF_src/char.c'
X/* Characters
X */
X
X#include <ctype.h>
X
X#include "scheme.h"
X
XObject Make_Char (c) register c; {
X    Object ch;
X
X    SET(ch, T_Character, (unsigned char)c);
X    return ch;
X}
X
XObject P_Charp (c) Object c; {
X    return TYPE(c) == T_Character ? True : False;
X}
X
XObject P_Char_To_Integer (c) Object c; {
X    Check_Type (c, T_Character);
X    return Make_Integer (CHAR(c));
X}
X
XObject P_Integer_To_Char (n) Object n; {
X    register i;
X
X    if ((i = Get_Integer (n)) < 0 || i > 255)
X	Range_Error (n);
X    return Make_Char (i);
X}
X
XObject P_Char_Upper_Case (c) Object c; {
X    Check_Type (c, T_Character);
X    return isupper (CHAR(c)) ? True : False;
X}
X
XObject P_Char_Lower_Case (c) Object c; {
X    Check_Type (c, T_Character);
X    return islower (CHAR(c)) ? True : False;
X}
X
XObject P_Char_Alphabetic (c) Object c; {
X    Check_Type (c, T_Character);
X    return isalpha (CHAR(c)) ? True : False;
X}
X
XObject P_Char_Numeric (c) Object c; {
X    Check_Type (c, T_Character);
X    return isdigit (CHAR(c)) ? True : False;
X}
X
XObject P_Char_Whitespace (c) Object c; {
X    register x;
X
X    Check_Type (c, T_Character);
X    x = CHAR(c);
X    return Whitespace (x) ? True : False;
X}
X
XObject P_Char_Upcase (c) Object c; {
X    Check_Type (c, T_Character);
X    return islower (CHAR(c)) ? Make_Char (toupper (CHAR(c))) : c;
X}
X
XObject P_Char_Downcase (c) Object c; {
X    Check_Type (c, T_Character);
X    return isupper (CHAR(c)) ? Make_Char (tolower (CHAR(c))) : c;
X}
X
XGeneral_Chrcmp (c1, c2, ci) Object c1, c2; register ci; {
X    Check_Type (c1, T_Character);
X    Check_Type (c2, T_Character);
X    if (ci)
X	return Char_Map[CHAR(c1)] - Char_Map[CHAR(c2)];
X    return CHAR(c1) - CHAR(c2);
X}
X
XObject P_Chr_Eq (c1, c2) Object c1, c2; {
X    return General_Chrcmp (c1, c2, 0) ? False : True;
X}
X
XObject P_Chr_Less (c1, c2) Object c1, c2; {
X    return General_Chrcmp (c1, c2, 0) < 0 ? True : False;
X}
X
XObject P_Chr_Greater (c1, c2) Object c1, c2; {
X    return General_Chrcmp (c1, c2, 0) > 0 ? True : False;
X}
X
XObject P_Chr_Eq_Less (c1, c2) Object c1, c2; {
X    return General_Chrcmp (c1, c2, 0) <= 0 ? True : False;
X}
X
XObject P_Chr_Eq_Greater (c1, c2) Object c1, c2; {
X    return General_Chrcmp (c1, c2, 0) >= 0 ? True : False;
X}
X
XObject P_Chr_CI_Eq (c1, c2) Object c1, c2; {
X    return General_Chrcmp (c1, c2, 1) ? False : True;
X}
X
XObject P_Chr_CI_Less (c1, c2) Object c1, c2; {
X    return General_Chrcmp (c1, c2, 1) < 0 ? True : False;
X}
X
XObject P_Chr_CI_Greater (c1, c2) Object c1, c2; {
X    return General_Chrcmp (c1, c2, 1) > 0 ? True : False;
X}
X
XObject P_Chr_CI_Eq_Less (c1, c2) Object c1, c2; {
X    return General_Chrcmp (c1, c2, 1) <= 0 ? True : False;
X}
X
XObject P_Chr_CI_Eq_Greater (c1, c2) Object c1, c2; {
X    return General_Chrcmp (c1, c2, 1) >= 0 ? True : False;
X}
END_OF_src/char.c
if test 2740 -ne `wc -c <src/char.c`; then
    echo shar: \"src/char.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f src/symbol.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"src/symbol.c\"
else
echo shar: Extracting \"src/symbol.c\" \(4650 characters\)
sed "s/^X//" >src/symbol.c <<'END_OF_src/symbol.c'
X/* Symbol handling and the obarray
X */
X
X#include "scheme.h"
X
XObject Obarray;
X
XObject Null,
X       True,
X       False,
X       Unbound,
X       Special,
X       Void,
X       Newline,
X       Eof,
X       Zero,
X       One;
X
XInit_Symbol () {
X    SETTYPE(Null, T_Null);
X    SETTYPE(True, T_Boolean); SETFIXNUM(True, 1);
X    SETTYPE(False, T_Boolean); SETFIXNUM(False, 0);
X    SETTYPE(Unbound, T_Unbound);
X    SETTYPE(Special, T_Special);
X    SETTYPE(Void, T_Void);
X    SETTYPE(Eof, T_End_Of_File);
X    Newline = Make_Char ('\n');
X    Zero = Make_Fixnum (0);
X    One = Make_Fixnum (1);
X    Obarray = Make_Vector (OBARRAY_SIZE, Null);
X    Global_GC_Link (Obarray);
X}
X
XObject Make_Symbol (name) Object name; {
X    Object sym;
X    register char *p;
X    register struct S_Symbol *sp;
X    GC_Node;
X
X    GC_Link (name);
X    p = Get_Bytes (sizeof (struct S_Symbol));
X    SET(sym, T_Symbol, (struct S_Symbol *)p);
X    sp = SYMBOL(sym);
X    sp->name = name;
X    sp->value = Unbound;
X    sp->plist = Null;
X    GC_Unlink;
X    return sym;
X}
X
XObject P_Symbolp (x) Object x; {
X    return TYPE(x) == T_Symbol ? True : False;
X}
X
XObject P_Symbol_To_String (x) Object x; {
X    Check_Type (x, T_Symbol);
X    return SYMBOL(x)->name;
X}
X
XObject Obarray_Lookup (str, len) register char *str; register len; {
X    register h;
X    register struct S_String *s;
X    register struct S_Symbol *sym;
X    Object p;
X
X    h = Hash (str, len) % OBARRAY_SIZE;
X    for (p = VECTOR(Obarray)->data[h]; !Nullp (p); p = sym->next) {
X	sym = SYMBOL(p);
X	s = STRING(sym->name);
X	if (s->size == len && bcmp (s->data, str, len) == 0)
X	    return p;
X    }
X    return Make_Fixnum (h);
X}
X
XObject Intern (str) char *str; {
X    Object s, *p, sym, ostr;
X    register len;
X
X    len = strlen (str);
X    s = Obarray_Lookup (str, len);
X    if (TYPE(s) != T_Fixnum)
X	return s;
X    ostr = Make_String (str, len);
X    sym = Make_Symbol (ostr);
X    p = &VECTOR(Obarray)->data[FIXNUM(s)];
X    SYMBOL(sym)->next = (TYPE(*p) == T_Fixnum) ? Null : *p;
X    *p = sym;
X    return sym;
X}
X
XObject P_String_To_Symbol (str) Object str; {
X    Object s, *p, sym;
X
X    Check_Type (str, T_String);
X    s = Obarray_Lookup (STRING(str)->data, STRING(str)->size);
X    if (TYPE(s) != T_Fixnum)
X	return s;
X    sym = Make_Symbol (str);
X    p = &VECTOR(Obarray)->data[FIXNUM(s)];
X    SYMBOL(sym)->next = (TYPE(*p) == T_Fixnum) ? Null : *p;
X    return *p = sym;
X}
X
XObject P_Oblist () {
X    register i;
X    Object p, list, bucket;
X    GC_Node2;
X
X    p = list = Null;
X    GC_Link2 (p, list);
X    for (i = 0; i < OBARRAY_SIZE; i++) {
X	bucket = Null;
X	for (p = VECTOR(Obarray)->data[i]; !Nullp (p); p = SYMBOL(p)->next)
X	    bucket = Cons (p, bucket);
X	if (!Nullp (bucket))
X	    list = Cons (bucket, list);
X    }
X    GC_Unlink;
X    return list;
X}
X
XObject P_Put (argc, argv) Object *argv; {
X    Object sym, key, last, tail, prop;
X    GC_Node3;
X
X    sym = argv[0];
X    key = argv[1];
X    Check_Type (sym, T_Symbol);
X    Check_Type (key, T_Symbol);
X    last = Null;
X    for (tail = SYMBOL(sym)->plist; !Nullp (tail); tail = Cdr (tail)) {
X	prop = Car (tail);
X	if (EQ(Car (prop), key)) {
X	    if (argc == 3)
X		Cdr (prop) = argv[2];
X	    else if (Nullp (last))
X		SYMBOL(sym)->plist = Cdr (tail);
X	    else
X		Cdr (last) = Cdr (tail);
X	    return key;
X	}
X	last = tail;
X    }
X    if (argc == 2)
X	return False;
X    GC_Link3 (sym, last, key);
X    tail = Cons (key, argv[2]);
X    tail = Cons (tail, Null);
X    if (Nullp (last))
X	SYMBOL(sym)->plist = tail;
X    else
X	Cdr (last) = tail;
X    GC_Unlink;
X    return key;
X}
X
XObject P_Get (sym, key) Object sym, key; {
X    Object prop;
X
X    Check_Type (sym, T_Symbol);
X    Check_Type (key, T_Symbol);
X    prop = Assq (key, SYMBOL(sym)->plist);
X    if (!Truep (prop))
X	return False;
X	/*
X	 * Do we want to signal an error or return #f?
X	 *
X	 * Primitive_Error ("~s has no such property: ~s", sym, key);
X	 */
X    return Cdr (prop);
X}
X
XObject P_Symbol_Plist (sym) Object sym; {
X    Check_Type (sym, T_Symbol);
X    return Copy_List (SYMBOL(sym)->plist);
X}
X
XHash (str, len) char *str; {
X    register h;
X    register char *p, *ep;
X
X    h = 5 * len;
X    if (len > 5)
X	len = 5;
X    for (p = str, ep = p+len; p < ep; ++p)
X	h = (h << 2) ^ *p;
X    return h & 017777777777;
X}
X
XDefine_Symbol (sym, name) Object *sym; char *name; {
X    *sym = Intern (name);
X    _Global_GC_Link (sym);
X}
X
XDefine_Variable (var, name, init) Object *var, init; char *name; {
X    Object frame, sym;
X    GC_Node;
X
X    GC_Link (init);
X    sym = Intern (name);
X    SYMBOL(sym)->value = init;
X    frame = Add_Binding (Car (The_Environment), sym, init);
X    *var = Car (frame);
X    Car (The_Environment) = frame;
X    _Global_GC_Link (var);
X    GC_Unlink;
X}
END_OF_src/symbol.c
if test 4650 -ne `wc -c <src/symbol.c`; then
    echo shar: \"src/symbol.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f src/macros.h -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"src/macros.h\"
else
echo shar: Extracting \"src/macros.h\" \(3835 characters\)
sed "s/^X//" >src/macros.h <<'END_OF_src/macros.h'
X#ifndef MACROS_H
X#define MACROS_H
X
X/* Miscellaneous #define's
X */
X
X#ifndef sigmask
X#define sigmask(n)  (1 << ((n)-1))
X#endif
X
X#define Nullp(x)    ((TYPE(x) == T_Null))
X#define Truep(x)    (!EQ(x,False) && !Nullp(x))
X#define Car(x)      PAIR(x)->car
X#define Cdr(x)      PAIR(x)->cdr
X#define Val(x)      Cdr(x)
X#define Cons        P_Cons
X#define Begin       P_Begin
X#define Assq(x,y)   General_Assoc(x,y,0)
X#define Print(x)    General_Print_Object (x, Curr_Output_Port, 0)
X#define Numeric(t)  (t == T_Fixnum || t == T_Flonum || t == T_Bignum)
X
X#define Whitespace(c) (c == ' ' || c == '\t' || c == '\014' || c == '\n')
X#define Delimiter(c) (c == ';' || c == ')' || c == '(' || c == '#')
X
X#ifdef USE_SIGNAL
X#  define Disable_Interrupts (void)signal (SIGINT, SIG_IGN);
X#  define Enable_Interrupts  (void)signal (SIGINT, Intr_Handler)
X#else
X#  define Disable_Interrupts (void)sigblock (sigmask (SIGINT))
X#  define Enable_Interrupts  (void)sigsetmask (0)
X#endif
X
X/* Align heap addresses */
X#define ALIGN(ptr) ((ptr) = (char *)(((int)(ptr) + 3) & ~3))
X
X/* Normalize stack addresses */
X#define NORM(addr)  ((int)(addr) + delta)
X
X/* Used in special forms: */
X#define TC_Prolog   register _t = Tail_Call
X#define TC_Disable  Tail_Call = 0
X#define TC_Enable   Tail_Call = _t
X
X#define TAG_FUN    -1
X#define TAG_ARGS   -2
X#define TAG_ENV    -3
X
X#define GC_Node     GCNODE gc1
X#define GC_Node2    GCNODE gc1, gc2
X#define GC_Node3    GCNODE gc1, gc2, gc3
X#define GC_Node4    GCNODE gc1, gc2, gc3, gc4
X#define GC_Node5    GCNODE gc1, gc2, gc3, gc4, gc5
X#define GC_Node6    GCNODE gc1, gc2, gc3, gc4, gc5, gc6
X
X#define Tag_Node    GC_Node3
X
X#define Tag_Link(args,fun,env) {\
X    gc1.gclen = TAG_ARGS; gc1.gcobj = &args; gc1.next = GC_List;\
X    gc2.gclen = TAG_FUN;  gc2.gcobj = &fun;  gc2.next = &gc1;\
X    gc3.gclen = TAG_ENV;  gc3.gcobj = &env;  gc3.next = &gc2; GC_List = &gc3;\
X}
X
X#define GC_Link(x) {\
X    gc1.gclen = 0; gc1.gcobj = &x; gc1.next = GC_List; GC_List = &gc1;\
X}
X
X#define GC_Link2(x1,x2) {\
X    gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
X    gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1; GC_List = &gc2;\
X}
X
X#define GC_Link3(x1,x2,x3) {\
X    gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
X    gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
X    gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2; GC_List = &gc3;\
X}
X
X#define GC_Link4(x1,x2,x3,x4) {\
X    gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
X    gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
X    gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2;\
X    gc4.gclen = 0; gc4.gcobj = &x4; gc4.next = &gc3; GC_List = &gc4;\
X}
X
X#define GC_Link5(x1,x2,x3,x4,x5) {\
X    gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
X    gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
X    gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2;\
X    gc4.gclen = 0; gc4.gcobj = &x4; gc4.next = &gc3;\
X    gc5.gclen = 0; gc5.gcobj = &x5; gc5.next = &gc4; GC_List = &gc5;\
X}
X
X#define GC_Link6(x1,x2,x3,x4,x5,x6) {\
X    gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
X    gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
X    gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2;\
X    gc4.gclen = 0; gc4.gcobj = &x4; gc4.next = &gc3;\
X    gc5.gclen = 0; gc5.gcobj = &x5; gc5.next = &gc4;\
X    gc6.gclen = 0; gc6.gcobj = &x6; gc6.next = &gc5; GC_List = &gc6;\
X}
X
X#define GC_Unlink (GC_List = gc1.next)
X
X#define Global_GC_Link(x) _Global_GC_Link(&x)
X
X
X#define Check_Type(x,t) {\
X    if (TYPE(x) != t) Wrong_Type (x, t);\
X}
X
X#define Check_List(x) {\
X    if (TYPE(x) != T_Pair && !Nullp (x)) Wrong_Type_Combination (x, "list");\
X}
X
X#define Check_Number(x) {\
X    register t = TYPE(x);\
X    if (!Numeric (t)) Wrong_Type_Combination (x, "number");\
X}
X
X#define Check_Integer(x) {\
X    register t = TYPE(x);\
X    if (t != T_Fixnum && t != T_Bignum) Wrong_Type (x, T_Fixnum);\
X}
X
X#endif
END_OF_src/macros.h
if test 3835 -ne `wc -c <src/macros.h`; then
    echo shar: \"src/macros.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f src/prim.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"src/prim.c\"
else
echo shar: Extracting \"src/prim.c\" \(19818 characters\)
sed "s/^X//" >src/prim.c <<'END_OF_src/prim.c'
X/* Table of primitives
X */
X
X#include "scheme.h"
X
Xstruct Prim_Init {
X    Object (*fun)();
X    char *name;
X    int minargs, maxargs;
X    enum discipline disc;
X} Primitives[] = {
X
X    /* auto.c:
X     */
X    P_Autoload,          "autoload",                       2, 2,    EVAL,
X
X    /* bool.c:
X     */
X    P_Booleanp,          "boolean?",                       1, 1,    EVAL,
X    P_Not,               "not",                            1, 1,    EVAL,
X    P_Eq,                "eq?",                            2, 2,    EVAL,
X    P_Eqv,               "eqv?",                           2, 2,    EVAL,
X    P_Equal,             "equal?",                         2, 2,    EVAL,
X
X    /* char.c:
X     */
X    P_Charp,             "char?",                          1, 1,    EVAL,
X    P_Char_To_Integer,   "char->integer",                  1, 1,    EVAL,
X    P_Integer_To_Char,   "integer->char",                  1, 1,    EVAL,
X    P_Char_Upper_Case,   "char-upper-case?",               1, 1,    EVAL,
X    P_Char_Lower_Case,   "char-lower-case?",               1, 1,    EVAL,
X    P_Char_Alphabetic,   "char-alphabetic?",               1, 1,    EVAL,
X    P_Char_Numeric,      "char-numeric?",                  1, 1,    EVAL,
X    P_Char_Whitespace,   "char-whitespace?",               1, 1,    EVAL,
X    P_Char_Upcase,       "char-upcase",                    1, 1,    EVAL,
X    P_Char_Downcase,     "char-downcase",                  1, 1,    EVAL,
X    P_Chr_Eq,            "char=?",                         2, 2,    EVAL,
X    P_Chr_Less,          "char<?",                         2, 2,    EVAL,
X    P_Chr_Greater,       "char>?",                         2, 2,    EVAL,
X    P_Chr_Eq_Less,       "char<=?",                        2, 2,    EVAL,
X    P_Chr_Eq_Greater,    "char>=?",                        2, 2,    EVAL,
X    P_Chr_CI_Eq,         "char-ci=?",                      2, 2,    EVAL,
X    P_Chr_CI_Less,       "char-ci<?",                      2, 2,    EVAL,
X    P_Chr_CI_Greater,    "char-ci>?",                      2, 2,    EVAL,
X    P_Chr_CI_Eq_Less,    "char-ci<=?",                     2, 2,    EVAL,
X    P_Chr_CI_Eq_Greater, "char-ci>=?",                     2, 2,    EVAL,
X
X    /* cont.c:
X     */
X    P_Control_Pointp,    "control-point?",                 1, 1,    EVAL,
X    P_Call_CC,           "call-with-current-continuation", 1, 1,    EVAL,
X    P_Dynamic_Wind,      "dynamic-wind",                   3, 3,    EVAL,
X    P_Control_Point_Env, "control-point-environment",      1, 1,    EVAL,
X
X    /* debug.c:
X     */
X    P_Backtrace_List,    "backtrace-list",                 0, 1,    VARARGS,
X
X    /* dump.c:
X     */
X#ifdef CAN_DUMP
X    P_Dump,              "dump",                           1, 1,    EVAL,
X#endif
X
X    /* env.c:
X     */
X    P_Environmentp,      "environment?",                   1, 1,    EVAL,
X    P_The_Environment,   "the-environment",                0, 0,    EVAL,
X    P_Global_Environment,"global-environment",             0, 0,    EVAL,
X    P_Define,            "define",                         1, MANY, NOEVAL,
X    P_Define_Macro,      "define-macro",                   1, MANY, NOEVAL,
X    P_Set,               "set!",                           2, 2,    NOEVAL,
X    P_Env_List,          "environment->list",              1, 1,    EVAL,
X    P_Boundp,            "bound?",                         1, 1,    EVAL,
X
X    /* error.c:
X     */
X    P_Error,             "error",                          2, MANY, VARARGS,
X    P_Reset,             "reset",                          0, 0,    EVAL,
X
X    /* features.c:
X     */
X    P_Featurep,          "feature?",                       1, 1,    EVAL,
X    P_Provide,           "provide",                        1, 1,    EVAL,
X    P_Require,           "require",                        1, 3,    VARARGS,
X
X    /* heap.c:
X     */
X    P_Collect,           "collect",                        0, 0,    EVAL,
X
X    /* io.c:
X     */
X    P_Port_File_Name,    "port-file-name",                 1, 1,    EVAL,
X    P_Eof_Objectp,       "eof-object?",                    1, 1,    EVAL,
X    P_Curr_Input_Port,   "current-input-port",             0, 0,    EVAL,
X    P_Curr_Output_Port,  "current-output-port",            0, 0,    EVAL,
X    P_Input_Portp,       "input-port?",                    1, 1,    EVAL,
X    P_Output_Portp,      "output-port?",                   1, 1,    EVAL,
X    P_Open_Input_File,   "open-input-file",                1, 1,    EVAL,
X    P_Open_Output_File,  "open-output-file",               1, 1,    EVAL,
X    P_Close_Port,        "close-port",                     1, 1,    EVAL,
X    P_With_Input,        "with-input-from-file",           2, 2,    EVAL,
X    P_With_Output,       "with-output-to-file",            2, 2,    EVAL,
X    P_Call_With_Input,   "call-with-input-file",           2, 2,    EVAL,
X    P_Call_With_Output,  "call-with-output-file",          2, 2,    EVAL,
X    P_Open_Input_String, "open-input-string",              1, 1,    EVAL,
X    P_Open_Output_String,"open-output-string",             0, 0,    EVAL,
X    P_Tilde_Expand,      "tilde-expand",                   1, 1,    EVAL,
X    P_File_Existsp,      "file-exists?",                   1, 1,    EVAL,
X
X    /* load.c:
X     */
X    P_Load,              "load",                           1, 2,    VARARGS,
X
X    /* list.c:
X     */
X    P_Cons,              "cons",                           2, 2,    EVAL,
X    P_Car,               "car",                            1, 1,    EVAL,
X    P_Cdr,               "cdr",                            1, 1,    EVAL,
X    P_Cddr,              "cddr",                           1, 1,    EVAL,
X    P_Cdar,              "cdar",                           1, 1,    EVAL,
X    P_Cadr,              "cadr",                           1, 1,    EVAL,
X    P_Caar,              "caar",                           1, 1,    EVAL,
X    P_Cdddr,             "cdddr",                          1, 1,    EVAL,
X    P_Cddar,             "cddar",                          1, 1,    EVAL,
X    P_Cdadr,             "cdadr",                          1, 1,    EVAL,
X    P_Cdaar,             "cdaar",                          1, 1,    EVAL,
X    P_Caddr,             "caddr",                          1, 1,    EVAL,
X    P_Cadar,             "cadar",                          1, 1,    EVAL,
X    P_Caadr,             "caadr",                          1, 1,    EVAL,
X    P_Caaar,             "caaar",                          1, 1,    EVAL,
X    P_Cxr,               "cxr",                            2, 2,    EVAL,
X    P_Nullp,             "null?",                          1, 1,    EVAL,
X    P_Pairp,             "pair?",                          1, 1,    EVAL,
X    P_Setcar,            "set-car!",                       2, 2,    EVAL,
X    P_Setcdr,            "set-cdr!",                       2, 2,    EVAL,
X    P_Assq,              "assq",                           2, 2,    EVAL,
X    P_Assv,              "assv",                           2, 2,    EVAL,
X    P_Assoc,             "assoc",                          2, 2,    EVAL,
X    P_Memq,              "memq",                           2, 2,    EVAL,
X    P_Memv,              "memv",                           2, 2,    EVAL,
X    P_Member,            "member",                         2, 2,    EVAL,
X    P_Make_List,         "make-list",                      2, 2,    EVAL,
X    P_List,              "list",                           0, MANY, VARARGS,
X    P_Length,            "length",                         1, 1,    EVAL,
X    P_Append,            "append",                         0, MANY, VARARGS,
X    P_Append_Set,        "append!",                        0, MANY, VARARGS,
X    P_Last_Pair,         "last-pair",                      1, 1,    EVAL,
X    P_Reverse,           "reverse",                        1, 1,    EVAL,
X    P_Reverse_Set,       "reverse!",                       1, 1,    EVAL,
X    P_List_Tail,         "list-tail",                      2, 2,    EVAL,
X    P_List_Ref,          "list-ref",                       2, 2,    EVAL,
X
X    /* main.c:
X     */
X    P_Command_Line_Args, "command-line-args",              0, 0,    EVAL,
X
X    /* math.c:
X     */
X    P_Numberp,           "number?",                        1, 1,    EVAL,
X    P_Complexp,          "complex?",                       1, 1,    EVAL,
X    P_Realp,             "real?",                          1, 1,    EVAL,
X    P_Rationalp,         "rational?",                      1, 1,    EVAL,
X    P_Integerp,          "integer?",                       1, 1,    EVAL,
X    P_Zerop,             "zero?",                          1, 1,    EVAL,
X    P_Positivep,         "positive?",                      1, 1,    EVAL,
X    P_Negativep,         "negative?",                      1, 1,    EVAL,
X    P_Oddp,              "odd?",                           1, 1,    EVAL,
X    P_Evenp,             "even?",                          1, 1,    EVAL,
X    P_Exactp,            "exact?",                         1, 1,    EVAL,
X    P_Inexactp,          "inexact?",                       1, 1,    EVAL,
X    P_Generic_Equal,     "=",                              1, MANY, VARARGS,
X    P_Generic_Less,      "<",                              1, MANY, VARARGS,
X    P_Generic_Greater,   ">",                              1, MANY, VARARGS,
X    P_Generic_Eq_Less,   "<=",                             1, MANY, VARARGS,
X    P_Generic_Eq_Greater,">=",                             1, MANY, VARARGS,
X    P_Inc,               "1+",                             1, 1,    EVAL,
X    P_Dec,               "1-",                             1, 1,    EVAL,
X    P_Generic_Plus,      "+",                              0, MANY, VARARGS,
X    P_Generic_Minus,     "-",                              1, MANY, VARARGS,
X    P_Generic_Multiply,  "*",                              0, MANY, VARARGS,
X    P_Generic_Divide,    "/",                              1, MANY, VARARGS,
X    P_Abs,               "abs",                            1, 1,    EVAL,
X    P_Quotient,          "quotient",                       2, 2,    EVAL,
X    P_Remainder,         "remainder",                      2, 2,    EVAL,
X    P_Modulo,            "modulo",                         2, 2,    EVAL,
X    P_Gcd,               "gcd",                            0, MANY, VARARGS,
X    P_Lcm,               "lcm",                            0, MANY, VARARGS,
X    P_Floor,             "floor",                          1, 1,    EVAL,
X    P_Ceiling,           "ceiling",                        1, 1,    EVAL,
X    P_Truncate,          "truncate",                       1, 1,    EVAL,
X    P_Round,             "round",                          1, 1,    EVAL,
X    P_Sqrt,              "sqrt",                           1, 1,    EVAL,
X    P_Exp,               "exp",                            1, 1,    EVAL,
X    P_Log,               "log",                            1, 1,    EVAL,
X    P_Sin,               "sin",                            1, 1,    EVAL,
X    P_Cos,               "cos",                            1, 1,    EVAL,
X    P_Tan,               "tan",                            1, 1,    EVAL,
X    P_Asin,              "asin",                           1, 1,    EVAL,
X    P_Acos,              "acos",                           1, 1,    EVAL,
X    P_Atan,              "atan",                           1, 2,    VARARGS,
X    P_Min,               "min",                            1, MANY, VARARGS,
X    P_Max,               "max",                            1, MANY, VARARGS,
X    P_Random,            "random",                         0, 0,    EVAL,
X    P_Srandom,           "srandom",                        1, 1,    EVAL,
X
X    /* prim.c:
X     */
X
X    /* print.c:
X     */
X    P_Write,             "write",                          1, 2,    VARARGS,
X    P_Display,           "display",                        1, 2,    VARARGS,
X    P_Write_Char,        "write-char",                     1, 2,    VARARGS,
X    P_Newline,           "newline",                        0, 1,    VARARGS,
X    P_Print,             "print",                          1, 2,    VARARGS,
X    P_Clear_Output_Port, "clear-output-port",              0, 1,    VARARGS,
X    P_Flush_Output_Port, "flush-output-port",              0, 1,    VARARGS,
X    P_Get_Output_String, "get-output-string",              1, 1,    EVAL,
X    P_Format,            "format",                         2, MANY, VARARGS,
X
X    /* proc.c:
X     */
X    P_Procedurep,        "procedure?",                     1, 1,    EVAL,
X    P_Primitivep,        "primitive?",                     1, 1,    EVAL,
X    P_Compoundp,         "compound?",                      1, 1,    EVAL,
X    P_Macrop,            "macro?",                         1, 1,    EVAL,
X    P_Eval,              "eval",                           1, 2,    VARARGS,
X    P_Apply,             "apply",                          2, MANY, VARARGS,
X    P_Lambda,            "lambda",                         2, MANY, NOEVAL,
X    P_Procedure_Env,     "procedure-environment",          1, 1,    EVAL,
X    P_Procedure_Lambda,  "procedure-lambda",               1, 1,    EVAL,
X    P_Begin,             "begin",                          1, MANY, NOEVAL,
X    P_Begin1,            "begin1",                         1, MANY, NOEVAL,
X    P_Map,               "map",                            2, MANY, VARARGS,
X    P_For_Each,          "for-each",                       2, MANY, VARARGS,
X    P_Macro,             "macro",                          2, MANY, NOEVAL,
X    P_Macro_Body,        "macro-body",                     1, 1,    EVAL,
X    P_Macro_Expand,      "macro-expand",                   1, 1,    EVAL,
X
X    /* promise.c:
X     */
X    P_Delay,             "delay",                          1, 1,    NOEVAL,
X    P_Force,             "force",                          1, 1,    EVAL,
X    P_Promisep,          "promise?",                       1, 1,    EVAL,
X    P_Promise_Env,       "promise-environment",            1, 1,    EVAL,
X
X    /* read.c:
X     */
X    P_Exit,              "exit",                           0, 1,    VARARGS,
X    P_Clear_Input_Port,  "clear-input-port",               0, 1,    EVAL,
X    P_Read,              "read",                           0, 1,    VARARGS,
X    P_Read_Char,         "read-char",                      0, 1,    VARARGS,
X    P_Read_String,       "read-string",                    0, 1,    VARARGS,
X    P_Unread_Char,       "unread-char",                    1, 2,    VARARGS,
X
X    /* special.c:
X     */
X    P_Quote,             "quote",                          1, 1,    NOEVAL,
X    P_Quasiquote,        "quasiquote",                     1, 1,    NOEVAL,
X    P_If,                "if",                             2, MANY, NOEVAL,
X    P_Case,              "case",                           1, MANY, NOEVAL,
X    P_Cond,              "cond",                           1, MANY, NOEVAL,
X    P_Do,                "do",                             2, MANY, NOEVAL,
X    P_Let,               "let",                            2, MANY, NOEVAL,
X    P_Letseq,            "let*",                           2, MANY, NOEVAL,
X    P_Letrec,            "letrec",                         2, MANY, NOEVAL,
X    P_Fluid_Let,         "fluid-let",                      2, MANY, NOEVAL,
X    P_And,               "and",                            0, MANY, NOEVAL,
X    P_Or,                "or",                             0, MANY, NOEVAL,
X
X    /* string.c:
X     */
X    P_String,            "string",                         0, MANY, VARARGS,
X    P_Stringp,           "string?",                        1, 1,    EVAL,
X    P_Make_String,       "make-string",                    1, 2,    VARARGS,
X    P_String_Length,     "string-length",                  1, 1,    EVAL,
X    P_String_To_Number,  "string->number",                 1, 1,    EVAL,
X    P_String_Ref,        "string-ref",                     2, 2,    EVAL,
X    P_String_Set,        "string-set!",                    3, 3,    EVAL,
X    P_Substring,         "substring",                      3, 3,    EVAL,
X    P_String_Copy,       "string-copy",                    1, 1,    EVAL,
X    P_String_Append,     "string-append",                  0, MANY, VARARGS,
X    P_List_To_String,    "list->string",                   1, 1,    EVAL,
X    P_String_To_List,    "string->list",                   1, 1,    EVAL,
X    P_String_Fill,       "string-fill!",                   2, 2,    EVAL,
X    P_Substring_Fill,    "substring-fill!",                4, 4,    EVAL,
X    P_Str_Eq,            "string=?",                       2, 2,    EVAL,
X    P_Str_Less,          "string<?",                       2, 2,    EVAL,
X    P_Str_Greater,       "string>?",                       2, 2,    EVAL,
X    P_Str_Eq_Less,       "string<=?",                      2, 2,    EVAL,
X    P_Str_Eq_Greater,    "string>=?",                      2, 2,    EVAL,
X    P_Str_CI_Eq,         "string-ci=?",                    2, 2,    EVAL,
X    P_Str_CI_Less,       "string-ci<?",                    2, 2,    EVAL,
X    P_Str_CI_Greater,    "string-ci>?",                    2, 2,    EVAL,
X    P_Str_CI_Eq_Less,    "string-ci<=?",                   2, 2,    EVAL,
X    P_Str_CI_Eq_Greater, "string-ci>=?",                   2, 2,    EVAL,
X    P_Substringp,        "substring?",                     2, 2,    EVAL,
X    P_CI_Substringp,     "substring-ci?",                  2, 2,    EVAL,
X
X    /* symbol.c:
X     */
X    P_String_To_Symbol,  "string->symbol",                 1, 1,    EVAL,
X    P_Oblist,            "oblist",                         0, 0,    EVAL,
X    P_Symbolp,           "symbol?",                        1, 1,    EVAL,
X    P_Symbol_To_String,  "symbol->string",                 1, 1,    EVAL,
X    P_Put,               "put",                            2, 3,    VARARGS,
X    P_Get,               "get",                            2, 2,    EVAL,
X    P_Symbol_Plist,      "symbol-plist",                   1, 1,    EVAL,
X
X    /* type.c:
X     */
X    P_Type,              "type",                           1, 1,    EVAL,
X    P_Voidp,             "void?",                          1, 1,    EVAL,
X
X    /* vector.c:
X     */
X    P_Vectorp,           "vector?",                        1, 1,    EVAL,
X    P_Make_Vector,       "make-vector",                    1, 2,    VARARGS,
X    P_Vector,            "vector",                         0, MANY, VARARGS,
X    P_Vector_Length,     "vector-length",                  1, 1,    EVAL,
X    P_Vector_Ref,        "vector-ref",                     2, 2,    EVAL,
X    P_Vector_Set,        "vector-set!",                    3, 3,    EVAL,
X    P_Vector_To_List,    "vector->list",                   1, 1,    EVAL,
X    P_List_To_Vector,    "list->vector",                   1, 1,    EVAL,
X    P_Vector_Fill,       "vector-fill!",                   2, 2,    EVAL,
X    P_Vector_Copy,       "vector-copy",                    1, 1,    EVAL,
X
X    0
X};
X
X/* The C-compiler can't initialize unions, thus the primitive procedures
X * must be created during run-time (the problem actually is that one can't
X * provide an intializer for the "tag" component of an S_Primitive).
X */
X
XInit_Prim () {
X    register struct Prim_Init *p;
X    Object frame, prim, sym;
X
X    for (frame = Car (The_Environment), p = Primitives; p->fun; p++) {
X	prim = Make_Primitive (p->fun, p->name, p->minargs, p->maxargs,
X	    p->disc);
X	sym = Intern (p->name);
X	frame = Add_Binding (frame, sym, prim);
X    }
X    Car (The_Environment) = frame;
X    Memoize_Frame (frame);
X}
X
XDefine_Primitive (fun, name, min, max, disc) Object (*fun)(); char *name;
X	enum discipline disc; {
X    Object prim, sym, frame;
X    GC_Node2;
X
X    Error_Tag = "define-primitive";
X    prim = Make_Primitive (fun, name, min, max, disc);
X    sym = Null;
X    GC_Link2 (prim, sym);
X    sym = Intern (name);
X    if (disc == EVAL && min != max)
X	Primitive_Error ("~s: number of arguments must be fixed", sym);
X    frame = Add_Binding (Car (The_Environment), sym, prim);
X    SYMBOL(sym)->value = prim;
X    Car (The_Environment) = frame;
X    GC_Unlink;
X}
END_OF_src/prim.c
if test 19818 -ne `wc -c <src/prim.c`; then
    echo shar: \"src/prim.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f src/stack.s.vax -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"src/stack.s.vax\"
else
echo shar: Extracting \"src/stack.s.vax\" \(954 characters\)
sed "s/^X//" >src/stack.s.vax <<'END_OF_src/stack.s.vax'
X	.text
X
X	.globl	_stkbase
X	.globl	_Special
X
X	.globl	_stksize
X	.align	2
X_stksize:
X	.word	0x0000
X	movl	_stkbase,r0
X	subl2	sp,r0
X	addl2	$120,r0
X	ret
X
X	.globl	_saveenv
X	.align	2
X_saveenv:
X	.word	0x0000		# don't save any regs
X	movl	4(ap),r0	# buffer        -> r0
X	movl	fp,4(r0)	# frame pointer -> r0[1]
X	movl	16(fp),8(r0)	# pc of caller  -> r0[2]
X	movl	sp,12(r0)	# sp            -> r0[3]
X
X	movl	sp,r2		# set up loop
X	movl	_stkbase,r3
X	movl	r0,r4
X	addl2	$110,r4
Xrep1:
X	movl	(r2)+,(r4)+	# should use movc3
X	cmpl	r2,r3
X	blss	rep1
X
X	movl	r4,r3		# new-old -> r0[0]  (``relocation'')
X	subl2	r2,r3
X	movl	r3,(r0)
X
X	movl	_Special,r0
X	ret
X
X	.globl	_jmpenv
X	.align	2
X_jmpenv:
X	.word	0x0000
X	movl	8(ap),r0	# return value
X	movl	4(ap),r1	# buffer
X
X	movl	12(r1),sp	# restore sp
X	movl	sp,r2		# set up loop
X	movl	_stkbase,r3
X	movl	r1,r4
X	addl2	$110,r4
Xrep2:
X	movl	(r4)+,(r2)+	# should use movc3
X	cmpl	r2,r3
X	blss	rep2
X
X	movl	4(r1),fp	# restore fp
X	ret			# return from _saveenv
END_OF_src/stack.s.vax
if test 954 -ne `wc -c <src/stack.s.vax`; then
    echo shar: \"src/stack.s.vax\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test ! -d scm ; then
    echo shar: Creating directory \"scm\"
    mkdir scm
fi
echo shar: End of archive 4 \(of 14\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 14 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0