aboutsummaryrefslogtreecommitdiff
path: root/src/interp
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2013-06-15 04:56:05 +0000
committerdos-reis <gdr@axiomatics.org>2013-06-15 04:56:05 +0000
commit11b080192468670b9b1a8f5cf9d5ff890195a3f2 (patch)
tree88837c19a422af6dd1e9b6609727f4b43db1ae70 /src/interp
parent5bea876989c59d4e58237d5e3fd059a6b812df89 (diff)
downloadopen-axiom-11b080192468670b9b1a8f5cf9d5ff890195a3f2.tar.gz
Add DB parameter to extendsCategoryForm.
Diffstat (limited to 'src/interp')
-rw-r--r--src/interp/c-util.boot30
-rw-r--r--src/interp/compiler.boot7
-rw-r--r--src/interp/define.boot1
3 files changed, 20 insertions, 18 deletions
diff --git a/src/interp/c-util.boot b/src/interp/c-util.boot
index 27c12319..d9663fae 100644
--- a/src/interp/c-util.boot
+++ b/src/interp/c-util.boot
@@ -1100,19 +1100,21 @@ printStats [byteCount,elapsedSeconds] ==
finishLine $OutputStream
nil
-extendsCategoryForm(domain,form,form') ==
- --is domain of category form also of category form'?
- --domain is only used for SubsetCategory resolution.
- --and ensuring that X being a Ring means that it
- --satisfies (Algebra X)
+++is domain of category form also of category form'?
+++domain is only used for SubsetCategory resolution.
+++ `db', if non-nil, is the DB for the constructor being compiled.
+++Ensuring that X being a Ring means that it satisfies (Algebra X)
+extendsCategoryForm(db,domain,form,form') ==
form=form' => true
form=$Category => nil
- form' is ["Join",:l] => and/[extendsCategoryForm(domain,form,x) for x in l]
+ form' is ["Join",:l] =>
+ and/[extendsCategoryForm(db,domain,form,x) for x in l]
form' is ["CATEGORY",.,:l] =>
- and/[extendsCategoryForm(domain,form,x) for x in l]
+ and/[extendsCategoryForm(db,domain,form,x) for x in l]
form' is ["SubsetCategory",cat,dom] =>
- extendsCategoryForm(domain,form,cat) and isSubset(domain,dom,$e)
- form is ["Join",:l] => or/[extendsCategoryForm(domain,x,form') for x in l]
+ extendsCategoryForm(db,domain,form,cat) and isSubset(domain,dom,$e)
+ form is ["Join",:l] =>
+ or/[extendsCategoryForm(db,domain,x,form') for x in l]
form is ["CATEGORY",.,:l] =>
listMember?(form',l) or
stackWarning('"not known that %1 is of mode %2p",[form',form]) or true
@@ -1121,15 +1123,15 @@ extendsCategoryForm(domain,form,form') ==
-- possibly compiled previously that may have changed.
-- FIXME: should not we go all the way down and implement
-- polynormic recursion?
- domain = "$" and form = $definition =>
- extendsCategoryForm(domain, $currentCategoryBody, form')
+ domain = "$" and form = dbConstructorForm db =>
+ extendsCategoryForm(db,domain, $currentCategoryBody, form')
isCategoryForm(form,$EmptyEnvironment) =>
-- -- If we have an existing definition for this category, use it.
-- (db := constructorDB form.op) and loadDB db =>
-- form' is ['SIGNATURE,op,types,:.] => assoc([op,args],dbOperations db)
-- form' is ['ATTRIBUTE,a] => assoc(a,dbAttributes db)
-- subst := pairList(dbConstructorForm(db).args,form.args)
- -- or/[extendsCategoryForm(domain,applySubst(subst,cat),form')
+ -- or/[extendsCategoryForm(db,domain,applySubst(subst,cat),form')
-- for [cat,:.] in dbAncestors db]
-- Otherwise constructs the associated domain shell
formVec:=(compMakeCategoryObject(form,$e)).expr
@@ -1142,12 +1144,10 @@ extendsCategoryForm(domain,form,form') ==
assoc(at,categoryAttributes formVec) or
assoc(substitute(domain,"$",at),substitute(domain,"$",categoryAttributes formVec))
form' is ["IF",:.] => true --temporary hack so comp won't fail
- -- Are we dealing with an Aldor category? If so use the "has" function ...
- # formVec = 1 => newHasTest(form,form')
listMember?(form',categoryPrincipals formVec) or
listMember?(form',substitute(domain,"$",categoryPrincipals formVec)) or
(or/
- [extendsCategoryForm(domain,substitute(domain,"$",cat),form')
+ [extendsCategoryForm(db,domain,substitute(domain,"$",cat),form')
for [cat,:.] in categoryAncestors formVec])
nil
diff --git a/src/interp/compiler.boot b/src/interp/compiler.boot
index 60f2fc50..1d2921eb 100644
--- a/src/interp/compiler.boot
+++ b/src/interp/compiler.boot
@@ -327,9 +327,10 @@ finishLambdaExpression(expr is ['%lambda,vars,.],env) ==
compWithMappingMode(x,m is ["Mapping",m',:sl],oldE) ==
e := oldE
isFunctor x =>
+ db := currentDB e
if get(x,"modemap",$CategoryFrame) is [[[.,target,:argModeList],.],:.] and
- (and/[extendsCategoryForm("$",s,mode) for mode in argModeList for s in sl]
- ) and extendsCategoryForm("$",target,m') then
+ (and/[extendsCategoryForm(db,"$",s,mode) for mode in argModeList for s in sl]
+ ) and extendsCategoryForm(db,"$",target,m') then
return [['%function,x],m,e]
x is ["+->",:.] => compLambda(x,m,oldE)
if string? x then x := makeSymbol x
@@ -1843,7 +1844,7 @@ coerceHard(T,m) ==
string? T.expr and T.expr=m => [T.expr,m,$e]
isCategoryForm(m,$e) =>
$bootStrapMode => [T.expr,m,$e]
- extendsCategoryForm(T.expr,T.mode,m) => [T.expr,m,$e]
+ extendsCategoryForm(currentDB $e,T.expr,T.mode,m) => [T.expr,m,$e]
coerceExtraHard(T,m)
(m' is "$" and m = $functorForm) or (m' = $functorForm and m = "$") =>
[T.expr,m,$e]
diff --git a/src/interp/define.boot b/src/interp/define.boot
index ff65b86d..a17f8aa8 100644
--- a/src/interp/define.boot
+++ b/src/interp/define.boot
@@ -1119,6 +1119,7 @@ compDefineCategory2(db,form,signature,body,m,e,$formalArgList) ==
$definition: local := form --used by DomainSubstitutionFunction
$form: local := nil
$extraParms: local := nil
+ e := registerConstructor($op,e)
-- Remember the body for checking the current instantiation.
$currentCategoryBody : local := body
--Set in DomainSubstitutionFunction, used further down