diff options
author | dos-reis <gdr@axiomatics.org> | 2011-05-19 17:02:42 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2011-05-19 17:02:42 +0000 |
commit | 5c4ff220c3ba9a37ffaf875e218c36ae0a436631 (patch) | |
tree | fa3160f03e36c6630c8a21e9ad0d9db035bc6d48 /src/interp/buildom.boot | |
parent | ef1f327becb0cc095e887dcfe98f9e390d225ed8 (diff) | |
download | open-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.boot | 33 |
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) == |