aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ChangeLog6
-rw-r--r--src/interp/category.boot55
2 files changed, 40 insertions, 21 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 89355641..b02f7608 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,11 @@
2011-11-13 Gabriel Dos Reis <gdr@cs.tamu.edu>
+ * interp/category.boot (filterConditionalCategories): Split out of
+ JoinInner.
+ (JoinInner): Call it.
+
+2011-11-13 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
* interp/category.boot (SigListMember): Remove as deadcode.
(SigEqual): Remove.
(predicateImplies): Rename from PredImplies. Rework it to match
diff --git a/src/interp/category.boot b/src/interp/category.boot
index 043b6d67..78661e10 100644
--- a/src/interp/category.boot
+++ b/src/interp/category.boot
@@ -359,30 +359,43 @@ DescendantP(a,b,e) ==
false
--% The implementation of Join
-
-JoinInner(l,$e) ==
- $NewCatVec: local := nil
- CondList:= nil
- for u in l repeat
- for [at,pred] in categoryAttributes u repeat
+
+++ We have a list `l' of category objects to be joined.
+++ Some of them may harbor other categories that exist only under
+++ certain conditions. Collect all those that are indisputably conditional
+++ and attempt to detect those apparent conditional categories whose
+++ predicates are satified in the current elaboration environment.
+++ The end result is a 2-list, the first component being a list of
+++ (catobj,pred) pairs and the second component being the list of
+++ newly discovered unconditional categories.
+filterConditionalCategories(l,e) ==
+ conditionals := nil
+ unconditionals := nil
+ for cat in l repeat
+ for [at,pred] in categoryAttributes cat repeat
if at isnt [.,:.] then at := [at]
- -- the variable $Attributes is built globally, so that true
- -- attributes can be detected without calling isCategoryForm
+ -- the variable $Attributes is built globally, so that true
+ -- attributes can be detected without calling isCategoryForm
symbolMember?(first at,$Attributes) => nil
- not isCategoryForm(at,$e) => $Attributes:=[first at,:$Attributes]
- listMember?(pred,get("$Information","special",$e)) =>
- l := [:l,CatEval(at,$e)]
- --It's true, so we add this as unconditional
+ not isCategoryForm(at,e) => $Attributes := [first at,:$Attributes]
+ listMember?(pred,get("$Information","special",e)) =>
+ --It's true, so we add it as unconditional
+ unconditionals := [CatEval(at,e),:unconditionals]
pred isnt ["and",:.] =>
- CondList := [[CatEval(at,$e),pred],:CondList]
- pred' := [u for u in pred.args |
- not listMember?(u,get("$Information","special",$e))
- and u isnt true]
- pred' = nil => l := [:l,CatEval(at,$e)]
- pred' is [.] => CondList := [[CatEval(at,$e),pred'],:CondList]
- CondList := [[CatEval(at,$e),["and",:pred']],:CondList]
- [$NewCatVec,:l]:= l
- l':= [:CondList,:[[u,true] for u in l]]
+ conditionals := [[CatEval(at,e),pred],:conditionals]
+ pred' := [x for x in pred.args |
+ not listMember?(x,get("$Information","special",e))
+ and x isnt true]
+ pred' = nil => unconditionals := [CatEval(at,e),:unconditionals]
+ pred' is [.] => conditionals := [[CatEval(at,e),pred'],:conditionals]
+ conditionals := [[CatEval(at,e),["and",:pred']],:conditionals]
+ [conditionals,reverse! unconditionals]
+
+JoinInner(l,$e) ==
+ $NewCatVec: local := nil
+ [CondList,uncondList] := filterConditionalCategories(l,$e)
+ [$NewCatVec,:l] := [:l,:uncondList]
+ l' := [:CondList,:[[u,true] for u in l]]
-- This is a list of all the categories that this extends
-- conditionally or unconditionally
sigl := categoryExports $NewCatVec