0::/drawText(text:"input:",size:20,color:0x3333ff,x:0,y:20,pos:'ue hidari')
0::/in = drawText(text:"",size:20,color:0xff3333,x:70,y:20,pos:'ue hidari')
0::/drawText(text:"output:",size:20,color:0x3333ff,x:0,y:45,pos:'ue hidari')
0::/out = drawText(text:"",size:20,color:0xff3333,x:70,y:45,pos:'ue hidari')
0::/lpar="(";rpar=")"
0::/tcons=0;tsym=1;tnum=2;tsubr=3;tfsubr=4;texpr=5;nil=[0,0]
1::/ret=0;free=0;genv=0
1::/def(safe_num(o),(o[0]==tnum).alt(o[1],0))
1::/fquote=[];fquote.def(call(e,a),car(e))
1::/flambda=[];flambda.def(call(e,a),[texpr,e])
1::/fdefun=[];fdefun.def(call(e,a),genv=[[car(e)[1],flambda.call(cdr(e),a)],genv];car(e))
1::/fprogn=[];fprogn.def(call(e,a),r:=nil;while_kari(e!=nil,r=eval(car(e),a);e=cdr(e));r)
1::/fif=[];fif.def(call(e,a),v:=eval(car(e),a);e=cdr(e);(v==nil).alt(e=cdr(e));eval(car(e),a))
1::/scar=[];scar.def(call(ea),car(car(ea)))
1::/scdr=[];scdr.def(call(ea),cdr(car(ea)))
1::/scons=[];scons.def(call(ea),c:=cons;scar(c,car(ea));scdr(c,car(cdr(ea)));c)
1::/seq=[];seq.def(call(ea),(car(ea)==car(cdr(ea))).alt([tsym,"t"],nil))
1::/satom=[];satom.def(call(ea),(car(ea)[0]!=tcons).alt([tsym,"t"],nil))
1::/sadd=[];sadd.def(call(ea),r:=0;n:=0;while_kari(ea!=nil,n=car(ea);(n[0]==tnum).alt(r+=n[1]);ea=cdr(ea));[tnum,r])
1::/ssub=[];ssub.def(call(ea),n1:=car(ea);n1=safe_num(n1);n2:=cdr(ea);n2=car(n2);n2=safe_num(n2);[tnum,n1-n2])
1::/smul=[];smul.def(call(ea),r:=1;n:=0;while_kari(ea!=nil,n=car(ea);(n[0]==tnum).alt(r*=n[1]);ea=cdr(ea));[tnum,r])
1::/sneq=[];sneq.def(call(ea),n1:=car(ea);n1=safe_num(n1);n2:=cdr(ea);n2=car(n2);n2=safe_num(n2);(n1==n2).alt([tsym,"t"],nil))
1::/snlt=[];snlt.def(call(ea),n1:=car(ea);n1=safe_num(n1);n2:=cdr(ea);n2=car(n2);n2=safe_num(n2);(n1<n2).alt([tsym,"t"],nil))
1::/sngt=[];sngt.def(call(ea),n1:=car(ea);n1=safe_num(n1);n2:=cdr(ea);n2=car(n2);n2=safe_num(n2);(n1>n2).alt([tsym,"t"],nil))
1::/snle=[];snle.def(call(ea),n1:=car(ea);n1=safe_num(n1);n2:=cdr(ea);n2=car(n2);n2=safe_num(n2);(n1<=n2).alt([tsym,"t"],nil))
1::/snge=[];snge.def(call(ea),n1:=car(ea);n1=safe_num(n1);n2:=cdr(ea);n2=car(n2);n2=safe_num(n2);(n1>=n2).alt([tsym,"t"],nil))
1::/seval=[];seval.def(call(ea),eval(car(ea),genv))
1::/genv=[["quote",[tfsubr,fquote]],[["lambda",[tfsubr,flambda]],[["defun",[tfsubr,fdefun]],[["progn",[tfsubr,fprogn]],[["if",[tfsubr,fif]],genv]]]]]
1::/genv=[["car",[tsubr,scar]],[["cdr",[tsubr,scdr]],[["cons",[tsubr,scons]],[["eq",[tsubr,seq]],[["atom",[tsubr,satom]],genv]]]]]
1::/genv=[["+",[tsubr,sadd]],[["-",[tsubr,ssub]],[["*",[tsubr,smul]],[["eval",[tsubr,seval]],genv]]]]
1::/genv=[["=",[tsubr,sneq]],[["<",[tsubr,snlt]],[[">",[tsubr,sngt]],[["<=",[tsubr,snle]],[[">=",[tsubr,snge]],genv]]]]]
2::/def(cons(),r:=[tcons,[free]];free++;r)
2::/def(car(c),(c==nil).alt(nil,c[1].car))
2::/def(cdr(c),(c==nil).alt(nil,c[1].cdr))
2::/def(scar(c,v),c[1].car=v)
2::/def(scdr(c,v),c[1].cdr=v)
2::/def(is_number(c),(c=="0"||c=="1"||c=="2"||c=="3"||c=="4"||c=="5"||c=="6"||c=="7"||c=="8"||c=="9"))
2::/def(is_sep(c),(c==" "||c==lpar||c==rpar||c=="'"))
2::/def(is_alpha(c),(!is_number(c)&&!is_sep(c)))
2::/def(skip(m,i,e),while_kari(i<e&&m[i]==" ",i++);i)
2::/def(head(m,i,e),(m[i]=="'").alt(parse_quote(m,i+1,e),(m[i]==lpar).alt(parse_par(m,i+1,e),(m[i]==rpar).alt(nil,false))))
2::/def(parse(m,i,e),i:=skip(m,i,e);(i<e).alt(h:=head(m,i,e);h.alt(h,parse1(m,i,e))))
2::/def(parse1(m,i,e),s:=i;t:=tnum;while_kari(i<e&&!is_sep(m[i]),is_alpha(m[i]).alt(t=tsym);i++);ret=m.slice(s,i-s);(t==tnum).alt(ret=ret.toInteger);ret=[t,ret];i)
2::/def(parse_quote(m,i,e),c1:=cons;c2:=cons;scar(c1,[tsym,"quote"]);scdr(c1,c2);i=parse(m,i,e);scar(c2,ret);scdr(c2,nil);ret=c1;i)
2::/def(parse_par(m,i,e),r:=cons;c:=r;n:=0;while_kari(i<e&&m[i]!=rpar,n=cons;i=parse(m,i,e);scar(n,ret);scdr(c,n);c=n;);scdr(c,nil);ret=cdr(r);i+1)
3::/def(print(o),(o[0]==tnum||o[0]==tsym).alt(o[1],(o==nil).alt("()",(o[0]==tcons).alt(print_list(o),o[1]))))
3::/def(print_list(o),r:="";s:=lpar;while_kari(o[0]==tcons&&o!=nil,r+=s;r+=print(car(o));o=cdr(o);s=" ");(o[0]!=tcons).alt(r+=" . ";r+=print(o));r+=rpar;r)
4::/def(eval(e,a),(e==nil||e[0]==tnum).alt(e,(e[0]==tsym).alt(find(e[1],a),apply(e,a))))
4::/def(find(s,a),r:=0;while_kari(a!=0&&r==0,(s==a[0][0]).alt(r=a[0][1],a=a[1]));(r==0).alt(nil,r))
4::/def(apply(e,a),fn:=eval(car(e),a);arg:=cdr(e);v:=emb(fn,arg,a);v.alt(v,ea:=evlis(arg,a);expr(fn,ea,a)))
4::/def(emb(fn,arg,a),(fn[0]==tfsubr).alt(fn[1].call(arg,a),(fn[0]==tsubr).alt(ea:=evlis(arg,a);fn[1].call(ea),false)))
4::/def(evlis(arg,a),r:=cons;c:=r;n:=0;while_kari(arg!=nil,n=cons;scar(n,eval(car(arg),a));scdr(c,n);c=n;arg=cdr(arg));scdr(c,nil);cdr(r))
4::/def(expr(fn,ea,a),(fn[0]==texpr).alt(al:=car(fn[1]);bd:=cdr(fn[1]);env=create_env(al,ea,a);fprogn.call(bd,env)),nil)
4::/def(create_env(al,ea,ev),while_kari(al!=nil,ev=[[car(al)[1],car(ea)],ev];al=cdr(al);ea=cdr(ea));ev)
5::/ctrig(chat.isYourPost.alt(m=chat.message;(m[0]!=";").alt(in.text=m;parse(m,0,m.size);out.text=print(eval(ret,genv)))))
10::%(+ 1 2 3
10::%(* 1 2 (+ 4 2 3))
10::%(defun a (b) (if (!= b 0) (a (- b 1))) )
10::%(+ 1 2)
10::%1
10::%9
10::%(+ 3 9(
10::%(car (quote 1 2))
10::%(defun fact (n) (if (= n 0) 1 (* n (fact (- n 1)))))
10::%(cdddr '(1 2 3 4 5 6))
10::%(car (list 1 2))
10::%(+ 1 1)
10::%(+ 1 2)
10::%(defun (fact n) (if (= n 1) 1 (* n (fact (- n 1)))))
10::%(fact 10)
10::%(+ 123 123)
10::%(a 10)

