home *** CD-ROM | disk | FTP | other *** search
- /* --------------------------------------------------------------------------
- * builtin.c: Copyright (c) Mark P Jones 1991-1993. All rights reserved.
- * See goferite.h for details and conditions of use etc...
- * Gofer version 2.28 January 1993
- *
- * Primitive functions, input output etc...
- * ------------------------------------------------------------------------*/
-
- #define NEED_MATH
- #include "prelude.h"
- #include "storage.h"
- #include "connect.h"
- #include "errors.h"
-
- #if MPW
- #pragma segment Builtin
- #endif
-
- Name nameFatbar, nameFail; /* primitives reqd for translation */
- Name nameIf, nameSel;
- Name nameMinus, nameDivide;
-
- Name nameUndefMem; /* undefined member primitive */
- Name nameError; /* error primitive function */
- Name nameBlackHole; /* for GC-detected black hole */
-
- Name nameAnd, nameOr; /* built-in logical connectives */
- Name nameOtherwise;
-
- Name namePrint, nameNPrint; /* primitives for printing */
-
- /* Should probably be standard? KH */
- #if 1
- static Name nameAsinh, nameAcosh, nameAtanh; /* Float primitives */
- #endif
-
- #ifdef LAMBDAVAR
- static Name nameLvUnbound; /* unbound mutable variable */
- #endif
- #ifdef LAMBDANU
- static Name nameLnUnbound; /* unbound mutable variable */
- static Name nameLnNocont; /* unspecified continuation */
- static Name nameLnFlip; /* simple flip primitive */
- static Name nameLnDone; /* simple finishing continuation */
- #endif
-
-
- #if MAC
- static Name nameUnitIO; /* unitIO primitive */
- static Name nameCUnitIO; /* unitIO primitive closure */
-
- static Name nameBindIO; /* bindIO primitive */
- static Name nameCBindIO; /* bindIO primitive closure */
- static Name nameCCBindIO; /* second bindIO primitive closure */
-
- static Name nameTrap; /* Trap primitive */
- static Name nameTrapReg; /* Trap Register primitive */
- static Name nameAssign; /* Assign primitive */
- static Name nameAssignS; /* Short Assign primitive */
- static Name nameAssignC; /* Char Assign primitive */
- static Name nameAssignBlock; /* Block Assign primitive */
- static Name nameMalloc; /* Malloc primitive */
- static Name nameFree; /* Free primitive */
- static Name nameDeref; /* Deref primitive */
- static Name nameSeq; /* Seq primitive */
- static Name nameTrace; /* Trace primitive */
-
- static Name nameButton; /* Button primitive */
- static Name nameGetMouse; /* GetMouse primitive */
- static Name nameLineTo; /* LineTo primitive */
- static Name nameMoveTo; /* MoveTo primitive */
-
- static Name nameGetNextEvt; /* Event reading primitive */
- static Name nameEvtAvail; /* Event testing primitive */
-
- static Name nameCreateCallback; /* Create callback fn primitive */
- static Name nameDisposeCallback; /* Dispose callback fn primitive */
-
- extern Name nameImperate; /* Imperate request */
- extern Name nameIO; /* IO constructor */
- #endif
-
- /* --------------------------------------------------------------------------
- * Built-in primitives:
- * ------------------------------------------------------------------------*/
-
- #if MPW
- #pragma segment Primitives
- #endif
-
- #define PRIMITIVES_CODE 1 /* want to include code for prims */
- #include "prims.c"
-
- #if MPW
- #pragma segment Builtin2
- #endif
-
- /* --------------------------------------------------------------------------
- * Built-in control:
- * ------------------------------------------------------------------------*/
-
- Void builtIn(what)
- Int what; {
- Int i;
-
- switch (what) {
- case RESET : if (writingFile) {
- fclose(writingFile);
- writingFile = 0;
- }
- break;
-
- case MARK : for (i=0; i<NUM_CHARS; ++i)
- mark(consCharArray[i]);
- break;
-
- case INSTALL : for (i=0; i<NUM_CHARS; ++i)
- consCharArray[i] = ap(nameCons,mkChar(i));
-
- consOpen = consCharArray['('];
- consSpace = consCharArray[' '];
- consComma = consCharArray[','];
- consClose = consCharArray[')'];
- consObrace = consCharArray['{'];
- consCbrace = consCharArray['}'];
- consOsq = consCharArray['['];
- consCsq = consCharArray[']'];
- consBack = consCharArray['`'];
- consMinus = consCharArray['-'];
- consQuote = consCharArray['\''];
- consDQuote = consCharArray['\"'];
-
- #define pFun(n,s,t) addPrim(0,n=newName(findText(s)),t,NIL)
- pFun(nameFatbar, "_FATBAR", "primFatbar");
- pFun(nameFail, "_FAIL", "primFail");
- pFun(nameIf, "_IF", "primIf");
- pFun(nameSel, "_SEL", "primSel");
-
- pFun(nameMinus, "_minus", "primMinusInt");
- pFun(nameDivide, "_divide", "primDivInt");
-
- pFun(namePrimCmp, "_compare", "primCompare");
- pFun(namePrint, "_print", "primPrint");
- pFun(nameNPrint, "_nprint", "primNprint");
- pFun(nameLPrint, "_lprint", "primLprint");
- pFun(nameNLPrint, "_nlprint", "primNlprint");
- pFun(nameSPrint, "_sprint", "primSprint");
- pFun(nameNSPrint, "_nsprint", "primNsprint");
- pFun(nameInput, "_input", "primInput");
- pFun(nameUndefMem, "_undefined_member", "primUndefMem");
- pFun(nameBlackHole, "Gc Black Hole", "primGCBhole");
- #ifdef LAMBDAVAR
- pFun(nameLvUnbound, "Unbound mutable variable",
- "primLvUnbound");
- #endif
- #ifdef LAMBDANU
- pFun(nameLnUnbound, "Unbound mutable variable",
- "primLnUnbound");
- pFun(nameLnNocont, "Unspecified continuation",
- "primLnNocont");
- pFun(nameLnFlip, "_LambdaNuFlip", "primLnFlip");
- pFun(nameLnDone, "_LambdaNuDone", "primLnDone");
- #endif
-
- #if MAC
- pFun(nameUnitIO, "_unitIO", "primUnitIO");
- pFun(nameCUnitIO, "_cunitio", "primCUnitIO");
-
- pFun(nameBindIO, "_bindIO", "primBindIO");
- pFun(nameCBindIO, "_cbindio", "primCBindIO");
- pFun(nameCCBindIO, "_ccbindio", "primCCBindIO");
-
- pFun(nameTrap, "_trap", "primTrap");
- pFun(nameTrapReg, "_trapReg", "primTrapReg");
- pFun(nameAssign, "_assign", "primAssign");
- pFun(nameAssignS, "_assignS", "primAssignS");
- pFun(nameAssignC, "_assignC", "primAssignC");
- pFun(nameAssignBlock, "_assignBlock", "primAssignBlock");
- pFun(nameDeref, "_deref", "primDeref");
- pFun(nameMalloc, "_malloc", "primMalloc");
- pFun(nameFree, "_free", "primFree");
- pFun(nameSeq, "_seq", "primSeq");
- pFun(nameTrace, "_trace", "primTrace");
-
- pFun(nameButton , "_button", "primButton");
- pFun(nameGetMouse, "_getMouse", "primGetMouse");
- pFun(nameLineTo , "_lineTo", "primLineTo");
- pFun(nameMoveTo , "_moveTo", "primMoveTo");
-
- pFun(nameGetNextEvt, "_getNextEvent","primGetNextEvent");
- pFun(nameEvtAvail, "_eventAvail", "primEventAvail");
-
- pFun(nameCreateCallback, "_createCallback", "primCreateCallback");
- pFun(nameDisposeCallback, "_disposeCallback", "primDisposeCallback");
- #endif
-
- #undef pFun
- #define predef(nm,str) nm=newName(findText(str)); name(nm).defn=PREDEFINED
- predef(nameAnd, "&&");
- predef(nameOr, "||");
- predef(nameOtherwise, "otherwise");
- predef(nameError, "error");
- #undef predef
- break;
- }
- }
-
- #if 1
- /* Reinitialise pre-defined names, so we can reload the Prelude. KH */
- #define Predef(nm) name(nm).defn=PREDEFINED; \
- name(nm).line = 0; \
- name(nm).arity = 0; \
- name(nm).number = 0; \
- name(nm).type = 0; \
- name(nm).code = 0; \
- name(nm).primDef = 0;
-
-
- InitPredefNames()
- {
- Predef(nameAnd);
- Predef(nameOr);
- Predef(nameOtherwise);
- Predef(nameError);
- }
-
- #endif
-
- /*-------------------------------------------------------------------------*/
-