1 /* -*- mode: hugs-c; -*- */
2 /* --------------------------------------------------------------------------
3 * Load symbols required from the Prelude
5 * Copyright (c) The University of Nottingham and Yale University, 1994-1997.
6 * All rights reserved. See NOTICE for details and conditions of use etc...
7 * Hugs version 1.4, December 1997
11 * $Date: 1998/12/02 13:22:18 $
12 * ------------------------------------------------------------------------*/
18 #include "translate.h"
21 #include "Assembler.h" /* for asmPrimOps and AsmReps */
25 Module modulePreludeHugs;
27 Type typeArrow; /* Function spaces */
34 #ifdef PROVIDE_INTEGER
45 Type typePrimByteArray;
47 Type typePrimMutableArray;
48 Type typePrimMutableByteArray;
58 #ifdef PROVIDE_FOREIGN
61 #ifdef PROVIDE_CONCURRENT
74 Class classEq; /* `standard' classes */
85 Class classReal; /* `numeric' classes */
89 Class classFractional;
93 Class classMonad; /* Monads and monads with a zero */
96 List stdDefaults; /* standard default values */
98 Name nameTrue, nameFalse; /* primitive boolean constructors */
99 Name nameNil, nameCons; /* primitive list constructors */
100 Name nameUnit; /* primitive Unit type constructor */
103 Name nameFromInt, nameFromDouble; /* coercion of numerics */
104 Name nameFromInteger;
105 Name nameReturn, nameBind; /* for translating monad comps */
106 Name nameZero; /* for monads with a zero */
108 Name nameStrict; /* Members of class Eval */
117 Name nameUndefined; /* generic undefined value */
124 #if !OVERLOADED_CONSTANTS
133 Name namePmFromInteger;
135 Name nameUnpackString;
141 /* these names are required before we've had a chance to do the right thing */
144 /* constructors used during translation and codegen */
145 Name nameMkC; /* Char# -> Char */
146 Name nameMkI; /* Int# -> Int */
148 Name nameMkInt64; /* Int64# -> Int64 */
150 #ifdef PROVIDE_INTEGER
151 Name nameMkInteger; /* Integer# -> Integer */
154 Name nameMkW; /* Word# -> Word */
157 Name nameMkA; /* Addr# -> Addr */
159 Name nameMkF; /* Float# -> Float */
160 Name nameMkD; /* Double# -> Double */
162 Name nameMkPrimArray;
163 Name nameMkPrimByteArray;
165 Name nameMkPrimMutableArray;
166 Name nameMkPrimMutableByteArray;
168 #ifdef PROVIDE_STABLE
169 Name nameMkStable; /* StablePtr# a -> StablePtr a */
172 Name nameMkWeak; /* Weak# a -> Weak a */
174 #ifdef PROVIDE_FOREIGN
175 Name nameMkForeign; /* ForeignObj# -> ForeignObj */
177 #ifdef PROVIDE_CONCURRENT
178 Name nameMkThreadId; /* ThreadId# -> ThreadId */
179 Name nameMkMVar; /* MVar# -> MVar */
182 /* --------------------------------------------------------------------------
184 * ------------------------------------------------------------------------*/
186 static Tycon linkTycon( String s );
187 static Tycon linkClass( String s );
188 static Name linkName ( String s );
190 static Tycon linkTycon( String s )
192 Tycon tc = findTycon(findText(s));
196 ERRMSG(0) "Prelude does not define standard type \"%s\"", s
200 static Class linkClass( String s )
202 Class cc = findClass(findText(s));
206 ERRMSG(0) "Prelude does not define standard class \"%s\"", s
210 static Name linkName( String s )
212 Name n = findName(findText(s));
216 ERRMSG(0) "Prelude does not define standard name \"%s\"", s
220 /* ToDo: kill this! */
221 static Name predefinePrim ( String s );
222 static Name predefinePrim ( String s )
224 Name nm = newName(findText(s));
225 name(nm).defn=PREDEFINED;
229 Void linkPreludeTC() { /* Hook to tycons and classes in */
230 static Bool initialised = FALSE; /* prelude when first loaded */
234 setCurrModule(modulePreludeHugs);
236 typeChar = linkTycon("Char");
237 typeInt = linkTycon("Int");
239 typeInt64 = linkTycon("Int64");
241 #ifdef PROVIDE_INTEGER
242 typeInteger = linkTycon("Integer");
245 typeWord = linkTycon("Word");
248 typeAddr = linkTycon("Addr");
251 typePrimArray = linkTycon("PrimArray");
252 typePrimByteArray = linkTycon("PrimByteArray");
253 typeRef = linkTycon("Ref");
254 typePrimMutableArray = linkTycon("PrimMutableArray");
255 typePrimMutableByteArray = linkTycon("PrimMutableByteArray");
257 typeFloat = linkTycon("Float");
258 typeDouble = linkTycon("Double");
259 #ifdef PROVIDE_STABLE
260 typeStable = linkTycon("StablePtr");
263 typeWeak = linkTycon("Weak");
265 #ifdef PROVIDE_FOREIGN
266 typeForeign = linkTycon("ForeignObj");
268 #ifdef PROVIDE_CONCURRENT
269 typeThreadId = linkTycon("ThreadId");
270 typeMVar = linkTycon("MVar");
273 typeBool = linkTycon("Bool");
274 typeST = linkTycon("ST");
275 typeIO = linkTycon("IO");
276 typeException = linkTycon("Exception");
277 typeList = linkTycon("[]");
278 typeUnit = linkTycon("()");
279 typeString = linkTycon("String");
281 classEq = linkClass("Eq");
282 classOrd = linkClass("Ord");
283 classIx = linkClass("Ix");
284 classEnum = linkClass("Enum");
285 classShow = linkClass("Show");
286 classRead = linkClass("Read");
287 classBounded = linkClass("Bounded");
289 classEval = linkClass("Eval");
291 classReal = linkClass("Real");
292 classIntegral = linkClass("Integral");
293 classRealFrac = linkClass("RealFrac");
294 classRealFloat = linkClass("RealFloat");
295 classFractional = linkClass("Fractional");
296 classFloating = linkClass("Floating");
297 classNum = linkClass("Num");
298 classMonad = linkClass("Monad");
299 classMonad0 = linkClass("MonadZero");
302 stdDefaults = cons(typeDouble,stdDefaults);
304 stdDefaults = cons(typeBignum,stdDefaults);
306 stdDefaults = cons(typeInt,stdDefaults);
310 nameMkC = addPrimCfun(findText("C#"),1,0,CHAR_REP);
311 nameMkI = addPrimCfun(findText("I#"),1,0,INT_REP);
313 nameMkInt64 = addPrimCfun(findText("Int64#"),1,0,INT64_REP);
316 nameMkW = addPrimCfun(findText("W#"),1,0,WORD_REP);
319 nameMkA = addPrimCfun(findText("A#"),1,0,ADDR_REP);
321 nameMkF = addPrimCfun(findText("F#"),1,0,FLOAT_REP);
322 nameMkD = addPrimCfun(findText("D#"),1,0,DOUBLE_REP);
323 #ifdef PROVIDE_STABLE
324 nameMkStable = addPrimCfun(findText("Stable#"),1,0,STABLE_REP);
327 #ifdef PROVIDE_INTEGER
328 nameMkInteger = addPrimCfun(findText("Integer#"),1,0,0);
330 #ifdef PROVIDE_FOREIGN
331 nameMkForeign = addPrimCfun(findText("Foreign#"),1,0,0);
334 nameMkWeak = addPrimCfun(findText("Weak#"),1,0,0);
337 nameMkPrimArray = addPrimCfun(findText("PrimArray#"),1,0,0);
338 nameMkPrimByteArray = addPrimCfun(findText("PrimByteArray#"),1,0,0);
339 nameMkRef = addPrimCfun(findText("Ref#"),1,0,0);
340 nameMkPrimMutableArray = addPrimCfun(findText("PrimMutableArray#"),1,0,0);
341 nameMkPrimMutableByteArray = addPrimCfun(findText("PrimMutableByteArray#"),1,0,0);
343 #ifdef PROVIDE_CONCURRENT
344 nameMkThreadId = addPrimCfun(findText("ThreadId#"),1,0,0);
345 nameMkMVar = addPrimCfun(findText("MVar#"),1,0,0);
349 addEvalInst(0,typeArrow,2,NIL); /* Add Eval instances for (->) */
352 for (i=2; i<=NUM_DTUPLES; i++) {/* Add derived instances of tuples */
354 addEvalInst(0,mkTuple(i),i,NIL);
357 addTupInst(classEq,i);
360 addTupInst(classOrd,i);
363 addTupInst(classIx,i);
366 addTupInst(classShow,i);
369 addTupInst(classRead,i);
372 addTupInst(classBounded,i);
378 Void linkPreludeCM() { /* Hook to cfuns and mfuns in */
379 static Bool initialised = FALSE; /* prelude when first loaded */
383 setCurrModule(modulePreludeHugs);
385 nameFalse = linkName("False");
386 nameTrue = linkName("True");
387 nameNil = linkName("[]");
388 nameCons = linkName(":");
389 nameUnit = linkName("()");
391 nameEq = linkName("==");
392 nameFromInt = linkName("fromInt");
393 nameFromInteger = linkName("fromInteger");
394 nameFromDouble = linkName("fromDouble");
396 nameStrict = linkName("strict");
397 nameSeq = linkName("seq");
399 nameReturn = linkName("return");
400 nameBind = linkName(">>=");
401 nameZero = linkName("zero");
403 /* These come before calls to implementPrim */
404 for(i=0; i<NUM_TUPLES; ++i) {
410 Void linkPreludeNames() { /* Hook to names defined in Prelude */
411 static Bool initialised = FALSE;
415 setCurrModule(modulePreludeHugs);
418 nameMkIO = linkName("primMkIO");
419 for (i=0; asmPrimOps[i].name; ++i) {
420 Text t = findText(asmPrimOps[i].name);
421 Name n = findName(t);
427 name(n).type = primType(asmPrimOps[i].monad,asmPrimOps[i].args,asmPrimOps[i].results);
428 name(n).arity = strlen(asmPrimOps[i].args);
429 name(n).primop = &(asmPrimOps[i]);
434 nameRunIO = linkName("primRunIO");
435 namePrint = linkName("print");
436 /* typechecker (undefined member functions) */
437 nameError = linkName("error");
439 nameId = linkName("id");
440 nameOtherwise = linkName("otherwise");
441 nameUndefined = linkName("undefined");
444 namePmSub = linkName("primPmSub");
447 nameUnpackString = linkName("primUnpackString");
448 namePMFail = linkName("primPmFail");
449 nameEqChar = linkName("primEqChar");
450 nameEqInt = linkName("primEqInt");
451 #if !OVERLOADED_CONSTANTS
452 nameEqInteger = linkName("primEqInteger");
453 #endif /* !OVERLOADED_CONSTANTS */
454 nameEqDouble = linkName("primEqDouble");
455 namePmInt = linkName("primPmInt");
456 namePmInteger = linkName("primPmInteger");
457 namePmDouble = linkName("primPmDouble");
458 namePmLe = linkName("primPmLe");
459 namePmSubtract = linkName("primPmSubtract");
460 namePmFromInteger = linkName("primPmFromInteger");
464 Void linkControl(what)
473 case INSTALL : linkControl(RESET);
475 modulePreludeHugs = newModule(findText("PreludeBuiltin"));
477 setCurrModule(modulePreludeHugs);
479 typeArrow = addPrimTycon(findText("(->)"),
480 pair(STAR,pair(STAR,STAR)),
483 /* ToDo: fix pFun (or eliminate its use) */
484 #define pFun(n,s,t) n = predefinePrim(s)
485 /* newtype and USE_NEWTYPE_FOR_DICTS */
486 pFun(nameId, "id", "id");
488 pFun(nameInd, "_indirect","error");
489 name(nameInd).number = DFUNNAME;
491 pFun(nameSel, "_SEL", "sel");
492 /* strict constructors */
493 pFun(nameForce, "primForce","id");
494 /* implementTagToCon */
495 pFun(namePMFail, "primPmFail","primPmFail");
502 /*-------------------------------------------------------------------------*/