diff options
-rw-r--r-- | src/ChangeLog | 6 | ||||
-rw-r--r-- | src/algebra/integer.spad.pamphlet | 4 | ||||
-rw-r--r-- | src/interp/compiler.boot | 20 |
3 files changed, 21 insertions, 9 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 913696d1..bb6d981b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2015-12-31 Gabriel Dos Reis <gdr@axiomatics.org> + + * interp/compiler.boot (modeIfTypeBeingDefined): New. + (primitiveType): Add DB parameter as first. Don't unconditionally + reference primitive types if they are being defined. + 2015-12-30 Gabriel Dos Reis <gdr@axiomatics.org> * interp/functor.boot (compCategories): Use the DB parameter is diff --git a/src/algebra/integer.spad.pamphlet b/src/algebra/integer.spad.pamphlet index 6838a053..6474ec28 100644 --- a/src/algebra/integer.spad.pamphlet +++ b/src/algebra/integer.spad.pamphlet @@ -113,7 +113,7 @@ Integer: IntegerNumberSystem with 1 == %icst1 zero? x == x = 0$% one? x == x = 1$% - base() == 2 pretend % + base() == 2@% copy x == x inc x == %iinc x dec x == %idec x @@ -133,7 +133,7 @@ Integer: IntegerNumberSystem with latex(x:%):String == s := %i2s x - -1$% < x and x < 10 => s + -1$% < x and x < 10@% => s %strconc("{", %strconc(s, "}")) positiveRemainder(a, b) == diff --git a/src/interp/compiler.boot b/src/interp/compiler.boot index dbecf2ac..6bfb47fc 100644 --- a/src/interp/compiler.boot +++ b/src/interp/compiler.boot @@ -67,7 +67,7 @@ compFormWithModemap: (%Maybe %Database,%Form,%Mode,%Env,%Modemap) -> %Maybe %Tri compToApply: (%Form,%List %Form,%Mode,%Env) -> %Maybe %Triple compApplication: (%Form,%List %Form,%Mode,%Triple) -> %Maybe %Triple -primitiveType: %Form -> %Mode +primitiveType: (%Maybe %Database,%Form,%Mode) -> %Mode modeEqual: (%Form,%Form) -> %Boolean hasUniqueCaseView: (%Form,%Mode,%Env) -> %Boolean convertOrCroak: (%Triple,%Mode) -> %Maybe %Triple @@ -414,17 +414,23 @@ compAtom(db,x,m,e) == T := integer? x and x > 1 and compIntegerLiteral(db,x,m,e) => T t := ident? x => compSymbol(x,m,e) or return nil - listMember?(m,$IOFormDomains) and primitiveType x => [x,m,e] + listMember?(m,$IOFormDomains) and primitiveType(db,x,m) => [x,m,e] string? x => [x,x,e] - [x,primitiveType x or return nil,e] + [x,primitiveType(db,x,m) or return nil,e] convert(t,m) -primitiveType x == +modeIfTypeBeingDefined(db,t,m) == + db = nil or m = $EmptyMode => t + substitute(dbConstructorForm db,'$,m) = t => m + t + +primitiveType(db,x,m) == x is nil => $EmptyMode - string? x => $String + string? x => modeIfTypeBeingDefined(db,$String,m) integer? x => - x = 0 => $NonNegativeInteger - x > 0 => $PositiveInteger + db ~= nil and substitute(dbConstructorForm db,'$,m) = $Integer => m + x = 0 => modeIfTypeBeingDefined(db,$NonNegativeInteger,m) + x > 0 => modeIfTypeBeingDefined(db,$PositiveInteger,m) $Integer float? x => $DoubleFloat nil |