From 2eaece841c92e8a59aa4346ca85739babfd67fe9 Mon Sep 17 00:00:00 2001 From: dos-reis Date: Mon, 31 Oct 2011 03:08:11 +0000 Subject: * interp/compiler.boot (evaluateConstructorModemap): Rename from substituteInfoFunctorModemap. (constructorCondition): New. * interp/define.boot (compDefineCategory2): Compute dual signature early on. (compDefineFunctor1): Likewise. (typingKind): New. (deduceImplicitParameters): Use it. * interp/database.boot (modemapsFromCategory): Take a first argument as a DB. Tidy. Adjust caller. Add constructor condition. (modemapsFromFunctor): Likewise. Lose last argument. (mkDatabasePred): Remove. (formal2Pattern): Likewise. --- src/interp/database.boot | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src/interp/database.boot') diff --git a/src/interp/database.boot b/src/interp/database.boot index 831de579..dc942f85 100644 --- a/src/interp/database.boot +++ b/src/interp/database.boot @@ -191,10 +191,14 @@ modemapsFromCategory(db,form,body,signature) == :[['ofCategory,a,m] for a in form.args for m in signature.source for cat? in dbDualSignature(db).source | cat? ]] op := dbConstructor db + cond := + dbImplicitData db is [isubst,icond] => + [['%exist,ASSOCRIGHT isubst,applySubst(sl,applySubst(isubst,icond))]] + nil mms := nil for (entry:= [[op,sig,:.],pred,sel]) in opAlist | listMember?(sig,LASSOC(op,nonCategorySigAlist)) repeat - pred' := MKPF([pred,:catPredList],'AND) + pred' := mkpf([pred,:catPredList,:cond],'AND) modemap := [["*1",:sig],[pred',sel]] mms := [[op,:interactiveModemapForm modemap],:mms] mms @@ -215,6 +219,10 @@ modemapsFromFunctor(db,form,opAlist) == $e := put(u,'mode,v,$e) nonCategorySigAlist := mkAlistOfExplicitCategoryOps signature.target or return nil + catCond := + dbImplicitData db is [isubst,icond] => + [['%exist,ASSOCRIGHT isubst,applySubst(f2p,applySubst(isubst,icond))]] + nil mms := nil for (entry := [[op,sig,:.],pred,sel]) in opAlist | or/[listMember?(sig,catSig) for catSig in @@ -235,7 +243,7 @@ modemapsFromFunctor(db,form,opAlist) == '"by pattern match" ] skip := 'SKIP modemap := [[form,:substitute(form,"$",sig)], - [mkpf([pred,:predList],'AND), + [mkpf([pred,:predList,:catCond],'AND), substitute(form,"$",sel),:skip]] mms := [[op,:interactiveModemapForm modemap],:mms] mms -- cgit v1.2.3