diff options
Diffstat (limited to 'src/interp/buildom.boot.pamphlet')
-rw-r--r-- | src/interp/buildom.boot.pamphlet | 386 |
1 files changed, 386 insertions, 0 deletions
diff --git a/src/interp/buildom.boot.pamphlet b/src/interp/buildom.boot.pamphlet new file mode 100644 index 00000000..cbbc7a43 --- /dev/null +++ b/src/interp/buildom.boot.pamphlet @@ -0,0 +1,386 @@ +\documentclass{article} +\usepackage{axiom} +\begin{document} +\title{\$SPAD/src/interp buildom.boot} +\author{The Axiom Team} +\maketitle +\begin{abstract} +\end{abstract} +\eject +\tableofcontents +\eject +\section{License} +<<license>>= +-- Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. +-- 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. + +@ +<<*>>= +<<license>> + +-- This file contains the constructors for the domains that cannot +-- be written in ScratchpadII yet. They are not cached because they +-- are very cheap to instantiate. +-- SMW and SCM July 86 + +import '"sys-macros" +)package "BOOT" + +$noCategoryDomains == '(Domain Mode SubDomain) +$nonLisplibDomains == APPEND($Primitives,$noCategoryDomains) + +--% Record +-- Want to eventually have the elts and setelts. +-- Record is a macro in BUILDOM LISP. It takes out the colons. + +isRecord type == type is ["Record",:.] + +RecordInner args == + -- this is old and should be removed wherever it occurs + if $evalDomain then + sayBrightly '"-->> Whoops! RecordInner called from this code." + Record0 VEC2LIST args + +Record0 args == + dom := GETREFV 10 + -- JHD added an extra slot to cache EQUAL methods + dom.0 := ["Record", :[["_:", CAR a, devaluate CDR a] for a in args]] + dom.1 := + [function lookupInTable,dom, + [["_=",[[["Boolean"],"_$","_$"],:12]], + ["coerce",[[$Expression,"_$"],:14]]]] + dom.2 := NIL + dom.3 := ["RecordCategory",:QCDR dom.0] + dom.4 := + [[ '(SetCategory) ],[ '(SetCategory) ]] + dom.5 := [CDR a for a in args] + dom.6 := [function RecordEqual, :dom] + dom.7 := [function RecordPrint, :dom] + dom.8 := [function Undef, :dom] + -- following is cache for equality functions + dom.9 := if (n:= LENGTH args) <= 2 + then [NIL,:NIL] + else GETREFV n + dom + +RecordEqual(x,y,dom) == + PAIRP x => + b:= + SPADCALL(CAR x, CAR y, CAR(dom.9) or + CAR RPLACA(dom.9,findEqualFun(dom.5.0))) + NULL rest(dom.5) => b + b and + SPADCALL(CDR x, CDR y, CDR (dom.9) or + CDR RPLACD(dom.9,findEqualFun(dom.5.1))) + VECP x => + equalfuns := dom.9 + and/[SPADCALL(x.i,y.i,equalfuns.i or (equalfuns.i:=findEqualFun(fdom))) + for i in 0.. for fdom in dom.5] + error '"Bug: Silly record representation" + +RecordPrint(x,dom) == coerceRe2E(x,dom.3) + +coerceVal2E(x,m) == + objValUnwrap coerceByFunction(objNewWrap(x,m),$Expression) + +findEqualFun(dom) == + compiledLookup("_=",[$Boolean,"$","$"],dom) + +coerceRe2E(x,source) == + n := # CDR source + n = 1 => + ["construct", + ["_=", source.1.1, coerceVal2E(CAR x,source.1.2)] ] + n = 2 => + ["construct", + ["_=", source.1.1, coerceVal2E(CAR x,source.1.2)], _ + ["_=", source.2.1, coerceVal2E(CDR x,source.2.2)] ] + VECP x => + ['construct, + :[["_=",tag,coerceVal2E(x.i, fdom)] + for i in 0.. for [.,tag,fdom] in rest source]] + error '"Bug: ridiculous record representation" + + +--% Union +-- Want to eventually have the coerce to and from branch types. + +Union(:args) == + dom := GETREFV 9 + dom.0 := ["Union", :[(if a is ["_:",tag,domval] then ["_:",tag,devaluate domval] + else devaluate a) for a in args]] + dom.1 := + [function lookupInTable,dom, + [["_=",[[["Boolean"],"_$","_$"],:12]], + ["coerce",[[$Expression,"_$"],:14]]]] + dom.2 := NIL + dom.3 := + '(SetCategory) + dom.4 := + [[ '(SetCategory) ],[ '(SetCategory) ]] + dom.5 := args + dom.6 := [function UnionEqual, :dom] + dom.7 := [function UnionPrint, :dom] + dom.8 := [function Undef, :dom] + dom + +UnionEqual(x, y, dom) == + ["Union",:branches] := dom.0 + branches := orderUnionEntries branches + predlist := mkPredList branches + same := false + for b in stripUnionTags branches for p in predlist while not same repeat + typeFun := ["LAMBDA", '(_#1), p] + FUNCALL(typeFun,x) and FUNCALL(typeFun,y) => + STRINGP b => same := (x = y) + if p is ["EQCAR", :.] then (x := rest x; y := rest y) + same := SPADCALL(x, y, findEqualFun(evalDomain b)) + same + +UnionPrint(x, dom) == coerceUn2E(x, dom.0) + +coerceUn2E(x,source) == + ["Union",:branches] := source + branches := orderUnionEntries branches + predlist := mkPredList branches + byGeorge := byJane := GENSYM() + for b in stripUnionTags branches for p in predlist repeat + typeFun := ["LAMBDA", '(_#1), p] + if FUNCALL(typeFun,x) then return + if p is ["EQCAR", :.] then x := rest x +-- STRINGP b => return x -- to catch "failed" etc. + STRINGP b => byGeorge := x -- to catch "failed" etc. + byGeorge := coerceVal2E(x,b) + byGeorge = byJane => + error '"Union bug: Cannot find appropriate branch for coerce to E" + byGeorge + +--% Mapping +-- Want to eventually have elt: ($, args) -> target + +Mapping(:args) == + dom := GETREFV 9 + dom.0 := ["Mapping", :[devaluate a for a in args]] + dom.1 := + [function lookupInTable,dom, + [["_=",[[["Boolean"],"_$","_$"],:12]], + ["coerce",[[$Expression,"_$"],:14]]]] + dom.2 := NIL + dom.3 := + '(SetCategory) + dom.4 := + [[ '(SetCategory) ],[ '(SetCategory) ]] + dom.5 := args + dom.6 := [function MappingEqual, :dom] + dom.7 := [function MappingPrint, :dom] + dom.8 := [function Undef, :dom] + dom + +MappingEqual(x, y, dom) == EQ(x,y) +MappingPrint(x, dom) == coerceMap2E(x) + +coerceMap2E(x) == + -- nrlib domain + ARRAYP CDR x => ["theMap", BPINAME CAR x, + if $testingSystem then 0 else REMAINDER(HASHEQ CDR x, 1000)] + -- aldor + ["theMap", BPINAME CAR x ] + +--% Enumeration + +Enumeration(:"args") == + dom := GETREFV 9 + -- JHD added an extra slot to cache EQUAL methods + dom.0 := ["Enumeration", :args] + dom.1 := + [function lookupInTable,dom, + [["_=",[[["Boolean"],"_$","_$"],:12]], + ["coerce",[[$Expression,"_$"],:14], [["_$", $Symbol], :16]] + ]] + dom.2 := NIL + dom.3 := ["EnumerationCategory",:QCDR dom.0] + dom.4 := + [[ '(SetCategory) ],[ '(SetCategory) ]] + dom.5 := args + dom.6 := [function EnumEqual, :dom] + dom.7 := [function EnumPrint, :dom] + dom.8 := [function createEnum, :dom] + dom + +EnumEqual(e1,e2,dom) == e1=e2 +EnumPrint(enum, dom) == dom.5.enum +createEnum(sym, dom) == + args := dom.5 + val := -1 + for v in args for i in 0.. repeat + sym=v => return(val:=i) + val<0 => error ["Cannot coerce",sym,"to",["Enumeration",:args]] + val + +--% INSTANTIATORS + +RecordCategory(:"x") == constructorCategory ["Record",:x] + +EnumerationCategory(:"x") == constructorCategory ["Enumeration",:x] + +UnionCategory(:"x") == constructorCategory ["Union",:x] + +--ListCategory(:"x") == constructorCategory ("List",:x) + +--VectorCategory(:"x") == constructorCategory ("Vector",:x) + --above two now defined in SPAD code. + +constructorCategory (title is [op,:.]) == + constructorFunction:= GETL(op,"makeFunctionList") or + systemErrorHere '"constructorCategory" + [funlist,.]:= FUNCALL(constructorFunction,"$",title,$CategoryFrame) + oplist:= [[[a,b],true,c] for [a,b,c] in funlist] + cat:= + JoinInner([SetCategory(),mkCategory("domain",oplist,nil,nil,nil)], + $EmptyEnvironment) + cat.(0):= title + cat + +--mkMappingFunList(nam,mapForm,e) == [[],e] +mkMappingFunList(nam,mapForm,e) == + dc := GENSYM() + sigFunAlist:= + [["_=",[["Boolean"],nam ,nam],["ELT",dc,6]], + ["coerce",[$Expression,nam],["ELT",dc,7]]] + [substitute(nam,dc,substitute("$",'Rep,sigFunAlist)),e] + +mkRecordFunList(nam,["Record",:Alist],e) == + len:= #Alist + +-- for (.,a,.) in Alist do +-- if getmode(a,e) then MOAN("Symbol: ",a, +-- " must not be both a variable and literal") +-- e:= put(a,"isLiteral","true",e) + dc := GENSYM() + sigFunAlist:= + --:((a,(A,nam),("XLAM",("$1","$2"),("RECORDELT","$1",i,len))) + -- for i in 0..,(.,a,A) in Alist), + + [["construct",[nam,:[A for [.,a,A] in Alist]],"mkRecord"], + ["_=",[["Boolean"],nam ,nam],["ELT",dc,6]], + ["coerce",[$Expression,nam],["ELT",dc,7]],: + [["elt",[A,nam,PNAME a],["XLAM",["$1","$2"],["RECORDELT","$1",i,len]]] + for i in 0.. for [.,a,A] in Alist],: + [["setelt",[A,nam,PNAME a,A],["XLAM",["$1","$2","$3"], + ["SETRECORDELT","$1",i, len,"$3"]]] + for i in 0.. for [.,a,A] in Alist],: + [["copy",[nam,nam],["XLAM",["$1"],["RECORDCOPY", + "$1",len]]]]] + [substitute(nam,dc,substitute("$","Rep",sigFunAlist)),e] + +mkNewUnionFunList(name,form is ["Union",:listOfEntries],e) == + dc := name + if name = "Rep" then name := "$" + --2. create coercions from subtypes to subUnion + cList:= + [["_=",[["Boolean"],name ,name],["ELT",dc,6]], + ["coerce",[$Expression,name],["ELT",dc,7]],: + ("append"/ + [[["construct",[name,type],["XLAM",["#1"],["CONS",i,"#1"]]], + ["elt",[type,name,tag],cdownFun], + ["case",['(Boolean),name,tag], + ["XLAM",["#1"],["QEQCAR","#1",i]]]] + for [.,tag,type] in listOfEntries for i in 0..])] where + cdownFun() == + gg:=GENSYM() + $InteractiveMode => + ["XLAM",["#1"],["PROG1",["QCDR","#1"], + ["check_-union",["QEQCAR","#1",i],type,"#1"]]] + ["XLAM",["#1"],["PROG2",["LET",gg,"#1"],["QCDR",gg], + ["check_-union",["QEQCAR",gg,i],type,gg]]] + [cList,e] + +mkEnumerationFunList(nam,["Enumeration",:SL],e) == + len:= #SL + dc := nam + cList := + [nil, + ["_=",[["Boolean"],nam ,nam],["ELT",dc,6]], + ["_^_=",[["Boolean"],nam ,nam],["ELT",dc,7]], + ["coerce",[nam, ["Symbol"]], ["ELT", dc, 8]], + ["coerce",[["OutputForm"],nam],["ELT",dc, 9]]] + [substitute(nam, dc, cList),e] + +mkUnionFunList(op,form is ["Union",:listOfEntries],e) == + first listOfEntries is [":",.,.] => mkNewUnionFunList(op,form,e) + -- following call to order is a bug, but needs massive recomp to fix + listOfEntries:= orderUnionEntries listOfEntries + --1. create representations of subtypes + predList:= mkPredList listOfEntries + g:=GENSYM() + --2. create coercions from subtypes to subUnion + cList:= + [["_=",[["Boolean"],g ,g],["ELT",op,6]], + ["coerce",[$Expression,g],["ELT",op,7]],: + ("append"/ + [[["autoCoerce",[g,t],upFun], + ["coerce",[t,g],cdownFun], + ["autoCoerce",[t,g],downFun], --this should be removed eventually + ["case",['(Boolean),g,t],typeFun]] + for p in predList for t in listOfEntries])] where + upFun() == + p is ["EQCAR",x,n] => ["XLAM",["#1"],["CONS",n,"#1"]] + ["XLAM",["#1"],"#1"] + cdownFun() == + gg:=GENSYM() + if p is ["EQCAR",x,n] then + ref:=["QCDR",gg] + q:= ["QEQCAR", gg, n] + else + ref:=gg + q:= substitute(gg,"#1",p) + ["XLAM",["#1"],["PROG2",["LET",gg,"#1"],ref, + ["check_-union",q,t,gg]]] + downFun() == + p is ["EQCAR",x,.] => + ["XLAM",["#1"],["QCDR","#1"]] + ["XLAM",["#1"],"#1"] + typeFun() == + p is ["EQCAR",x,n] => + ["XLAM",["#1"],["QEQCAR",x,n]] + ["XLAM",["#1"],p] + op:= + op="Rep" => "$" + op + cList:= substitute(op,g,cList) + [cList,e] + +@ +\eject +\begin{thebibliography}{99} +\bibitem{1} nothing +\end{thebibliography} +\end{document} |