diff options
author | dos-reis <gdr@axiomatics.org> | 2007-11-07 20:54:59 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2007-11-07 20:54:59 +0000 |
commit | 4edaea6cff2d604009b8f2723a9436b0fc97895d (patch) | |
tree | eb5d3765b2e4f131610571cf5f15eef53419fca0 /src/interp/i-intern.boot | |
parent | 45ce0071c30e84b72e4c603660285fa6a462e7f7 (diff) | |
download | open-axiom-4edaea6cff2d604009b8f2723a9436b0fc97895d.tar.gz |
remove more pamphlets
Diffstat (limited to 'src/interp/i-intern.boot')
-rw-r--r-- | src/interp/i-intern.boot | 455 |
1 files changed, 455 insertions, 0 deletions
diff --git a/src/interp/i-intern.boot b/src/interp/i-intern.boot new file mode 100644 index 00000000..c2cd8a84 --- /dev/null +++ b/src/interp/i-intern.boot @@ -0,0 +1,455 @@ +-- 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. + + +import '"i-object" +import '"ptrees" +)package "BOOT" + +$useParserSrcPos := NIL +$transferParserSrcPos := NIL + +-- Making Trees + +mkAtree x == + -- maker of attrib tree from parser form + mkAtree1 mkAtreeExpandMacros x + +mkAtreeWithSrcPos(form, posnForm) == + posnForm and $useParserSrcPos => pf2Atree(posnForm) + transferSrcPosInfo(posnForm, mkAtree form) + +mkAtree1WithSrcPos(form, posnForm) == + transferSrcPosInfo(posnForm, mkAtree1 form) + +mkAtreeNodeWithSrcPos(form, posnForm) == + transferSrcPosInfo(posnForm, mkAtreeNode form) + +transferSrcPosInfo(pf, atree) == + not (pf and $transferParserSrcPos) => atree + pos := pfPosOrNopos(pf) + pfNoPosition?(pos) => atree + + -- following is a hack because parser code for getting filename + -- seems wrong. + fn := lnPlaceOfOrigin poGetLineObject(pos) + if NULL fn or fn = '"strings" then fn := '"console" + + putSrcPos(atree, fn, pfSourceText(pf), pfLinePosn(pos), pfCharPosn(pos)) + atree + +mkAtreeExpandMacros x == + -- handle macro expansion. if the macros have args we require that + -- we match the correct number of args + if x isnt ["MDEF",:.] and x isnt ["DEF",["macro",:.],:.] then + atom x and (m := isInterpMacro x) => + [args,:body] := m + args => "doNothing" + x := body + x is [op,:argl] => + op = "QUOTE" => "doNothing" + op = "where" and argl is [before,after] => + -- in a where clause, what follows "where" (the "after" parm + -- above) might be a local macro, so do not expand the "before" + -- part yet + x := [op,before,mkAtreeExpandMacros after] + argl := [mkAtreeExpandMacros a for a in argl] + (m := isInterpMacro op) => + [args,:body] := m + #args = #argl => + sl := [[a,:s] for a in args for s in argl] + x := SUBLISNQ(sl,body) + null args => x := [body,:argl] + x := [op,:argl] + x := [mkAtreeExpandMacros op,:argl] + x + +mkAtree1 x == + -- first special handler for making attrib tree + null x => throwKeyedMsg("S2IP0005",['"NIL"]) + VECP x => x + atom x => + x in '(noBranch noMapVal) => x + x in '(nil true false) => mkAtree2([x],x,NIL) + x = '_/throwAway => + -- don't want to actually compute this + tree := mkAtree1 '(void) + putValue(tree,objNewWrap(voidValue(),$Void)) + putModeSet(tree,[$Void]) + tree + getBasicMode x => + v := mkAtreeNode $immediateDataSymbol + putValue(v,getBasicObject x) + v + IDENTP x => mkAtreeNode x + keyedSystemError("S2II0002",[x]) + x is [op,:argl] => mkAtree2(x,op,argl) + systemErrorHere '"mkAtree1" + +-- mkAtree2 and mkAtree3 were created because mkAtree1 got so big + +mkAtree2(x,op,argl) == + nargl := #argl + (op= "-") and (nargl = 1) and (INTEGERP CAR argl) => + mkAtree1(MINUS CAR argl) + op=":" and argl is [y,z] => [mkAtreeNode "Declare",:argl] + op="COLLECT" => [mkAtreeNode op,:transformCollect argl] + op= "break" => + argl is [.,val] => + if val = '$NoValue then val := '(void) + [mkAtreeNode op,mkAtree1 val] + [mkAtreeNode op,mkAtree1 '(void)] + op= "return" => + argl is [val] => + if val = '$NoValue then val := '(void) + [mkAtreeNode op,mkAtree1 val] + [mkAtreeNode op,mkAtree1 '(void)] + op="exit" => mkAtree1 CADR argl + op = "QUOTE" => [mkAtreeNode op,:argl] + op="SEGMENT" => + argl is [a] => [mkAtreeNode op, mkAtree1 a] + z := + null argl.1 => nil + mkAtree1 argl.1 + [mkAtreeNode op, mkAtree1 argl.0,z] + op in '(pretend is isnt) => + [mkAtreeNode op,mkAtree1 first argl,:rest argl] + op = "::" => + [mkAtreeNode "COERCE",mkAtree1 first argl,CADR argl] + x is ["@", expr, type] => + t := evaluateType unabbrev type + t = '(DoubleFloat) and expr is [['_$elt, '(Float), 'float], :args] => + mkAtree1 [['_$elt, '(DoubleFloat), 'float], :args] + t = '(DoubleFloat) and INTEGERP expr => + v := mkAtreeNode $immediateDataSymbol + putValue(v,getBasicObject float expr) + v + t = '(Float) and INTEGERP expr => + mkAtree1 ["::", expr, t] + typeIsASmallInteger(t) and INTEGERP expr => + mkAtree1 ["::", expr, t] + [mkAtreeNode 'TARGET,mkAtree1 expr, type] + (op="case") and (nargl = 2) => + [mkAtreeNode "case",mkAtree1 first argl,unabbrev CADR argl] + op="REPEAT" => [mkAtreeNode op,:transformREPEAT argl] + op="LET" and argl is [['construct,:.],rhs] => + [mkAtreeNode "LET",first argl,mkAtree1 rhs] + op="LET" and argl is [[":",a,.],rhs] => + mkAtree1 ["SEQ",first argl,["LET",a,rhs]] + op is ['_$elt,D,op1] => + op1 is "=" => + a' := [mkAtreeNode '_=,:[mkAtree1 arg for arg in argl]] + [mkAtreeNode "Dollar",D,a'] + [mkAtreeNode "Dollar",D,mkAtree1 [op1,:argl]] + op='_$elt => + argl is [D,a] => + INTEGERP a => + a = 0 => mkAtree1 [['_$elt,D,'Zero]] + a = 1 => mkAtree1 [['_$elt,D,'One]] + t := evaluateType unabbrev [D] + typeIsASmallInteger(t) and SINTP a => + v := mkAtreeNode $immediateDataSymbol + putValue(v,objNewWrap(a, t)) + v + mkAtree1 ["*",a,[['_$elt,D,'One]]] + [mkAtreeNode "Dollar",D,mkAtree1 a] + keyedSystemError("S2II0003",['"$",argl, + '"not qualifying an operator"]) + mkAtree3(x,op,argl) + +mkAtree3(x,op,argl) == + op="REDUCE" and argl is [op1,axis,body] => + [mkAtreeNode op,axis,mkAtree1 op1,mkAtree1 body] + op="has" => [mkAtreeNode op, :argl] + op="|" => [mkAtreeNode "AlgExtension",:[mkAtree1 arg for arg in argl]] + op="=" => [mkAtreeNode "equation",:[mkAtree1 arg for arg in argl]] + op="not" and argl is [["=",lhs,rhs]] => + [mkAtreeNode "not",[mkAtreeNode "=",mkAtree1 lhs,mkAtree1 rhs]] + op="in" and argl is [var ,["SEGMENT",lb,ul]] => + upTest:= + null ul => NIL + mkLessOrEqual(var,ul) + lowTest:=mkLessOrEqual(lb,var) + z := + ul => ['and,lowTest,upTest] + lowTest + mkAtree1 z + x is ["IF",p,"noBranch",a] => mkAtree1 ["IF",["not",p],a,"noBranch"] + x is ["RULEDEF",:.] => [mkAtreeNode "RULEDEF",:CDR x] + x is ["MDEF",sym,junk1,junk2,val] => + -- new macros look like macro f == or macro f(x) === + -- so transform into that format + mkAtree1 ["DEF",["macro",sym],junk1,junk2,val] + x is ["~=",a,b] => mkAtree1 ["not",["=",a,b]] + x is ["+->",funargs,funbody] => + if funbody is [":",body,type] then + types := [type] + funbody := body + else types := [NIL] + v := collectDefTypesAndPreds funargs + types := [:types,:v.1] + [mkAtreeNode "ADEF",[v.0,types,[NIL for a in types],funbody], + if v.2 then v.2 else true, false] + x is ['ADEF,arg,:r] => + r := mkAtreeValueOf r + v := + null arg => VECTOR(NIL,NIL,NIL) + PAIRP arg and rest arg and first arg^= "|" => + collectDefTypesAndPreds ['Tuple,:arg] + null rest arg => collectDefTypesAndPreds first arg + collectDefTypesAndPreds arg + [types,:r'] := r + at := [fn(x,y) for x in rest types for y in v.1] + r := [[first types,:at],:r'] + [mkAtreeNode "ADEF",[v.0,:r],if v.2 then v.2 else true,false] + x is ["where",before,after] => + [mkAtreeNode "where",before,mkAtree1 after] + x is ["DEF",["macro",form],.,.,body] => + [mkAtreeNode "MDEF",form,body] + x is ["DEF",a,:r] => + r := mkAtreeValueOf r + a is [op,:arg] => + v := + null arg => VECTOR(NIL,NIL,NIL) + PAIRP arg and rest arg and first arg^= "|" => + collectDefTypesAndPreds ['Tuple,:arg] + null rest arg => collectDefTypesAndPreds first arg + collectDefTypesAndPreds arg + [types,:r'] := r + -- see case for ADEF above for defn of fn + at := [fn(x,y) for x in rest types for y in v.1] + r := [[first types,:at],:r'] + [mkAtreeNode 'DEF,[[op,:v.0],:r],if v.2 then v.2 else true,false] + [mkAtreeNode 'DEF,[a,:r],true,false] +--x is ['when,y,pred] => +-- y isnt ['DEF,a,:r] => +-- keyedSystemError("S2II0003",['"when",y,'"improper argument form"]) +-- a is [op,p1,:pr] => +-- null pr => mkAtree1 ['DEF,[op,["|",p1,pred]],:r] +-- mkAtree1 ['DEF,[op,["|",['Tuple,p1,:pr],pred]],:r] +-- [mkAtreeNode 'DEF, CDR y,pred,false] +--x is ['otherwise,u] => +-- throwMessage '" otherwise is no longer supported." + z := + getBasicMode op => + v := mkAtreeNode $immediateDataSymbol + putValue(v,getBasicObject op) + v + atom op => mkAtreeNode op + mkAtree1 op + [z,:[mkAtree1 y for y in argl]] + where + fn(a,b) == + a and b => + if a = b then a + else throwMessage '" double declaration of parameter" + a or b + +collectDefTypesAndPreds args == + -- given an arglist to a DEF-like form, this function returns + -- a vector of three things: + -- slot 0: just the variables + -- slot 1: the type declarations on the variables + -- slot 2: a predicate for all arguments + pred := types := vars := NIL + junk := + IDENTP args => + types := [NIL] + vars := [args] + args is [":",var,type] => + types := [type] + var is ["|",var',p] => + vars := [var'] + pred := addPred(pred,p) + vars := [var] + args is ["|",var,p] => + pred := addPred(pred,p) + var is [":",var',type] => + types := [type] + vars := [var'] + var is ['Tuple,:.] or var is ["|",:.] => + v := collectDefTypesAndPreds var + vars := [:vars,:v.0] + types := [:types,:v.1] + pred := addPred(pred,v.2) + vars := [var] + types := [NIL] + args is ['Tuple,:args'] => + for a in args' repeat + v := collectDefTypesAndPreds a + vars := [:vars,first v.0] + types := [:types,first v.1] + pred := addPred(pred,v.2) + types := [NIL] + vars := [args] + VECTOR(vars,types,pred) + where + addPred(old,new) == + null new => old + null old => new + ['and,old,new] + +mkAtreeValueOf l == + -- scans for ['valueOf,atom] + not CONTAINED("valueOf",l) => l + mkAtreeValueOf1 l + +mkAtreeValueOf1 l == + null l or atom l or null rest l => l + l is ["valueOf",u] and IDENTP u => + v := mkAtreeNode $immediateDataSymbol + putValue(v,get(u,"value",$InteractiveFrame) or + objNewWrap(u,['Variable,u])) + v + [mkAtreeValueOf1 x for x in l] + +mkLessOrEqual(lhs,rhs) == ["not",["<",rhs,lhs]] + +atree2EvaluatedTree x == atree2Tree1(x,true) + +atree2Tree1(x,evalIfTrue) == + (triple := getValue x) and objMode(triple) ^= $EmptyMode => + coerceOrCroak(triple,$OutputForm,$mapName) + isLeaf x => + VECP x => x.0 + x + [atree2Tree1(y,evalIfTrue) for y in x] + +--% Environment Utilities + +-- getValueFromEnvironment(x,mode) == +-- $failure ^= (v := getValueFromSpecificEnvironment(x,mode,$env)) => v +-- $failure ^= (v := getValueFromSpecificEnvironment(x,mode,$e)) => v +-- throwKeyedMsg("S2IE0001",[x]) +getValueFromEnvironment(x,mode) == + $failure ^= (v := getValueFromSpecificEnvironment(x,mode,$env)) => v + $failure ^= (v := getValueFromSpecificEnvironment(x,mode,$e)) => v + null(v := coerceInt(objNew(x, ['Variable, x]), mode)) => + throwKeyedMsg("S2IE0001",[x]) + objValUnwrap v + +getValueFromSpecificEnvironment(id,mode,e) == + PAIRP e => + u := get(id,'value,e) => + objMode(u) = $EmptyMode => + systemErrorHere '"getValueFromSpecificEnvironment" + v := objValUnwrap u + mode isnt ['Mapping,:mapSig] => v + v isnt ['MAP,:.] => v + v' := coerceInt(u,mode) + null v' => throwKeyedMsg("S2IC0002",[objMode u,mode]) + objValUnwrap v' + + m := get(id,'mode,e) => + -- See if we can make it into declared mode from symbolic form + -- For example, (x : P[x] I; x + 1) + if isPartialMode(m) then m' := resolveTM(['Variable,id],m) + else m' := m + m' and + (u := coerceInteractive(objNewWrap(id,['Variable,id]),m')) => + objValUnwrap u + + throwKeyedMsg("S2IE0002",[id,m]) + $failure + $failure + +addBindingInteractive(var,proplist,e is [[curContour,:.],:.]) == + -- change proplist of var in e destructively + u := ASSQ(var,curContour) => + RPLACD(u,proplist) + e + RPLAC(CAAR e,[[var,:proplist],:curContour]) + e + +augProplistInteractive(proplist,prop,val) == + u := ASSQ(prop,proplist) => + RPLACD(u,val) + proplist + [[prop,:val],:proplist] + +getFlag x == get("--flags--",x,$e) + +putFlag(flag,value) == + $e := put ("--flags--", flag, value, $e) + +getI(x,prop) == get(x,prop,$InteractiveFrame) + +putI(x,prop,val) == ($InteractiveFrame := put(x,prop,val,$InteractiveFrame)) + +getIProplist x == getProplist(x,$InteractiveFrame) + +removeBindingI x == + RPLAC(CAAR $InteractiveFrame,deleteAssocWOC(x,CAAR $InteractiveFrame)) + +rempropI(x,prop) == + id:= + atom x => x + first x + getI(id,prop) => + recordNewValue(id,prop,NIL) + recordOldValue(id,prop,getI(id,prop)) + $InteractiveFrame:= remprop(id,prop,$InteractiveFrame) + +remprop(x,prop,e) == + u:= ASSOC(prop,pl:= getProplist(x,e)) => + e:= addBinding(x,DELASC(first u,pl),e) + e + e + +fastSearchCurrentEnv(x,currentEnv) == + u:= QLASSQ(x,CAR currentEnv) => u + while (currentEnv:= QCDR currentEnv) repeat + u:= QLASSQ(x,CAR currentEnv) => u + +putIntSymTab(x,prop,val,e) == + null atom x => putIntSymTab(first x,prop,val,e) + pl0 := pl := search(x,e) + pl := + null pl => [[prop,:val]] + u := ASSQ(prop,pl) => + RPLACD(u,val) + pl + lp := LASTPAIR pl + u := [[prop,:val]] + RPLACD(lp,u) + pl + EQ(pl0,pl) => e + addIntSymTabBinding(x,pl,e) + +addIntSymTabBinding(var,proplist,e is [[curContour,:.],:.]) == + -- change proplist of var in e destructively + u := ASSQ(var,curContour) => + RPLACD(u,proplist) + e + RPLAC(CAAR e,[[var,:proplist],:curContour]) + e + + |