aboutsummaryrefslogtreecommitdiff
path: root/src/interp/interop.boot
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp/interop.boot')
-rw-r--r--src/interp/interop.boot669
1 files changed, 0 insertions, 669 deletions
diff --git a/src/interp/interop.boot b/src/interp/interop.boot
deleted file mode 100644
index c9c0f67d..00000000
--- a/src/interp/interop.boot
+++ /dev/null
@@ -1,669 +0,0 @@
--- Copyright (c) 1991-2002, The Numerical Algorithms Group Ltd.
--- All rights reserved.
--- Copyright (C) 2007-2011, Gabriel Dos Reis.
--- All rights reserved.
---
--- Redistribution and use in source and binary forms, with or without
--- modification, are permitted provided that the following conditions are
--- met:
---
--- - Redistributions of source code must retain the above copyright
--- notice, this list of conditions and the following disclaimer.
---
--- - Redistributions in binary form must reproduce the above copyright
--- notice, this list of conditions and the following disclaimer in
--- the documentation and/or other materials provided with the
--- distribution.
---
--- - Neither the name of The Numerical Algorithms Group Ltd. nor the
--- names of its contributors may be used to endorse or promote products
--- derived from this software without specific prior written permission.
---
--- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
--- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
--- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
--- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
--- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
--- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
--- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
--- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
--- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
--- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
--- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-import c_-util
-import hashcode
-namespace BOOT
-
--- note domainObjects are now (dispatchVector hashCode . domainVector)
--- lazy oldAxiomDomainObjects are (dispatchVector hashCode (Call form) . backptr),
--- pre oldAxiomCategory is (dispatchVector . (cat form))
--- oldAxiomCategory objects are (dispatchVector . ( (cat form) hash defaultpack parentlist))
-
-hashCode? x == integer? x
-
-$domainTypeTokens == ['lazyOldAxiomDomain, 'oldAxiomDomain, 'oldAxiomPreCategory,
- 'oldAxiomCategory, 0]
-
--- The name game.
--- The compiler produces names that are of the form:
--- a) cons(0, <string>)
--- b) cons(1, type-name, arg-names...)
--- c) cons(2, arg-names...)
--- d) cons(3, value)
--- NB: (c) is for tuple-ish constructors,
--- and (d) is for dependent types.
-
-DNameStringID == 0
-DNameApplyID == 1
-DNameTupleID == 2
-DNameOtherID == 3
-
-DNameToSExpr1 dname ==
- null dname => error "unexpected domain name"
- first dname = DNameStringID =>
- makeSymbol(CompStrToString rest dname)
- name0 := DNameToSExpr1 second dname
- args := rest rest dname
- name0 is '_-_> =>
- froms := first args
- froms := [DNameToSExpr x for x in rest froms]
- ret := second args -- a tuple
- ret := DNameToSExpr second ret -- contents
- ['Mapping,:[ret,:froms]]
- name0 is 'Union or name0 is 'Record =>
- sxs := [DNameToSExpr x for x in rest first args]
- [name0,:sxs]
- name0 is 'Enumeration =>
- [name0,:[DNameFixEnum x for x in rest first args]]
- [name0,:[DNameToSExpr x for x in args]]
-
-DNameToSExpr dname ==
- first dname = DNameOtherID =>
- rest dname
- sx := DNameToSExpr1 dname
- cons? sx => sx
- [sx]
-
-DNameFixEnum arg == CompStrToString rest arg
-
-SExprToDName(sexpr, cosigVal) ==
- -- is it a non-type valued object?
- not cosigVal => [DNameOtherID, :sexpr]
- if first sexpr is '_: then sexpr := third sexpr
- first sexpr is 'Mapping =>
- args := [ SExprToDName(sx,true) for sx in rest sexpr]
- [DNameApplyID,
- [DNameStringID,: StringToCompStr '"->"],
- [DNameTupleID, : rest args],
- [DNameTupleID, first args]]
- name0 := [DNameStringID, : StringToCompStr symbolName first sexpr]
- first sexpr is 'Union or first sexpr is 'Record =>
- [DNameApplyID, name0,
- [DNameTupleID,: [ SExprToDName(sx,true) for sx in rest sexpr]]]
- newCosig := rest getDualSignatureFromDB first sexpr
- [DNameApplyID, name0,
- :[SExprToDName(x,f) for x in rest sexpr for f in newCosig]]
-
--- local garbage because Compiler strings are null terminated
-StringToCompStr(str) ==
- strconc(str, charString abstractChar 0)
-
-CompStrToString(str) ==
- subString(str, 0, #str - 1)
--- local garbage ends
-
-runOldAxiomFunctor(:allArgs) ==
- [:args,env] := allArgs
- getConstructorKindFromDB env is "category" =>
- [$oldAxiomPreCategoryDispatch,: [env, :args]]
- dom:=apply(env, args)
- makeOldAxiomDispatchDomain dom
-
-makeLazyOldAxiomDispatchDomain domform ==
- attribute? domform =>
- [$attributeDispatch, domform, hashString(symbolName domform)]
- getConstructorKindFromDB opOf domform is "category" =>
- [$oldAxiomPreCategoryDispatch,: domform]
- dd := [$lazyOldAxiomDomainDispatch, hashTypeForm(domform,0), domform]
- append!(dd,dd) -- installs back pointer to head of domain.
- dd
-
-makeOldAxiomDispatchDomain dom ==
- cons? dom => dom
- [$oldAxiomDomainDispatch,hashTypeForm(dom.0,0),:dom]
-
-closeOldAxiomFunctor(name) ==
- [function runOldAxiomFunctor,:symbolFunction name]
-
-lazyOldAxiomDomainLookupExport(domenv, self, op, sig, box, skipdefaults, env) ==
- dom := instantiate domenv
- SPADCALL(rest dom, self, op, sig, box, skipdefaults, first dom.3)
-
-lazyOldAxiomDomainHashCode(domenv, env) == first domenv
-
-lazyOldAxiomDomainDevaluate(domenv, env) ==
- dom := instantiate domenv
- SPADCALL(rest dom, first dom.1)
-
-lazyOldAxiomAddChild(domenv, kid, env) ==
- [$lazyOldAxiomDomainDispatch,:domenv]
-
-$lazyOldAxiomDomainDispatch :=
- VECTOR('lazyOldAxiomDomain,
- [function lazyOldAxiomDomainDevaluate],
- [nil],
- [function lazyOldAxiomDomainLookupExport],
- [function lazyOldAxiomDomainHashCode],
- [function lazyOldAxiomAddChild])
-
--- old Axiom pre category objects are just (dispatch . catform)
--- where catform is ('categoryname,: evaluated args)
--- old Axiom category objects are (dispatch . [catform, hashcode, defaulting package, parent vector, dom])
-oldAxiomPreCategoryBuild(catform, dom, env) ==
- pack := oldAxiomCategoryDefaultPackage(catform, dom)
- [$oldAxiomCategoryDispatch,
- :[catform, hashTypeForm(catform,0), pack, oldAxiomPreCategoryParents(catform,dom), dom]]
-oldAxiomPreCategoryHashCode(catform, env) == hashTypeForm(catform,0)
-oldAxiomCategoryDefaultPackage(catform, dom) ==
- hasDefaultPackage opOf catform
-
-oldAxiomPreCategoryDevaluate([op,:args], env) ==
- SExprToDName([op,:devaluateList args], true)
-
-$oldAxiomPreCategoryDispatch :=
- VECTOR('oldAxiomPreCategory,
- [function oldAxiomPreCategoryDevaluate],
- [nil],
- [nil],
- [function oldAxiomPreCategoryHashCode],
- [function oldAxiomPreCategoryBuild],
- [nil])
-
-oldAxiomCategoryDevaluate([[op,:args],:.], env) ==
- SExprToDName([op,:devaluateList args], true)
-
-oldAxiomPreCategoryParents(catform,dom) ==
- vars := ["$",:rest getConstructorFormFromDB opOf catform]
- vals := [dom,:rest catform]
- -- parents := getConstructorParentsFromDB opOf catform
- parents := parentsOf opOf catform
- PROGV(vars, vals,
- vector
- [eval quoteCatOp cat for [cat,:pred] in parents | eval pred])
-
-quoteCatOp cat ==
- cat isnt [.,:.] => MKQ cat
- ['LIST, MKQ first cat,: rest cat]
-
-
-oldAxiomCategoryLookupExport(catenv, self, op, sig, box, env) ==
- [catform,hash, pack,:.] := catenv
- opIsHasCat op => if scalarEq?(sig, hash) then [self] else nil
- null(pack) => nil
- if not vector? pack then
- pack:=apply(pack, [self, :rest catform])
- catenv.rest.rest.first := pack
- fun := basicLookup(op, sig, pack, self) => [fun]
- nil
-
-oldAxiomCategoryParentCount([.,.,.,parents,.], env) == # parents
-oldAxiomCategoryNthParent([.,.,.,parvec,dom], n, env) ==
- catform := parvec.(n-1)
- VECTORP KAR catform => catform
- newcat := oldAxiomPreCategoryBuild(catform,dom,nil)
- parvec.(n-1) := newcat
- newcat
-
-oldAxiomCategoryBuild([catform,:.], dom, env) ==
- oldAxiomPreCategoryBuild(catform,dom, env)
-oldAxiomCategoryHashCode([.,hash,:.], env) == hash
-
-$oldAxiomCategoryDispatch :=
- VECTOR('oldAxiomCategory,
- [function oldAxiomCategoryDevaluate],
- [nil],
- [function oldAxiomCategoryLookupExport],
- [function oldAxiomCategoryHashCode],
- [function oldAxiomCategoryBuild], -- builder ??
- [function oldAxiomCategoryParentCount],
- [function oldAxiomCategoryNthParent]) -- 1 indexed
-
-attributeDevaluate(attrObj, env) ==
- [name, hash] := attrObj
- StringToCompStr symbolName name
-
-attributeLookupExport(attrObj, self, op, sig, box, env) ==
- [name, hash] := attrObj
- opIsHasCat op => if scalarEq?(hash, sig) then [self] else nil
-
-attributeHashCode(attrObj, env) ==
- [name, hash] := attrObj
- hash
-
-attributeCategoryBuild(attrObj, dom, env) ==
- [name, hash] := attrObj
- [$attributeDispatch, name, hash]
-
-attributeCategoryParentCount(attrObj, env) == 0
-
-attributeNthParent(attrObj, env) == nil
-
-$attributeDispatch :=
- VECTOR('attribute,
- [function attributeDevaluate],
- [nil],
- [function attributeLookupExport],
- [function attributeHashCode],
- [function attributeCategoryBuild], -- builder ??
- [function attributeCategoryParentCount],
- [function attributeNthParent]) -- 1 indexed
-
-
---=======================================================================
--- Generate Category Level Alist
---=======================================================================
-orderCatAnc x ==
- reverse! ASSOCLEFT SORTBY(function rest,rest depthAssoc x)
-
-depthAssocList u ==
- u := removeSymbol(u,'DomainSubstitutionMacro) --hack by RDJ 8/90
- removeDuplicates ("append"/[depthAssoc(y) for y in u])
-
-depthAssoc x ==
- y := tableValue($depthAssocCache,x) => y
- x is ['Join,:u] or (u := getCatAncestors x) =>
- v := depthAssocList u
- tableValue($depthAssocCache,x) := [[x,:n],:v]
- where n() == 1 + "MAX"/[rest y for y in v]
- tableValue($depthAssocCache,x) := [[x,:0]]
-
-getCatAncestors x == [CAAR y for y in parentsOf opOf x]
-
-listOfEntries form ==
- form isnt [.,:.] => form
- form is [op,:l] =>
- op is 'Join => "append"/[listOfEntries x for x in l]
- op is 'CATEGORY => listOfCategoryEntries rest l
- op is 'PROGN => listOfCategoryEntries l
- op is 'ATTRIBUTE and first l is [f,:.] and constructor? f => [first l]
- op in '(ATTRIBUTE SIGNATURE) => nil
- [form]
- categoryFormatError()
-
-listOfCategoryEntries l ==
- null l => nil
- l is [[op,:u],:v] =>
- firstItemList:=
- op is 'ATTRIBUTE and first u is [f,:.] and constructor? f =>
- [first u]
- op in '(ATTRIBUTE SIGNATURE) => nil
- op is 'IF and u is [pred,conseq,alternate] =>
- listOfCategoryEntriesIf(pred,conseq,alternate)
- categoryFormatError()
- [:firstItemList,:listOfCategoryEntries v]
- l is ['PROGN,:l] => listOfCategoryEntries l
- l is '(NIL) => nil
- sayBrightly '"unexpected category format encountered:"
- pp l
-
-listOfCategoryEntriesIf(pred,conseq,alternate) ==
- alternate in '(%noBranch NIL) =>
- conseq is ['IF,p,c,a] => listOfCategoryEntriesIf(makePrefixForm([pred,p],'AND),c,a)
- [fn for x in listOfEntries conseq] where fn() ==
- x is ['IF,a,b] => ['IF,makePrefixForm([pred,a],'AND),b]
- ['IF,pred,x]
- notPred := makePrefixForm(pred,'NOT)
- conseq is ['IF,p,c,a] =>
- listOfCategoryEntriesIf(makePrefixForm([notPred,p],'AND),c,a)
- [gn for x in listOfEntries conseq] where gn() ==
- x is ['IF,a,b] => ['IF,makePrefixForm([notPred,a],'AND),b]
- ['IF,notPred,x]
-
-orderedDefaults(conform,domform) ==
- $depthAssocCache : local := hashTable 'EQ
- conList := [x for x in orderCatAnc (op := opOf conform) | hasDefaultPackage op]
- acc := nil
- ancestors := ancestorsOf(conform,domform)
- for x in conList repeat
- for y in ancestors | x = CAAR y repeat acc := [y,:acc]
- reverse! acc
-
-instantiate domenv ==
- -- following is a patch for a bug in runtime.as
- -- has a lazy dispatch vector with an instantiated domenv
- VECTORP rest domenv => [$oldAxiomDomainDispatch ,: domenv]
- callForm := second domenv
- oldDom := CDDR domenv
- [functor,:args] := callForm
--- if null(fn := property(functor,'instantiate)) then
--- ofn := symbolFunction functor
--- loadFunctor functor
--- fn := symbolFunction functor
--- symbolFunction(functor) := ofn
--- proprty(functor, 'instantiate) := fn
--- domvec := apply(fn, args)
- domvec := apply(functor, args)
- oldDom.first := $oldAxiomDomainDispatch
- oldDom.rest := [second oldDom,: domvec]
- oldDom
-
-hashTypeForm([fn,: args], percentHash) ==
- hashType([fn,:devaluateList args], percentHash)
-
-$hashOp1 == hashString '"1"
-$hashOp0 == hashString '"0"
-$hashOpApply == hashString '"apply"
-$hashOpSet == hashString '"set!"
-$hashSeg == hashString '".."
-$hashPercent == hashString '"%"
-
-oldAxiomDomainLookupExport _
- (domenv, self, op, sig, box, skipdefaults, env) ==
- domainVec := rest domenv
- if hashCode? op then
- scalarEq?(op, $hashOp1) => op := 'One
- scalarEq?(op, $hashOp0) => op := 'Zero
- scalarEq?(op, $hashOpApply) => op := 'elt
- scalarEq?(op, $hashOpSet) => op := 'setelt
- scalarEq?(op, $hashSeg) => op := 'SEGMENT
- constant := nil
- if hashCode? sig and self and scalarEq?(sig, getDomainHash self) then
- sig := '($)
- constant := true
- val :=
- skipdefaults =>
- oldCompLookupNoDefaults(op, sig, domainVec, self)
- oldCompLookup(op, sig, domainVec, self)
- null val => val
- if constant then val := SPADCALL val
- box.first := val
- box
-
-oldAxiomDomainHashCode(domenv, env) == first domenv
-
-oldAxiomDomainHasCategory(domenv, cat, env) ==
- HasAttribute(domvec := rest domenv, cat) or
- HasCategory(domvec, devaluate cat)
-
-oldAxiomDomainDevaluate(domenv, env) ==
- SExprToDName(rest domenv.0, 'T)
-
-oldAxiomAddChild(domenv, child, env) == [$oldAxiomDomainDispatch,:domenv]
-
-$oldAxiomDomainDispatch :=
- VECTOR('oldAxiomDomain,
- [function oldAxiomDomainDevaluate],
- [nil],
- [function oldAxiomDomainLookupExport],
- [function oldAxiomDomainHashCode],
- [function oldAxiomAddChild])
-
-basicLookupCheckDefaults(op,sig,domain,dollar) ==
- box := [nil]
- not vector?(dispatch := first dollar) => error "bad domain format"
- lookupFun := dispatch.3
- dispatch.0 = 0 => -- new compiler domain object
- hashPercent :=
- vector? dollar => hashType(dollar.0,0)
- hashType(dollar,0)
-
- hashSig :=
- hashCode? sig => sig
- hashType( ['Mapping,:sig], hashPercent)
-
- if symbol? op then op := hashString symbolName op
- first SPADCALL(rest dollar, dollar, op, hashSig, box, not $lookupDefaults, lookupFun)
- first SPADCALL(rest dollar, dollar, op, sig, box, not $lookupDefaults, lookupFun)
-
-$hasCatOpHash == hashString '"%%"
-opIsHasCat op ==
- hashCode? op => scalarEq?(op, $hasCatOpHash)
- op = "%%"
-
--- has cat questions lookup up twice if false
--- replace with following ?
--- not(opIsHasCat op) and
--- (u := lookupInDomainVector(op,sig,domvec,domvec)) => u
-
-oldCompLookup(op, sig, domvec, dollar) ==
- $lookupDefaults: local := false
- u := lookupInDomainVector(op,sig,domvec,dollar) => u
- $lookupDefaults := true
- lookupInDomainVector(op,sig,domvec,dollar)
-
-oldCompLookupNoDefaults(op, sig, domvec, dollar) ==
- $lookupDefaults: local := false
- lookupInDomainVector(op,sig,domvec,dollar)
-
-hashNewLookupInTable(op,sig,dollar,[domain,opvec],flag) ==
- opIsHasCat op =>
- HasCategory(domain, sig)
- if hashCode? op and scalarEq?(op, $hashOp1) then op := 'One
- if hashCode? op and scalarEq?(op, $hashOp0) then op := 'Zero
- hashPercent :=
- vector? dollar => hashType(dollar.0,0)
- hashType(dollar,0)
- if hashCode? sig and scalarEq?(sig, hashPercent) then
- sig := hashType('(Mapping $), hashPercent)
- dollar = nil => systemError()
- $lookupDefaults =>
- hashNewLookupInCategories(op,sig,domain,dollar) --lookup first in my cats
- or newLookupInAddChain(op,sig,domain,dollar)
- --fast path when called from newGoGet
- success := false
- if $monitorNewWorld then
- sayLooking(concat('"---->",form2String devaluate domain,
- '"----> searching op table for:","%l"," "),op,sig,dollar)
- someMatch := false
- numvec := getDomainByteVector domain
- predvec := domainPredicates domain
- max := maxIndex opvec
- k := getOpCode(op,opvec,max) or return
- flag => newLookupInAddChain(op,sig,domain,dollar)
- nil
- idxmax := maxIndex numvec
- start := vectorRef(opvec,k)
- finish :=
- max > k => vectorRef(opvec,k + 2)
- idxmax
- if finish > idxmax then systemError '"limit too large"
- numArgs := if hashCode? sig then -1 else (#sig)-1
- success := nil
- $isDefaultingPackage: local :=
- -- use special defaulting handler when dollar non-trivial
- dollar ~= domain and defaultPackageForm? devaluate domain
- while finish > start repeat
- PROGN
- i := start
- numTableArgs := arrayRef(numvec,i)
- predIndex := arrayRef(numvec,i := i + 1)
- (predIndex ~= 0) and null testBitVector(predvec,predIndex) => nil
- exportSig :=
- [newExpandTypeSlot(numvec.(i + j + 1),
- dollar,domain) for j in 0..numTableArgs]
- sig ~= hashType(['Mapping,: exportSig],hashPercent) => nil --signifies no match
- loc := arrayRef(numvec,i + numTableArgs + 2)
- loc = 1 => (someMatch := true)
- loc = 0 =>
- start := start + numTableArgs + 4
- i := start + 2
- someMatch := true --mark so that if subsumption fails, look for original
- subsumptionSig :=
- [newExpandTypeSlot(arrayRef(numvec,i + j),
- dollar,domain) for j in 0..numTableArgs]
- if $monitorNewWorld then
- sayBrightly [formatOpSignature(op,sig),'"--?-->",
- formatOpSignature(op,subsumptionSig)]
- nil
- slot := vectorRef(domain,loc)
- cons? slot =>
- slot.op = 'newGoGet => someMatch:=true
- --treat as if operation were not there
- --if sameObject?(QCAR slot,'newGoGet) then
- -- UNWIND_-PROTECT --break infinite recursion
- -- ((SETELT(domain,loc,'skip); slot := replaceGoGetSlot rest slot),
- -- if domain.loc = 'skip then domain.loc := slot)
- return (success := slot)
- slot is 'skip => --recursive call from above 'replaceGoGetSlot
- return (success := newLookupInAddChain(op,sig,domain,dollar))
- systemError '"unexpected format"
- start := start + numTableArgs + 4
- (success ~= 'failed) and success =>
- if $monitorNewWorld then
- sayLooking1('"<----",uu) where uu() ==
- cons? success => [first success,:devaluate rest success]
- success
- success
- subsumptionSig and (u:= basicLookup(op,subsumptionSig,domain,dollar)) => u
- flag or someMatch => newLookupInAddChain(op,sig,domain,dollar)
- nil
-
-hashNewLookupInCategories(op,sig,dom,dollar) ==
- slot4 := domainData dom
- catVec := second slot4
- # catVec = 0 => nil --early exit if no categories
- integer? KDR catVec.0 =>
- newLookupInCategories1(op,sig,dom,dollar) --old style
- $lookupDefaults : local := false
- if $monitorNewWorld then sayBrightly concat('"----->",
- form2String devaluate dom,'"-----> searching default packages for ",op)
- predvec := domainPredicates dom
- packageVec := first slot4
---the next three lines can go away with new category world
- varList := ['$,:$FormalMapVariableList]
- valueList := [dom,:[vectorRef(dom,5+i) for i in 1..(# rest dom.0)]]
- valueList := [MKQ val for val in valueList]
- nsig := MSUBST(dom.0,dollar.0,sig)
- for i in 0..maxIndex packageVec |
- (entry := packageVec.i) and entry ~= true repeat
- package :=
- vector? entry =>
- if $monitorNewWorld then
- sayLooking1('"already instantiated cat package",entry)
- entry
- ident? entry =>
- cat := catVec.i
- packageForm := nil
- if not property(entry,'LOADED) then loadLib entry
- infovec := property(entry,'infovec)
- success :=
- --vector? infovec => ----new world
- true => ----new world
- opvec := infovec.1
- max := maxIndex opvec
- code := getOpCode(op,opvec,max)
- null code => nil
- byteVector := CDDDR infovec.3
- endPos :=
- code+2 > max => # byteVector
- vectorRef(opvec,code+2)
- --not nrunNumArgCheck(#sig.source,byteVector,opvec.code,endPos) => nil
- --numOfArgs := byteVector.(opvec.code)
- --numOfArgs ~= #sig.source => nil
- packageForm := [entry,'$,:rest cat]
- package := evalSlotDomain(packageForm,dom)
- packageVec.i := package
- package
- ----old world
- table := tableValue($Slot1DataBase,entry) or systemError nil
- (u := LASSQ(op,table))
- and (v := or/[rest x for x in u]) =>
- packageForm := [entry,'$,:rest cat]
- package := evalSlotDomain(packageForm,dom)
- packageVec.i := package
- package
- nil
- null success =>
- if $monitorNewWorld then
- sayBrightlyNT '" not in: "
- pp (packageForm and devaluate package or entry)
- nil
- if $monitorNewWorld then
- sayLooking1('"candidate default package instantiated: ",success)
- success
- entry
- null package => nil
- if $monitorNewWorld then
- sayLooking1('"Looking at instantiated package ",package)
- res := basicLookup(op,sig,package,dollar) =>
- if $monitorNewWorld then
- sayBrightly '"candidate default package succeeds"
- return res
- if $monitorNewWorld then
- sayBrightly '"candidate fails -- continuing to search categories"
- nil
-
-HasAttribute(domain,attrib) ==
- hashPercent :=
- vector? domain => hashType(domain.0,0)
- hashType(domain,0)
- isDomain domain =>
- integer?((first domain).0) =>
- -- following call to hashType was missing 2nd arg.
- -- getDomainHash domain added on 4/01/94 by RSS
- basicLookup("%%",hashType(attrib, hashPercent),domain,domain)
- HasAttribute(CDDR domain, attrib)
- integer? domainRef(domain,3) => newHasAttribute(domain,attrib)
- (u := LASSOC(attrib,domain.2)) and lookupPred(first u,domain,domain)
-
-newHasAttribute(domain,attrib) ==
- hashPercent :=
- vector? domain => hashType(domain.0,0)
- hashType(domain,0)
- predIndex :=
- hashCode? attrib =>
- -- following call to hashType was missing 2nd arg.
- -- hashPercent added by PAB 15/4/94
- or/[x for x in domain.2 | attrib = hashType(first x, hashPercent)]
- LASSOC(attrib,domain.2)
- predIndex =>
- predIndex = 0 => true
- predvec := domainPredicates domain
- testBitVector(predvec,predIndex)
- false
-
-newHasCategory(domain,catform) ==
- catform = $Type or catform = $Category => true
- catform is ["Join",:cats] =>
- and/[newHasCategory(domain,cat) for cat in cats]
- slot4 := domain.4
- auxvec := first slot4
- catvec := second slot4
- $isDefaultingPackage: local := defaultPackageForm? devaluate domain
- #catvec > 0 and integer? KDR catvec.0 => --old style
- predIndex := lazyMatchAssocV1(catform,catvec,domain)
- null predIndex => false
- predIndex = 0 => true
- predvec := domainPredicates domain
- testBitVector(predvec,predIndex)
- lazyMatchAssocV(catform,auxvec,catvec,domain) --new style
-
-getCatForm(catvec, index, domain) ==
- integer?(form := vectorRef(catvec,index)) => domain.form
- form
-
-HasSignature(domain,[op,sig]) ==
- compiledLookup(op,sig,domain)
-
-HasCategory(domain,catform') ==
- catform' is ['SIGNATURE,:f] => HasSignature(domain,f)
- catform' is ['ATTRIBUTE,f] => HasAttribute(domain,f)
- isDomain domain =>
- integer?((first domain).0) =>
- catform' := devaluate catform'
- basicLookup("%%",catform',domain,domain)
- HasCategory(CDDR domain, catform')
- catform:= devaluate catform'
- integer? domainRef(domain,3) => newHasCategory(domain,catform)
- domain0 := canonicalForm domain -- handles old style domains, Record, Union etc.
- slot4 := domainData domain
- catlist := slot4.1
- member(catform,catlist) or
- opOf(catform) in '(Object Type) or --temporary hack
- or/[compareSigEqual(catform,cat,domain0,domain) for cat in catlist]
-
-domainEqual(a,b) ==
- vector? a and vector? b and a.0 = b.0
-