From c0477ca18e99fcf5e091d2bc4ffe8dd76eae36dd Mon Sep 17 00:00:00 2001 From: dos-reis Date: Fri, 4 Sep 2009 16:27:26 +0000 Subject: --- src/boot/ast.boot | 487 ++++++++++++++++++++-------------------- src/boot/strap/ast.clisp | 77 ++++--- src/boot/strap/parser.clisp | 2 +- src/boot/strap/translator.clisp | 14 +- 4 files changed, 294 insertions(+), 286 deletions(-) diff --git a/src/boot/ast.boot b/src/boot/ast.boot index f455cc3b..e8973230 100644 --- a/src/boot/ast.boot +++ b/src/boot/ast.boot @@ -223,16 +223,16 @@ bfTupleIf x== bfTuple x bfTupleConstruct b == - a:= if bfTupleP b - then cdr b - else [b] + a := + bfTupleP b => rest b + [b] or/[x is ["COLON",.] for x in a] => bfMakeCons a ["LIST",:a] bfConstruct b == - a:= if bfTupleP b - then cdr b - else [b] + a := + bfTupleP b => rest b + [b] bfMakeCons a bfMakeCons l == @@ -248,9 +248,13 @@ bfFor(bflhs,U,step) == bfForTree('IN, bflhs, U) bfForTree(OP,lhs,whole)== - whole:=if bfTupleP whole then bfMakeCons cdr whole else whole - atom lhs =>bfINON [OP,lhs,whole] - lhs:=if bfTupleP lhs then second lhs else lhs + whole := + bfTupleP whole => bfMakeCons rest whole + whole + atom lhs => bfINON [OP,lhs,whole] + lhs := + bfTupleP lhs => second lhs + lhs lhs is ["L%T",:.] => G:=second lhs [:bfINON [OP,G,whole],:bfSuchthat bfIS(G,third lhs)] @@ -259,46 +263,46 @@ bfForTree(OP,lhs,whole)== bfSTEP(id,fst,step,lst)== - initvar:=[id] - initval:=[fst] - inc:=if atom step - then step - else - g1:=bfGenSymbol() - initvar:=cons(g1,initvar) - initval:=cons(step,initval) - g1 - final:=if atom lst - then lst - else - g2:=bfGenSymbol() - initvar:=cons(g2,initvar) - initval:=cons(lst,initval) - g2 - ex:= - null lst=> [] - INTEGERP inc => - pred:=if MINUSP inc then "<" else ">" - [[pred,id,final]] - [['COND,[['MINUSP,inc], - ["<",id,final]],['T,[">",id,final]]]] - suc:=[['SETQ,id,["+",id,inc]]] - [[initvar,initval,suc,[],ex,[]]] + initvar := [id] + initval := [fst] + inc := + atom step => step + g1 := bfGenSymbol() + initvar := cons(g1,initvar) + initval := cons(step,initval) + g1 + final := + atom lst => lst + g2 := bfGenSymbol() + initvar := cons(g2,initvar) + initval := cons(lst,initval) + g2 + ex := + null lst=> [] + INTEGERP inc => + pred := + MINUSP inc => "<" + ">" + [[pred,id,final]] + [['COND,[['MINUSP,inc], + ["<",id,final]],['T,[">",id,final]]]] + suc := [['SETQ,id,["+",id,inc]]] + [[initvar,initval,suc,[],ex,[]]] bfINON x== - [op,id,whole]:=x + [op,id,whole] := x op = "ON" => bfON(id,whole) bfIN(id,whole) bfIN(x,E)== - g:=bfGenSymbol() - [[[g,x],[E,nil],[['SETQ,g,['CDR, g]]],[], - [['OR,['ATOM,g],['PROGN,['SETQ,x,['CAR,g]] ,'NIL]]],[]]] + g := bfGenSymbol() + [[[g,x],[E,nil],[['SETQ,g,['CDR, g]]],[], + [['OR,['ATOM,g],['PROGN,['SETQ,x,['CAR,g]] ,'NIL]]],[]]] bfON(x,E)== - [[[x],[E],[['SETQ,x,['CDR, x]]],[], - [['ATOM,x]],[]]] + [[[x],[E],[['SETQ,x,['CDR, x]]],[], + [['ATOM,x]],[]]] bfSuchthat p== [[[],[],[],[p],[],[]]] @@ -327,7 +331,9 @@ bfSep(iters)== [append(i,j) for i in f for j in r] bfReduce(op,y)== - a :=if op is ["QUOTE",:.] then second op else op + a := + op is ["QUOTE",:.] => second op + op op := bfReName a init := GET(a,"SHOETHETA") or GET(op,"SHOETHETA") g := bfGenSymbol() @@ -347,7 +353,9 @@ bfReduceCollect(op,y)== y is ["COLLECT",:.] => body := y.1 itl := y.2 - a := if op is ["QUOTE",:.] then second op else op + a := + op is ["QUOTE",:.] => second op + op op := bfReName a init := GET(a, "SHOETHETA") or GET(op,"SHOETHETA") bfOpReduce(op,init,body,itl) @@ -386,8 +394,12 @@ bfListReduce(op,y,itl)== bfLp1(iters,body)== [vars,inits,sucs,filters,exits,value] := bfSep bfAppend iters - nbody := if null filters then body else bfAND [:filters,body] - value := if null value then "NIL" else first value + nbody := + null filters => body + bfAND [:filters,body] + value := + null value => "NIL" + first value exits := ["COND",[bfOR exits,["RETURN",value]],['T,nbody]] loop := ["LOOP",exits,:sucs] if vars then loop := @@ -461,25 +473,23 @@ bfSUBLIS(p,e)== +++ We don't enforce that restriction though. bfSUBLIS1(p,e)== null p =>e - f:=first p - EQ(first f,e)=> bfSUBLIS(p, rest f) + f := first p + EQ(first f,e) => bfSUBLIS(p, rest f) bfSUBLIS1(cdr p,e) defSheepAndGoats(x)== case x of %Definition(op,args,body) => - argl:=if bfTupleP args - then rest args - else [args] - if null argl - then - opassoc:=[[op,:body]] + argl := + bfTupleP args => rest args + [args] + null argl => + opassoc := [[op,:body]] [opassoc,[],[]] - else - op1:=INTERN CONCAT(PNAME $op,'",",PNAME op) - opassoc:=[[op,:op1]] - defstack:=[[op1,args,body]] - [opassoc,defstack,[]] + op1 := INTERN CONCAT(PNAME $op,'",",PNAME op) + opassoc := [[op,:op1]] + defstack := [[op1,args,body]] + [opassoc,defstack,[]] %Pile defs => defSheepAndGoatsList defs otherwise => [[],[],[x]] @@ -495,11 +505,11 @@ bfLetForm(lhs,rhs) == ['L%T,lhs,rhs] bfLET1(lhs,rhs) == - IDENTP lhs => bfLetForm(lhs,rhs) + IDENTP lhs => bfLetForm(lhs,rhs) lhs is ['FLUID,.] => bfLetForm(lhs,rhs) IDENTP rhs and not bfCONTAINED(rhs,lhs) => rhs1 := bfLET2(lhs,rhs) - rhs1 is ["L%T",:.] => bfMKPROGN [rhs1,rhs] + rhs1 is ["L%T",:.] => bfMKPROGN [rhs1,rhs] rhs1 is ["PROGN",:.] => APPEND(rhs1,[rhs]) if IDENTP first rhs1 then rhs1 := CONS(rhs1,NIL) bfMKPROGN [:rhs1,rhs] @@ -556,8 +566,7 @@ bfLET2(lhs,rhs) == [['L%T,g,rev],:REVERSE rest REVERSE l2, bfLetForm(var1,['NREVERSE,val1])] [['L%T,g,rev],:l2,bfLetForm(var1,['NREVERSE,var1])] - lhs is ["EQUAL",var1] => - ['COND,[["EQUAL",var1,rhs],var1]] + lhs is ["EQUAL",var1] => ['COND,[bfQ(var1,rhs),var1]] -- The original expression may be one that involves literals as -- sub-patterns, e.g. -- ['SEQ, :l, ['exit, 1, x]] := item @@ -588,21 +597,21 @@ addCARorCDR(acc,expr) == CAADDR CADAAR CADDAR CADADR CADDDR) funsR := '(CDAR CDDR CDAAR CDDAR CDADR CDDDR CDAAAR CDADAR CDAADR CDADDR CDDAAR CDDDAR CDDADR CDDDDR) - if acc = 'CAR then CONS(funsA.p,rest expr) - else CONS(funsR.p,rest expr) + acc = 'CAR => CONS(funsA.p,rest expr) + CONS(funsR.p,rest expr) bfPosition(x,l) == bfPosn(x,l,0) bfPosn(x,l,n) == - null l => -1 - x=first l => n - bfPosn(x,rest l,n+1) + null l => -1 + x=first l => n + bfPosn(x,rest l,n+1) --% IS bfISApplication(op,left,right)== - op = "IS" => bfIS(left,right) - op = "ISNT" => bfNOT bfIS(left,right) - [op ,left,right] + op = "IS" => bfIS(left,right) + op = "ISNT" => bfNOT bfIS(left,right) + [op ,left,right] bfIS(left,right)== $isGenVarCounter:local :=1 @@ -636,17 +645,11 @@ bfIS1(lhs,rhs) == bfMKPROGN [['L%T,g,lhs],bfIS1(g,rhs)] rhs is ['CONS,a,b] => a = "DOT" => - NULL b => - bfAND [['CONSP,lhs], - ['EQ,['CDR,lhs],'NIL]] - bfAND [['CONSP,lhs], - bfIS1(['CDR,lhs],b)] + NULL b => bfAND [['CONSP,lhs],['NULL,['CDR,lhs]]] + bfAND [['CONSP,lhs],bfIS1(['CDR,lhs],b)] NULL b => - bfAND [['CONSP,lhs], - ['EQ,['CDR,lhs],'NIL],_ - bfIS1(['CAR,lhs],a)] - b = "DOT" => - bfAND [['CONSP,lhs],bfIS1(['CAR,lhs],a)] + bfAND [['CONSP,lhs],['NULL,['CDR,lhs]],bfIS1(['CAR,lhs],a)] + b = "DOT" => bfAND [['CONSP,lhs],bfIS1(['CAR,lhs],a)] a1 := bfIS1(['CAR,lhs],a) b1 := bfIS1(['CDR,lhs],b) a1 is ['PROGN,c,'T] and b1 is ['PROGN,:cls] => @@ -690,26 +693,25 @@ bfNOT x== ["NOT",x] bfFlatten(op, x) == - x is [=op,:.] => rest x - [x] + x is [=op,:.] => rest x + [x] bfOR l == - null l => NIL - null rest l => first l - ["OR",:[:bfFlatten("OR",c) for c in l]] + null l => NIL + null rest l => first l + ["OR",:[:bfFlatten("OR",c) for c in l]] bfAND l == - null l=> 'T - null rest l => first l - ["AND",:[:bfFlatten("AND",c) for c in l]] + null l=> 'T + null rest l => first l + ["AND",:[:bfFlatten("AND",c) for c in l]] defQuoteId x== x is ["QUOTE",:.] and IDENTP second x bfSmintable x== - INTEGERP x or CONSP x and - first x in '(SIZE LENGTH char) + INTEGERP x or CONSP x and first x in '(SIZE LENGTH char) bfQ(l,r)== bfSmintable l or bfSmintable r => ["EQL",l,r] @@ -725,7 +727,9 @@ bfLessp(l,r)== ["<",l,r] bfMDef (op,args,body) == - argl:=if bfTupleP args then cdr args else [args] + argl := + bfTupleP args => rest args + [args] [gargl,sgargl,nargl,largl]:=bfGargl argl sb:=[cons(i,j) for i in nargl for j in sgargl] body:= SUBLIS(sb,body) @@ -736,21 +740,20 @@ bfMDef (op,args,body) == [shoeComp def,:[:shoeComps bfDef1 d for d in $wheredefs]] bfGargl argl== - if null argl - then [[],[],[],[]] - else - [a,b,c,d]:=bfGargl rest argl - if first argl="&REST" - then [cons(first argl,b),b,c, - cons(["CONS",["QUOTE","LIST"],first d],rest d)] - else - f:=bfGenSymbol() - [cons(f,a),cons(f,b),cons(first argl,c),cons(f,d)] + null argl => [[],[],[],[]] + [a,b,c,d] := bfGargl rest argl + first argl="&REST" => + [cons(first argl,b),b,c, + cons(["CONS",["QUOTE","LIST"],first d],rest d)] + f := bfGenSymbol() + [cons(f,a),cons(f,b),cons(first argl,c),cons(f,d)] bfDef1 [op,args,body] == - argl:=if bfTupleP args then rest args else [args] + argl := + bfTupleP args => rest args + [args] [quotes,control,arglp,body]:=bfInsertLet (argl,body) - quotes=>shoeLAM(op,arglp,control,body) + quotes => shoeLAM(op,arglp,control,body) [[op,["LAMBDA",arglp,body]]] shoeLAM (op,args,control,body)== @@ -762,8 +765,8 @@ shoeLAM (op,args,control,body)== bfDef(op,args,body) == $bfClamming => - [.,op1,arg1,:body1]:=shoeComp first bfDef1 [op,args,body] - bfCompHash(op1,arg1,body1) + [.,op1,arg1,:body1] := shoeComp first bfDef1 [op,args,body] + bfCompHash(op1,arg1,body1) bfTuple [:shoeComps bfDef1 d for d in cons([op,args,body],$wheredefs)] @@ -771,9 +774,9 @@ shoeComps x== [shoeComp def for def in x] shoeComp x== - a:=shoeCompTran second x - a is ["LAMBDA",:.] => ["DEFUN",first x,second a,:CDDR a] - ["DEFMACRO",first x,second a,:CDDR a] + a:=shoeCompTran second x + a is ["LAMBDA",:.] => ["DEFUN",first x,second a,:CDDR a] + ["DEFMACRO",first x,second a,:CDDR a] ++ Translate function parameter list to Lisp. @@ -792,54 +795,51 @@ bfParameterList(p1,p2) == [p1,:p2] bfInsertLet(x,body)== - if null x - then [false,nil,x,body] - else - if x is ["&REST",a] - then if a is ["QUOTE",b] - then [true,"QUOTE",["&REST",b],body] - else [false,nil,x,body] - else - [b,norq,name1,body1]:= bfInsertLet1 (first x,body) - [b1,norq1,name2,body2]:= bfInsertLet (rest x,body1) - [b or b1,cons(norq,norq1),bfParameterList(name1,name2),body2] + null x => [false,nil,x,body] + x is ["&REST",a] => + a is ["QUOTE",b] => [true,"QUOTE",["&REST",b],body] + [false,nil,x,body] + [b,norq,name1,body1] := bfInsertLet1 (first x,body) + [b1,norq1,name2,body2] := bfInsertLet (rest x,body1) + [b or b1,cons(norq,norq1),bfParameterList(name1,name2),body2] bfInsertLet1(y,body)== - y is ["L%T",l,r] => [false,nil,l,bfMKPROGN [bfLET(r,l),body]] - IDENTP y => [false,nil,y,body] - y is ["BVQUOTE",b] => [true,"QUOTE",b,body] - g:=bfGenSymbol() - atom y => [false,nil,g,body] - case y of - %DefaultValue(p,v) => [false,nil,["&OPTIONAL",[p,v]],body] - otherwise => [false,nil,g,bfMKPROGN [bfLET(compFluidize y,g),body]] + y is ["L%T",l,r] => [false,nil,l,bfMKPROGN [bfLET(r,l),body]] + IDENTP y => [false,nil,y,body] + y is ["BVQUOTE",b] => [true,"QUOTE",b,body] + g:=bfGenSymbol() + atom y => [false,nil,g,body] + case y of + %DefaultValue(p,v) => [false,nil,["&OPTIONAL",[p,v]],body] + otherwise => [false,nil,g,bfMKPROGN [bfLET(compFluidize y,g),body]] shoeCompTran x== - lamtype:=first x - args :=second x - body :=CDDR x - $fluidVars:local:=nil - $locVars:local:=nil - $dollarVars:local:=nil - shoeCompTran1 body - $locVars:=SETDIFFERENCE(SETDIFFERENCE($locVars, - $fluidVars),shoeATOMs args) - body:= - lvars:=append($fluidVars,$locVars) - $fluidVars:=UNION($fluidVars,$dollarVars) - body' := body - if $typings then body' := [["DECLARE",:$typings],:body'] - if $fluidVars then - fvars:=["DECLARE",["SPECIAL",:$fluidVars]] - body' := [fvars,:body'] - if lvars or needsPROG body then shoePROG(lvars,body') else body' - fl:=shoeFluids args - body:=if fl - then - fvs:=["DECLARE",["SPECIAL",:fl]] - cons(fvs,body) - else body - [lamtype,args, :body] + lamtype:=first x + args :=second x + body :=CDDR x + $fluidVars:local:=nil + $locVars:local:=nil + $dollarVars:local:=nil + shoeCompTran1 body + $locVars:=SETDIFFERENCE(SETDIFFERENCE($locVars, + $fluidVars),shoeATOMs args) + body:= + lvars:=append($fluidVars,$locVars) + $fluidVars:=UNION($fluidVars,$dollarVars) + body' := body + if $typings then body' := [["DECLARE",:$typings],:body'] + if $fluidVars then + fvars:=["DECLARE",["SPECIAL",:$fluidVars]] + body' := [fvars,:body'] + lvars or needsPROG body => shoePROG(lvars,body') + body' + fl := shoeFluids args + body := + fl => + fvs:=["DECLARE",["SPECIAL",:fl]] + cons(fvs,body) + body + [lamtype,args, :body] needsPROG body == atom body => false @@ -850,9 +850,9 @@ needsPROG body == false shoePROG(v,b)== - null b => [["PROG", v]] - [:blist,blast] := b - [["PROG",v,:blist,["RETURN", blast]]] + null b => [["PROG", v]] + [:blist,blast] := b + [["PROG",v,:blist,["RETURN", blast]]] shoeFluids x== null x => nil @@ -878,40 +878,40 @@ isDynamicVariable x == false shoeCompTran1 x== - atom x=> - isDynamicVariable x => - $dollarVars:= - MEMQ(x,$dollarVars)=>$dollarVars - cons(x,$dollarVars) - nil - U:=car x - U = "QUOTE" => nil - x is ["L%T",l,r]=> - RPLACA (x,"SETQ") - shoeCompTran1 r - IDENTP l => - not bfBeginsDollar l=> - $locVars:= - MEMQ(l,$locVars)=>$locVars - cons(l,$locVars) - $dollarVars:= - MEMQ(l,$dollarVars)=>$dollarVars - cons(l,$dollarVars) - l is ["FLUID",:.] => - $fluidVars:= - MEMQ(second l,$fluidVars)=>$fluidVars - cons(second l,$fluidVars) - RPLACA (rest x,second l) - MEMQ(U,'(PROG LAMBDA))=> - newbindings:=nil - for y in second x repeat - not MEMQ(y,$locVars)=> - $locVars:=cons(y,$locVars) - newbindings:=cons(y,newbindings) - res:=shoeCompTran1 CDDR x - $locVars:=[y for y in $locVars | not MEMQ(y,newbindings)] - shoeCompTran1 first x - shoeCompTran1 rest x + atom x=> + isDynamicVariable x => + $dollarVars:= + MEMQ(x,$dollarVars)=>$dollarVars + cons(x,$dollarVars) + nil + U:=car x + U = "QUOTE" => nil + x is ["L%T",l,r] => + RPLACA (x,"SETQ") + shoeCompTran1 r + IDENTP l => + not bfBeginsDollar l=> + $locVars:= + MEMQ(l,$locVars)=>$locVars + cons(l,$locVars) + $dollarVars:= + MEMQ(l,$dollarVars)=>$dollarVars + cons(l,$dollarVars) + l is ["FLUID",:.] => + $fluidVars:= + MEMQ(second l,$fluidVars)=>$fluidVars + cons(second l,$fluidVars) + RPLACA (rest x,second l) + MEMQ(U,'(PROG LAMBDA))=> + newbindings:=nil + for y in second x repeat + not MEMQ(y,$locVars)=> + $locVars:=cons(y,$locVars) + newbindings:=cons(y,newbindings) + res := shoeCompTran1 CDDR x + $locVars := [y for y in $locVars | not MEMQ(y,newbindings)] + shoeCompTran1 first x + shoeCompTran1 rest x bfTagged(a,b)== null $op => %Signature(a,b) -- surely a toplevel decl @@ -932,46 +932,54 @@ bfSetelt(e,l,r)== bfSetelt(bfElt(e,first l),rest l,r) bfElt(expr,sel)== - y:=SYMBOLP sel and GET(sel,"SHOESELFUNCTION") - y=> - INTEGERP y => ["ELT",expr,y] - [y,expr] - ["ELT",expr,sel] + y:=SYMBOLP sel and GET(sel,"SHOESELFUNCTION") + y => + INTEGERP y => ["ELT",expr,y] + [y,expr] + ["ELT",expr,sel] defSETELT(var,sel,expr)== - y:=SYMBOLP sel and GET(sel,"SHOESELFUNCTION") - y=> - INTEGERP y => ["SETF",["ELT",var,y],expr] - ["SETF",[y,var],expr] - ["SETF",["ELT",var,sel],expr] + y := SYMBOLP sel and GET(sel,"SHOESELFUNCTION") + y => + INTEGERP y => ["SETF",["ELT",var,y],expr] + ["SETF",[y,var],expr] + ["SETF",["ELT",var,sel],expr] bfIfThenOnly(a,b)== - b1:=if b is ["PROGN",:.] then rest b else [b] - ["COND",[a,:b1]] + b1 := + b is ["PROGN",:.] => rest b + [b] + ["COND",[a,:b1]] bfIf(a,b,c)== - b1:=if b is ["PROGN",:.] then rest b else [b] - c is ["COND",:.] => ["COND",[a,:b1],:rest c] - c1:=if c is ["PROGN",:.] then rest c else [c] - ["COND",[a,:b1],['T,:c1]] + b1 := + b is ["PROGN",:.] => rest b + [b] + c is ["COND",:.] => ["COND",[a,:b1],:rest c] + c1 := + c is ["PROGN",:.] => rest c + [c] + ["COND",[a,:b1],['T,:c1]] bfExit(a,b)== ["COND",[a,["IDENTITY",b]]] bfMKPROGN l== - a:=[:bfFlattenSeq c for c in tails l] - null a=> nil - null rest a=> first a - ["PROGN",:a] + a := [:bfFlattenSeq c for c in tails l] + null a => nil + null rest a => first a + ["PROGN",:a] bfFlattenSeq x == - null x=>NIL - f:=first x - atom f =>if rest x then nil else [f] - f is ["PROGN",:.] => - rest x=> [i for i in rest f| not atom i] - rest f - [f] + null x => NIL + f := first x + atom f => + rest x => nil + [f] + f is ["PROGN",:.] => + rest x => [i for i in rest f| not atom i] + rest f + [f] ++ The body of each branch of a COND form is an implicit PROGN. ++ For readability purpose, we want to refrain from including @@ -986,19 +994,19 @@ bfAlternative(a,b) == [a,:bfWashCONDBranchBody b] bfSequence l == - null l=> NIL - transform:= [bfAlternative(a,b) for x in l while - x is ["COND",[a,["IDENTITY",b]]]] - no:=#transform - before:= bfTake(no,l) - aft := bfDrop(no,l) - null before => - l is [f] => - f is ["PROGN",:.] => bfSequence rest f - f - bfMKPROGN [first l,bfSequence rest l] - null aft => ["COND",:transform] - ["COND",:transform,bfAlternative('T,bfSequence aft)] + null l => NIL + transform := [bfAlternative(a,b) for x in l while + x is ["COND",[a,["IDENTITY",b]]]] + no := #transform + before := bfTake(no,l) + aft := bfDrop(no,l) + null before => + l is [f] => + f is ["PROGN",:.] => bfSequence rest f + f + bfMKPROGN [first l,bfSequence rest l] + null aft => ["COND",:transform] + ["COND",:transform,bfAlternative('T,bfSequence aft)] bfWhere (context,expr)== [opassoc,defs,nondefs] := defSheepAndGoats context @@ -1059,8 +1067,10 @@ bfNameOnly x== bfNameArgs: (%Thing,%Thing) -> %List bfNameArgs (x,y)== - y:=if y is ["TUPLE",:.] then rest y else [y] - cons(x,y) + y := + y is ["TUPLE",:.] => rest y + [y] + cons(x,y) bfCreateDef: %Thing -> %List bfCreateDef x== @@ -1090,21 +1100,20 @@ bfCaseItems(g,x) == bfCI: (%Thing,%Thing,%Thing) -> %List bfCI(g,x,y)== - a:=rest x - if null a - then [first x,y] - else - b:=[[i,bfCARCDR(j,g)] for i in a for j in 1.. | i ~= "DOT"] - null b => [first x,y] - [first x,["LET",b,y]] + a := rest x + null a => [first x,y] + b := [[i,bfCARCDR(j,g)] for i in a for j in 1.. | i ~= "DOT"] + null b => [first x,y] + [first x,["LET",b,y]] bfCARCDR: (%Short,%Thing) -> %List bfCARCDR(n,g) == [INTERN CONCAT ('"CA",bfDs n,'"R"),g] bfDs: %Short -> %String -bfDs n== - if n=0 then '"" else CONCAT('"D",bfDs(n-1)) +bfDs n == + n = 0 => '"" + CONCAT('"D",bfDs(n-1)) ++ Generate code for try-catch expressions. diff --git a/src/boot/strap/ast.clisp b/src/boot/strap/ast.clisp index cf2067e7..0c52e92b 100644 --- a/src/boot/strap/ast.clisp +++ b/src/boot/strap/ast.clisp @@ -256,7 +256,7 @@ (PROGN (SETQ |ISTMP#1| (CDR |x|)) (AND (CONSP |ISTMP#1|) - (EQ (CDR |ISTMP#1|) NIL))))) + (NULL (CDR |ISTMP#1|)))))) (COND (|bfVar#80| (RETURN |bfVar#80|)))))) (SETQ |bfVar#79| (CDR |bfVar#79|)))) (|bfMakeCons| |a|)) @@ -280,7 +280,7 @@ (AND (CONSP |ISTMP#1|) (EQ (CAR |ISTMP#1|) 'COLON) (PROGN (SETQ |ISTMP#2| (CDR |ISTMP#1|)) - (AND (CONSP |ISTMP#2|) (EQ (CDR |ISTMP#2|) NIL) + (AND (CONSP |ISTMP#2|) (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |a| (CAR |ISTMP#2|)) T)))))) (SETQ |l1| (CDR |l|)) (COND (|l1| (LIST 'APPEND |a| (|bfMakeCons| |l1|))) (T |a|))) @@ -482,7 +482,7 @@ ((AND (CONSP |y|) (EQ (CAR |y|) 'COLON) (PROGN (SETQ |ISTMP#1| (CDR |y|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |a| (CAR |ISTMP#1|)) T)))) (|bf0APPEND| |a| |itl|)) ((AND (CONSP |y|) (EQ (CAR |y|) 'TUPLE)) @@ -710,7 +710,7 @@ ((AND (CONSP |lhs|) (EQ (CAR |lhs|) 'FLUID) (PROGN (SETQ |ISTMP#1| (CDR |lhs|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL)))) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|))))) (|bfLetForm| |lhs| |rhs|)) ((AND (IDENTP |rhs|) (NOT (|bfCONTAINED| |rhs| |lhs|))) (SETQ |rhs1| (|bfLET2| |lhs| |rhs|)) @@ -763,7 +763,7 @@ ((AND (CONSP |lhs|) (EQ (CAR |lhs|) 'FLUID) (PROGN (SETQ |ISTMP#1| (CDR |lhs|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL)))) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|))))) (|bfLetForm| |lhs| |rhs|)) ((AND (CONSP |lhs|) (EQ (CAR |lhs|) 'L%T) (PROGN @@ -772,7 +772,7 @@ (PROGN (SETQ |a| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) - (AND (CONSP |ISTMP#2|) (EQ (CDR |ISTMP#2|) NIL) + (AND (CONSP |ISTMP#2|) (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |b| (CAR |ISTMP#2|)) T)))))) (SETQ |a| (|bfLET2| |a| |rhs|)) (COND @@ -787,7 +787,7 @@ (PROGN (SETQ |var1| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) - (AND (CONSP |ISTMP#2|) (EQ (CDR |ISTMP#2|) NIL) + (AND (CONSP |ISTMP#2|) (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |var2| (CAR |ISTMP#2|)) T)))))) (COND ((OR (EQ |var1| 'DOT) @@ -819,7 +819,7 @@ (PROGN (SETQ |var1| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) - (AND (CONSP |ISTMP#2|) (EQ (CDR |ISTMP#2|) NIL) + (AND (CONSP |ISTMP#2|) (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |var2| (CAR |ISTMP#2|)) T)))))) (SETQ |patrev| (|bfISReverse| |var2| |var1|)) (SETQ |rev| (LIST 'REVERSE |rhs|)) @@ -843,7 +843,7 @@ (PROGN (SETQ |ISTMP#3| (CDR |ISTMP#2|)) (AND (CONSP |ISTMP#3|) - (EQ (CDR |ISTMP#3|) NIL) + (NULL (CDR |ISTMP#3|)) (PROGN (SETQ |val1| (CAR |ISTMP#3|)) T))))))) @@ -860,9 +860,9 @@ ((AND (CONSP |lhs|) (EQ (CAR |lhs|) 'EQUAL) (PROGN (SETQ |ISTMP#1| (CDR |lhs|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |var1| (CAR |ISTMP#1|)) T)))) - (LIST 'COND (LIST (LIST 'EQUAL |var1| |rhs|) |var1|))) + (LIST 'COND (LIST (|bfQ| |var1| |rhs|) |var1|))) (T (SETQ |isPred| (COND (|$inDefIS| (|bfIS1| |rhs| |lhs|)) @@ -947,7 +947,7 @@ ((AND (CONSP |rhs|) (EQ (CAR |rhs|) 'QUOTE) (PROGN (SETQ |ISTMP#1| (CDR |rhs|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |a| (CAR |ISTMP#1|)) T)))) (COND ((IDENTP |a|) (LIST 'EQ |lhs| |rhs|)) @@ -959,7 +959,7 @@ (PROGN (SETQ |c| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) - (AND (CONSP |ISTMP#2|) (EQ (CDR |ISTMP#2|) NIL) + (AND (CONSP |ISTMP#2|) (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |d| (CAR |ISTMP#2|)) T)))))) (SETQ |l| (|bfLET| |c| |lhs|)) (|bfAND| (LIST (|bfIS1| |lhs| |d|) @@ -967,7 +967,7 @@ ((AND (CONSP |rhs|) (EQ (CAR |rhs|) 'EQUAL) (PROGN (SETQ |ISTMP#1| (CDR |rhs|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |a| (CAR |ISTMP#1|)) T)))) (|bfQ| |lhs| |a|)) ((CONSP |lhs|) @@ -983,19 +983,19 @@ (PROGN (SETQ |a| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) - (AND (CONSP |ISTMP#2|) (EQ (CDR |ISTMP#2|) NIL) + (AND (CONSP |ISTMP#2|) (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |b| (CAR |ISTMP#2|)) T)))))) (COND ((EQ |a| 'DOT) (COND ((NULL |b|) (|bfAND| (LIST (LIST 'CONSP |lhs|) - (LIST 'EQ (LIST 'CDR |lhs|) 'NIL)))) + (LIST 'NULL (LIST 'CDR |lhs|))))) (T (|bfAND| (LIST (LIST 'CONSP |lhs|) (|bfIS1| (LIST 'CDR |lhs|) |b|)))))) ((NULL |b|) (|bfAND| (LIST (LIST 'CONSP |lhs|) - (LIST 'EQ (LIST 'CDR |lhs|) 'NIL) + (LIST 'NULL (LIST 'CDR |lhs|)) (|bfIS1| (LIST 'CAR |lhs|) |a|)))) ((EQ |b| 'DOT) (|bfAND| (LIST (LIST 'CONSP |lhs|) @@ -1011,7 +1011,7 @@ (SETQ |c| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) (AND (CONSP |ISTMP#2|) - (EQ (CDR |ISTMP#2|) NIL) + (NULL (CDR |ISTMP#2|)) (EQ (CAR |ISTMP#2|) 'T))))) (CONSP |b1|) (EQ (CAR |b1|) 'PROGN)) (SETQ |cls| (CDR |b1|)) @@ -1025,7 +1025,7 @@ (PROGN (SETQ |a| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) - (AND (CONSP |ISTMP#2|) (EQ (CDR |ISTMP#2|) NIL) + (AND (CONSP |ISTMP#2|) (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |b| (CAR |ISTMP#2|)) T)))))) (SETQ |patrev| (|bfISReverse| |b| |a|)) (SETQ |g| @@ -1084,13 +1084,13 @@ ((AND (CONSP |x|) (EQ (CAR |x|) 'NOT) (PROGN (SETQ |ISTMP#1| (CDR |x|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |a| (CAR |ISTMP#1|)) T)))) |a|) ((AND (CONSP |x|) (EQ (CAR |x|) 'NULL) (PROGN (SETQ |ISTMP#1| (CDR |x|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |a| (CAR |ISTMP#1|)) T)))) |a|) (T (LIST 'NOT |x|)))))) @@ -1339,13 +1339,13 @@ ((AND (CONSP |x|) (EQ (CAR |x|) '&REST) (PROGN (SETQ |ISTMP#1| (CDR |x|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |a| (CAR |ISTMP#1|)) T)))) (COND ((AND (CONSP |a|) (EQ (CAR |a|) 'QUOTE) (PROGN (SETQ |ISTMP#1| (CDR |a|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |b| (CAR |ISTMP#1|)) T)))) (LIST T 'QUOTE (LIST '&REST |b|) |body|)) (T (LIST NIL NIL |x| |body|)))) @@ -1371,7 +1371,7 @@ (PROGN (SETQ |l| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) - (AND (CONSP |ISTMP#2|) (EQ (CDR |ISTMP#2|) NIL) + (AND (CONSP |ISTMP#2|) (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |r| (CAR |ISTMP#2|)) T)))))) (LIST NIL NIL |l| (|bfMKPROGN| (LIST (|bfLET| |r| |l|) |body|)))) @@ -1379,7 +1379,7 @@ ((AND (CONSP |y|) (EQ (CAR |y|) 'BVQUOTE) (PROGN (SETQ |ISTMP#1| (CDR |y|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |b| (CAR |ISTMP#1|)) T)))) (LIST T 'QUOTE |b| |body|)) (T (SETQ |g| (|bfGenSymbol|)) @@ -1526,7 +1526,7 @@ (SETQ |l| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) (AND (CONSP |ISTMP#2|) - (EQ (CDR |ISTMP#2|) NIL) + (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |r| (CAR |ISTMP#2|)) T)))))) (RPLACA |x| 'SETQ) (|shoeCompTran1| |r|) (COND @@ -1729,7 +1729,7 @@ (SETQ |stmt| (CAR |ISTMP#4|)) (SETQ |ISTMP#5| (CDR |ISTMP#4|)) (AND (CONSP |ISTMP#5|) - (EQ (CDR |ISTMP#5|) NIL) + (NULL (CDR |ISTMP#5|)) (EQ (CAR |ISTMP#5|) 'T))))))) (PROGN (SETQ |conds| (CDR |ISTMP#2|)) T) (PROGN (SETQ |conds| (NREVERSE |conds|)) T)))) @@ -1753,7 +1753,7 @@ (PROGN (SETQ |ISTMP#1| (CDR |x|)) (AND (CONSP |ISTMP#1|) - (EQ (CDR |ISTMP#1|) NIL) + (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |ISTMP#2| (CAR |ISTMP#1|)) @@ -1764,7 +1764,7 @@ (SETQ |ISTMP#3| (CDR |ISTMP#2|)) (AND (CONSP |ISTMP#3|) - (EQ (CDR |ISTMP#3|) NIL) + (NULL (CDR |ISTMP#3|)) (PROGN (SETQ |ISTMP#4| (CAR |ISTMP#3|)) @@ -1776,9 +1776,8 @@ (CDR |ISTMP#4|)) (AND (CONSP |ISTMP#5|) - (EQ - (CDR |ISTMP#5|) - NIL) + (NULL + (CDR |ISTMP#5|)) (PROGN (SETQ |b| (CAR |ISTMP#5|)) @@ -1794,7 +1793,7 @@ (COND ((NULL |before|) (COND - ((AND (CONSP |l|) (EQ (CDR |l|) NIL)) + ((AND (CONSP |l|) (NULL (CDR |l|))) (SETQ |f| (CAR |l|)) (COND ((AND (CONSP |f|) (EQ (CAR |f|) 'PROGN)) @@ -1910,7 +1909,7 @@ (PROG (|a| |f|) (RETURN (COND - ((AND (CONSP |x|) (EQ (CDR |x|) NIL)) (SETQ |f| (CAR |x|)) + ((AND (CONSP |x|) (NULL (CDR |x|))) (SETQ |f| (CAR |x|)) (LIST 'DEFCONSTANT |f| (LIST 'LIST (LIST 'QUOTE |f|)))) (T (SETQ |a| (LET ((|bfVar#117| NIL) (|bfVar#116| (CDR |x|)) @@ -1959,7 +1958,7 @@ (PROGN (SETQ |i| (CAR |bfVar#118|)) (SETQ |ISTMP#1| (CDR |bfVar#118|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |j| (CAR |ISTMP#1|)) T))) (SETQ |bfVar#120| (CONS (|bfCI| |g| |i| |j|) |bfVar#120|))))) @@ -2352,7 +2351,7 @@ ((AND (CONSP |x|) (PROGN (SETQ |ISTMP#1| (CDR |x|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |ISTMP#2| (CAR |ISTMP#1|)) (AND (CONSP |ISTMP#2|) @@ -2360,7 +2359,7 @@ (PROGN (SETQ |ISTMP#3| (CDR |ISTMP#2|)) (AND (CONSP |ISTMP#3|) - (EQ (CDR |ISTMP#3|) NIL)))))))) + (NULL (CDR |ISTMP#3|))))))))) '|fixnum|) (T "object"))))) @@ -2779,7 +2778,7 @@ (SETQ |op'| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) (AND (CONSP |ISTMP#2|) - (EQ (CDR |ISTMP#2|) NIL) + (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |m| (CAR |ISTMP#2|)) T))))))) (|coreError| "invalid signature")) ((NOT (AND (CONSP |m|) (EQ (CAR |m|) '|%Mapping|) @@ -2790,7 +2789,7 @@ (SETQ |t| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) (AND (CONSP |ISTMP#2|) - (EQ (CDR |ISTMP#2|) NIL) + (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |s| (CAR |ISTMP#2|)) T))))))) (|coreError| "invalid function type")) (T (COND diff --git a/src/boot/strap/parser.clisp b/src/boot/strap/parser.clisp index 39316f4e..716b86d1 100644 --- a/src/boot/strap/parser.clisp +++ b/src/boot/strap/parser.clisp @@ -1150,7 +1150,7 @@ (SETQ |l| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) (AND (CONSP |ISTMP#2|) - (EQ (CDR |ISTMP#2|) NIL) + (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |r| (CAR |ISTMP#2|)) T))))) (IDENTP |l|)) (COND diff --git a/src/boot/strap/translator.clisp b/src/boot/strap/translator.clisp index bb464915..d7fb9f62 100644 --- a/src/boot/strap/translator.clisp +++ b/src/boot/strap/translator.clisp @@ -525,7 +525,7 @@ (PROGN (SETQ |valType| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) - (AND (CONSP |ISTMP#2|) (EQ (CDR |ISTMP#2|) NIL) + (AND (CONSP |ISTMP#2|) (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |argTypes| (CAR |ISTMP#2|)) T)))))) @@ -637,7 +637,7 @@ (SETQ |n| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) (AND (CONSP |ISTMP#2|) - (EQ (CDR |ISTMP#2|) NIL) + (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |t| (CAR |ISTMP#2|)) T)))))) @@ -660,7 +660,7 @@ (SETQ |n| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) (AND (CONSP |ISTMP#2|) - (EQ (CDR |ISTMP#2|) NIL) + (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |t| (CAR |ISTMP#2|)) T)))))) @@ -849,7 +849,7 @@ (PROGN (SETQ |ISTMP#2| (CDR |ISTMP#1|)) (AND (CONSP |ISTMP#2|) - (EQ (CDR |ISTMP#2|) NIL) + (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |ISTMP#3| (CAR |ISTMP#2|)) (AND (CONSP |ISTMP#3|) @@ -863,7 +863,7 @@ (SETQ |ISTMP#5| (CDR |ISTMP#4|)) (AND (CONSP |ISTMP#5|) - (EQ (CDR |ISTMP#5|) NIL) + (NULL (CDR |ISTMP#5|)) (PROGN (SETQ |exp| (CAR |ISTMP#5|)) @@ -877,7 +877,7 @@ (SETQ |id| (CAR |ISTMP#1|)) (SETQ |ISTMP#2| (CDR |ISTMP#1|)) (AND (CONSP |ISTMP#2|) - (EQ (CDR |ISTMP#2|) NIL) + (NULL (CDR |ISTMP#2|)) (PROGN (SETQ |exp| (CAR |ISTMP#2|)) T)))))) @@ -980,7 +980,7 @@ ((AND (CONSP |x|) (EQ (CAR |x|) '&REST) (PROGN (SETQ |ISTMP#1| (CDR |x|)) - (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL) + (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)) (PROGN (SETQ |y| (CAR |ISTMP#1|)) T)))) (LIST |y|)) (T (CONS (CAR |x|) (|unfluidlist| (CDR |x|)))))))) -- cgit v1.2.3