v08i052: Elk (Extension Language Toolkit) part 04 of 14
Brandon S. Allbery - comp.sources.misc
allbery at uunet.UU.NET
Sun Sep 24 07:40:06 AEST 1989
Posting-number: Volume 8, Issue 52
Submitted-by: net at 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 at 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
More information about the Comp.sources.misc
mailing list