#define MK(x,y,z) mfun(x,y,z)
#define FIDDLE(a,b,c,d) a->clb=newdot(); (a->clb->car=newint())->i=b->i; \
a->clb->cdr=newdot(); (a->clb->cdr->car=newint())->i=c->i; \
a->clb->cdr->cdr=newdot(); (a->clb->cdr->cdr->car=newint())->i=d; \
b = a->clb->car; c = a->clb->cdr->car; \
copval(a,a->clb); a->clb = nil;
#define cforget(x) protect(x); Lforget(); unprot();
/* The following array serves as the temporary counters of the items */
/* and pages used in each space. */
long int tint
[18]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int initflag
= TRUE
; /* starts off TRUE to indicate unsafe to gc */
/* system list structure and atoms are initialized. */
/* Before any lisp data can be created, the space usage */
/* counters must be set up, temporarily in array tint. */
atom_items
= (lispval
) &tint
[0];
atom_pages
= (lispval
) &tint
[1];
str_items
= (lispval
) &tint
[2];
str_pages
= (lispval
) &tint
[3];
int_items
= (lispval
) &tint
[4];
int_pages
= (lispval
) &tint
[5];
dtpr_items
= (lispval
) &tint
[6];
dtpr_pages
= (lispval
) &tint
[7];
doub_items
= (lispval
) &tint
[8];
doub_pages
= (lispval
) &tint
[9];
sdot_items
= (lispval
) &tint
[10];
sdot_pages
= (lispval
) &tint
[11];
array_items
= (lispval
) &tint
[12];
array_pages
= (lispval
) &tint
[13];
val_items
= (lispval
) &tint
[14];
val_pages
= (lispval
) &tint
[15];
funct_items
= (lispval
) &tint
[16];
funct_pages
= (lispval
) &tint
[17];
/* This also applies to the garbage collection threshhold */
gcthresh
= (lispval
) &tgcthresh
;
/* Now we commence constructing system lisp structures. */
/* nil is a special case, constructed especially at location zero */
hasht
['n'^'i'^'l'] = (struct atom
*)nil
;
atom_name
= matom("symbol");
str_name
= matom("string");
int_name
= matom("fixnum");
dtpr_name
= matom("list");
doub_name
= matom("flonum");
sdot_name
= matom("bignum");
array_name
= matom("array");
val_name
= matom("value");
funct_name
= matom("binary");
/* set up the name stack as an array of pointers */
lbot
= orgnp
= np
= ((struct argent
*)csegment(val_name
,NAMESIZE
));
nplim
= orgnp
+NAMESIZE
-5;
temp
= matom("namestack");
nstack
= temp
->fnbnd
= newarray();
nstack
->data
= (char *) (np
);
(nstack
->length
= newint())->i
= NAMESIZE
;
(nstack
->delta
= newint())->i
= sizeof(struct argent
);
/* set up the binding stack as an array of dotted pairs */
orgbnp
= bnp
= ((struct nament
*)csegment(dtpr_name
,NAMESIZE
));
bnplim
= orgbnp
+NAMESIZE
-5;
temp
= matom("bindstack");
bstack
= temp
->fnbnd
= newarray();
bstack
->data
= (char *) (bnp
);
(bstack
->length
= newint())->i
= NAMESIZE
;
(nstack
->delta
= newint())->i
= sizeof(struct nament
);
lambda
= matom("lambda");
nlambda
= matom("nlambda");
ibase
= matom("ibase"); /* base for input conversion */
ibase
->clb
= inewint(10);
Vpiport
= matom("piport");
Vpiport
->clb
= P(piport
= stdin
); /* standard input */
Vpoport
= matom("poport");
Vpoport
->clb
= P(poport
= stdout
); /* stand. output */
matom("errport")->clb
= (P(errport
= stderr
));/* stand. err. */
(Vreadtable
= matom("readtable"))->clb
= Imkrtab(0);
/* The following atoms are used as tokens by the reader */
(Eofa
= matom("eof"))->clb
= eofa
;
cara
= MK("car",Lcar
,lambda
);
cdra
= MK("cdr",Lcdr
,lambda
);
/* The following few atoms have values the reader tokens. */
/* Perhaps this is a kludge which should be abandoned. */
/* On the other hand, perhaps it is an inspiration. */
matom("perd")->clb
= perda
;
matom("lpar")->clb
= lpara
;
matom("rpar")->clb
= rpara
;
matom("lbkt")->clb
= lbkta
;
matom("rbkt")->clb
= rbkta
;
noptop
= matom("noptop");
/* atoms used in connection with comments. */
commta
= matom("comment");
rcomms
= matom("readcomments");
/* the following atoms are used for lexprs */
lexpr_atom
= matom("last lexpr binding\7");
plima
= matom("pagelimit"); /* max number of pages */
Veval
= MK("eval",Leval
,lambda
);
MK("random",Lrandom
,lambda
);
MK("apply",Lapply
,lambda
);
MK("funcall",Lfuncal
,lambda
);
MK("return",Lreturn
,lambda
);
MK("retbrk",Lretbrk
,lambda
);
MK("cont",Lreturn
,lambda
);
MK("scons",Lscons
,lambda
);
MK("caddr",Lc12r
,lambda
);
MK("cdddr",Lc03r
,lambda
);
MK("cadddr",Lc13r
,lambda
);
MK("cddddr",Lc04r
,lambda
);
MK("caddddr",Lc14r
,lambda
);
MK("nthelem",Lnthelem
,lambda
);
MK("equal",Lequal
,lambda
);
MK("numberp",Lnumberp
,lambda
);
MK("portp",Lportp
,lambda
);
MK("arrayp",Larrayp
,lambda
);
MK("valuep",Lvaluep
,lambda
);
MK("get_pname",Lpname
,lambda
);
MK("arrayref",Larrayref
,lambda
);
MK("marray",Lmarray
,lambda
);
MK("getlength",Lgetl
,lambda
);
MK("putlength",Lputl
,lambda
);
MK("getaccess",Lgeta
,lambda
);
MK("putaccess",Lputa
,lambda
);
MK("getdelta",Lgetdel
,lambda
);
MK("putdelta",Lputdel
,lambda
);
MK("getaux",Lgetaux
,lambda
);
MK("putaux",Lputaux
,lambda
);
MK("mfunction",Lmfunction
,lambda
);
MK("getentry",Lgetentry
,lambda
);
MK("getdisc",Lgetdisc
,lambda
);
MK("segment",Lsegment
,lambda
);
MK("rplaca",Lrplaca
,lambda
);
MK("rplacd",Lrplacd
,lambda
);
MK("replace",Lreplace
,lambda
);
MK("infile",Linfile
,lambda
);
MK("outfile",Loutfile
,lambda
);
MK("terpr",Lterpr
,lambda
);
MK("print",Lprint
,lambda
);
MK("close",Lclose
,lambda
);
MK("patom",Lpatom
,lambda
);
MK("pntlen",Lpntlen
,lambda
);
MK("ratom",Lratom
,lambda
);
MK("readc",Lreadc
,lambda
);
MK("implode",Limplode
,lambda
);
MK("maknam",Lmaknam
,lambda
);
MK("concat",Lconcat
,lambda
);
MK("uconcat",Luconcat
,lambda
);
MK("putprop",Lputprop
,lambda
);
MK("prog",Nprog
,nlambda
);
quota
= MK("quote",Nquote
,nlambda
);
MK("function",Nfunction
,nlambda
);
MK("*catch",Ncatch
,nlambda
);
MK("errset",Nerrset
,nlambda
);
MK("status",Nstatus
,nlambda
);
MK("sstatus",Nsstatus
,nlambda
);
MK("*throw",Nthrow
,lambda
); /* this is a lambda now !! */
MK("reset",Nreset
,nlambda
);
MK("break",Nbreak
,nlambda
);
MK("setq",Nsetq
,nlambda
);
MK("cond",Ncond
,nlambda
);
MK("nwritn",Lnwritn
,lambda
);
MK("process",Nprocess
,nlambda
); /* execute a shell command */
MK("allocate",Lalloc
,lambda
); /* allocate a page */
MK("sizeof",Lsizeof
,lambda
); /* size of one item of a data type */
MK("dumplisp",Ndumpli
,nlambda
); /* save the world */
MK("top-level",Ntpl
,nlambda
); /* top level eval-print read loop */
startup
= matom("startup"); /* used by save and restore */
MK("mapcar",Lmapcar
,lambda
);
MK("maplist",Lmaplist
,lambda
);
MK("mapcan",Lmapcan
,lambda
);
MK("mapcon",Lmapcon
,lambda
);
MK("flatsize",Lflatsi
,lambda
);
MK("alphalessp",Lalfalp
,lambda
);
MK("drain",Ldrain
,lambda
);
MK("killcopy",Lkilcopy
,lambda
); /* forks aand aborts for adb */
MK("opval",Lopval
,lambda
); /* sets and retrieves system variables */
MK("ncons",Lncons
,lambda
);
sysa
= matom("sys"); /* sys indicator for system variables */
MK("remob",Lforget
,lambda
); /* function to take atom out of hash table */
splice
= matom("splicing");
MK("times",Ltimes
,lambda
);
MK("difference",Lsub
,lambda
);
MK("quotient",Lquo
,lambda
);
MK("minus",Lminus
,lambda
);
MK("absval",Labsval
,lambda
);
MK("greaterp",Lgreaterp
,lambda
);
MK("lessp",Llessp
,lambda
);
MK("zerop",Lzerop
,lambda
);
MK("minusp",Lnegp
,lambda
);
MK("product",Ltimes
,lambda
);
MK("progv",Nprogv
,nlambda
);
MK("progn",Nprogn
,nlambda
);
MK("prog2",Nprog2
,nlambda
);
MK("oblist",Loblist
,lambda
);
MK("baktrace",Lbaktra
,lambda
);
MK("tyipeek",Ltyipeek
,lambda
);
MK("setsyntax",Lsetsyn
,lambda
);
MK("makereadtable",Lmakertbl
,lambda
);
MK("zapline",Lzaplin
,lambda
);
MK("aexplode",Lexplda
,lambda
);
MK("aexplodec",Lexpldc
,lambda
);
MK("aexploden",Lexpldn
,lambda
);
MK("showstack",Lshostk
,lambda
);
MK("resetio",Nreseti
,nlambda
);
MK("chdir",Lchdir
,lambda
);
MK("ascii",Lascii
,lambda
);
MK("boole",Lboole
,lambda
);
MK("type",Ltype
,lambda
); /* returns type-name of argument */
MK("float",Lfloat
,lambda
);
MK("Divide",LDivide
,lambda
);
MK("Emuldiv",LEmuldiv
,lambda
);
MK("readlist",Lreadli
,lambda
);
MK("plist",Lplist
,lambda
); /* gives the plist of an atom */
MK("setplist",Lsetpli
,lambda
); /* get plist of an atom */
MK("eval-when",Nevwhen
,nlambda
);
MK("syscall",Nsyscall
,nlambda
);
MK("ptime",Lptime
,lambda
); /* return process user time */
MK("fdopen",Lfdopen,lambda);
MK("exece",Lexece,lambda);
MK("gensym",Lgensym
,lambda
);
MK("remprop",Lremprop
,lambda
);
MK("bcdad",Lbcdad
,lambda
);
MK("symbolp",Lsymbolp
,lambda
);
MK("stringp",Lstringp
,lambda
);
MK("rematom",Lrematom
,lambda
);
MK("prname",Lprname
,lambda
);
MK("getenv",Lgetenv
,lambda
);
MK("makunbound",Lmakunb
,lambda
);
MK("haipart",Lhaipar
,lambda
);
MK("haulong",Lhau
,lambda
);
MK("signal",Lsignal
,lambda
);
MK("fasl",Lfasl
,lambda
); /* read in compiled file */
MK("bind",Lbind
,lambda
); /* like fasl but for functions
loaded in when the lisp system
MK("boundp",Lboundp
,lambda
); /* tells if an atom is bound */
MK("fake",Lfake
,lambda
); /* makes a fake lisp pointer */
MK("od",Lod
,lambda
); /* dumps info */
MK("what",Lwhat
,lambda
); /* converts a pointer to an integer */
MK("pv%",Lpolyev
,lambda
); /* polynomial evaluation instruction */
odform
= matom("odformat"); /* format for printf's used in od */
rdrsdot
= newsdot(); /* used in io conversions of bignums */
rdrint
= newint(); /* used as a temporary integer */
(nilplist
= newdot())->cdr
= newdot();
/* used as property list for nil,
since nil will eventually be put at
0 (consequently in text and not
(Vererr
= matom("ER%err"))->clb
= nil
;
(Vertpl
= matom("ER%tpl"))->clb
= nil
;
(Verall
= matom("ER%all"))->clb
= nil
;
(Vermisc
= matom("ER%misc"))->clb
= nil
;
(Vlerall
= newdot())->car
= Verall
; /* list (ER%all) */
/* set up the initial status list */
stlist
= nil
; /* initially nil */
Iaddstat(matom("features"),ST_READ
,ST_NO
,nil
);
Iaddstat(matom("feature"),ST_FEATR
,ST_FEATW
,nil
);
Isstatus(matom("feature"),matom("franz"));
Iaddstat(matom("nofeature"),ST_NFETR
,ST_NFETW
,nil
);
Iaddstat(matom("syntax"),ST_SYNT
,ST_NO
,nil
);
Iaddstat(matom("uctolc"),ST_READ
,ST_TOLC
,nil
);
Iaddstat(matom("dumpcore"),ST_READ
,ST_CORE
,nil
);
Isstatus(matom("dumpcore"),nil
); /*set up signals*/
Iaddstat(matom("chainatom"),ST_RINTB
,ST_INTB
,inewint(0));
Iaddstat(matom("dumpmode"),ST_DMPR
,ST_DMPW
,nil
);
/* garbage collector things */
gcafter
= MK("gcafter",Ngcafter
,nlambda
); /* garbage collection wind-up */
gcport
= matom("gcport"); /* port for gc dumping */
gccheck
= matom("gccheck"); /* flag for checking during gc */
gcdis
= matom("gcdisable"); /* option for disabling the gc */
gcload
= matom("gcload"); /* option for gc while loading */
loading
= matom("loading"); /* flag--in loader if = t */
noautot
= matom("noautotrace"); /* option to inhibit auto-trace */
(gcthresh
= newint())->i
= tgcthresh
;
gccall1
= newdot(); gccall2
= newdot(); /* used to call gcafter */
gccall1
->car
= gcafter
; /* start constructing a form for eval */
arrayst
= mstr("ARRAY"); /* array marker in name stack */
bcdst
= mstr("BINARY"); /* binary function marker */
listst
= mstr("INTERPRETED"); /* interpreted function marker */
macrost
= mstr("MACRO"); /* macro marker */
protst
= mstr("PROTECTED"); /* protection marker */
badst
= mstr("BADPTR"); /* bad pointer marker */
argst
= mstr("ARGST"); /* argument marker */
FIDDLE(atom_name
,atom_items
,atom_pages
,ATOMSPP
);
FIDDLE(str_name
,str_items
,str_pages
,STRSPP
);
FIDDLE(int_name
,int_items
,int_pages
,INTSPP
);
FIDDLE(dtpr_name
,dtpr_items
,dtpr_pages
,DTPRSPP
);
FIDDLE(doub_name
,doub_items
,doub_pages
,DOUBSPP
);
FIDDLE(sdot_name
,sdot_items
,sdot_pages
,SDOTSPP
);
FIDDLE(array_name
,array_items
,array_pages
,ARRAYSPP
);
FIDDLE(val_name
,val_items
,val_pages
,VALSPP
);
FIDDLE(funct_name
,funct_items
,funct_pages
,BCDSPP
);
(plimit
= newint())->i
= PAGE_LIMIT
;
copval(plima
,plimit
); /* default value */
/* the following atom is used when reading caar, cdar, etc. */
/* now it is OK to collect garbage */
/* matom("name") ******************************************************/
/* simulates an atom being read in from the reader and returns a */
/* BEWARE: if an atom becomes "truly worthless" and is collected, */
/* the pointer becomes obsolete. */
/* mstr ***************************************************************/
/* Makes a string. Uses matom. */
/* Not the most efficient but will do until the string from the code */
/* itself can be used as a lispval. */
lispval
mstr(string
) char *string
;
return((lispval
)(inewstr(string
)));
/* mfun("name",entry) *************************************************/
/* Same as matom, but entry point to c code is associated with */
/* "name" as function binding. */
/* A pointer to the atom is returned. */
lispval
mfun(string
,entry
,discip
) char *string
; lispval (*entry
)(), discip
;
v
->fnbnd
->discipline
= discip
;