aboutsummaryrefslogtreecommitdiff
path: root/src/interp/buildom.boot
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2011-05-19 17:02:42 +0000
committerdos-reis <gdr@axiomatics.org>2011-05-19 17:02:42 +0000
commit5c4ff220c3ba9a37ffaf875e218c36ae0a436631 (patch)
treefa3160f03e36c6630c8a21e9ad0d9db035bc6d48 /src/interp/buildom.boot
parentef1f327becb0cc095e887dcfe98f9e390d225ed8 (diff)
downloadopen-axiom-5c4ff220c3ba9a37ffaf875e218c36ae0a436631.tar.gz
* interp/i-analy.boot (bottomUpForm0): Tidy.
* interp/i-eval.boot (evalForm): Likewise. * interp/buildom.boot (formalRecordField): New. (eltRecordFun): Use it. (seteltRecordFun): New. * interp/g-opt.boot (optSETRECORDELT): Remove. (optRECORDCOPY): Likewise. * interp/vmlisp.lisp (MAKE-VEC): Likewise.
Diffstat (limited to 'src/interp/buildom.boot')
-rw-r--r--src/interp/buildom.boot33
1 files changed, 21 insertions, 12 deletions
diff --git a/src/interp/buildom.boot b/src/interp/buildom.boot
index 2db25403..5e666fcf 100644
--- a/src/interp/buildom.boot
+++ b/src/interp/buildom.boot
@@ -573,7 +573,6 @@ constructorCategory (title is [op,:.]) ==
canonicalForm(cat) := title
cat
---mkMappingFunList(nam,mapForm,e) == [[],e]
mkMappingFunList(nam,mapForm,e) ==
nargs := #rest mapForm
dc := gensym()
@@ -595,16 +594,27 @@ mkRecordFun n ==
'%vector
["XLAM",args,[op,:args]]
+++ Build expression for selecting the i-th field of a fomal record
+++ variable of length `n'.
+formalRecordField(n,i) ==
+ n < 2 => ['%head,"#1"]
+ n = 2 =>
+ i = 0 => ['%head,"#1"]
+ ['%tail,"#1"]
+ ['%vref,"#1",i]
+
++ Build an inline function for selecting field `i' or a
++ record of length `n'.
eltRecordFun(n,i) ==
- body :=
- n < 2 => ['%head,"#1"]
- n = 2 =>
- i = 0 => ['%head,"#1"]
- ['%tail,"#1"]
- ['%vref,"#1",i]
- ["XLAM",["#1","#2"],body]
+ ["XLAM",["#1","#2"],formalRecordField(n,i)]
+
+seteltRecordFun(n,i) ==
+ args := take(3,$FormalMapVariableList)
+ field := formalRecordField(n,i)
+ body :=
+ n > 2 => ['%store,field,"#3"]
+ ['SEQ,['%store,field,"#3"],['EXIT,field]]
+ ["XLAM",args,body]
copyRecordFun n ==
body :=
@@ -624,10 +634,9 @@ mkRecordFunList(nam,["Record",:Alist],e) ==
["coerce",[$OutputForm,nam],["ELT",dc,$FirstParamSlot+len+1]],:
[["elt",[A,nam,PNAME a],eltRecordFun(len,i)]
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],copyRecordFun len]]]
+ [["setelt",[A,nam,PNAME a,A],seteltRecordFun(len,i)]
+ for i in 0.. for [.,a,A] in Alist],
+ ["copy",[nam,nam],copyRecordFun len]]
[substitute(nam,dc,substituteDollarIfRepHack sigFunAlist),e]
mkNewUnionFunList(name,form is ["Union",:listOfEntries],e) ==