/ words W:((0#`;_hash 0#`);()) w:{:[(#*w)>i:(w:*W)?x;W[1;i]:y;W::({(x;_hash x)}w[0],x;W[1],,y)];} v:{if[(#*w)>i:(w:*W)?x;W[1]:W[1]_di i;W[0;0]:w[0]_di i;W[0;1]:_hash*w]} u:{:[~#x:p x;;1=#x;v@*x;w[*x]e l 1_ x]} / combinators (w').+((`I;{[x]x}) (`K;{[x;y]x}) (`S;{[x;y;z]a[x][z][a[y][z]]}) (`B;{[x;y;z]a[x][a[y][z]]}) (`C;{[x;y;z]a[x][z][y]}) (`D;{[x;y;z;w]a[x][a[y][w]][a[z][w]]}) (`E;{[x;y;z;w]a[x][a[y][w]][z]}) (`F;{[x;y;z;w]a[x][a[y][a[z][w]]]}) (`W;{[x;y]a[x][y][y]}) (`T;{[x;y]a[y][x]})); / k {w[`$x;{x[k/y][k/z]}[. x]] w[`$x,":";{x[k/y]}[. x,":"]] w[`$x,".";{x[k/z][k/y]}[. x]]}'K:"~!@#$%^&*-_=+|<,>?;.:"; k:{:[7=4:x;x[];x]} / conditional w[`if]{:[x;y;z]} / parse E_:`$E:"\\" A_:`$A:"/" p:{ p:{ b:" \t\r\n";q:"\"";l:"[";r:"]";c:"'";d:".";t:":";m:"-" / punctuation a:_ci,/97 65+\:!26 / alpha n:"0123456789" / numeric Q:{(1(0 0 0;1 2 3;1 1 1;0 0 0)\(x=E)+2*x=q)?3} / find string N:{(t=x i)+i:&/x?/:b,q,E,A,l,r,c,t,K,a} / find number :[~#z ;(x;y;z) / done ";;"~2#z ;(x;y;(z?*-1#b)_ z) / comment (*z)_in b ;(x;y;1_ z) / blank E=*z ;(.[x;y;,;(`$i#z),E_];y;(i:(z _lin a,n)?0)_ z:1_ z) / abstraction A=*z ;(.[x;y;,;A_];y;1_ z) / application l=*z ;(.[x;y;,;,()];y,#x . y;1_ z) / begin list r=*z ;(.[x;-1_ y;,;()];-1_ y;1_ z) / end list c=*z ;:[E=*1_ z;(.[x;y;,;.q,z[1 2],q];y;3_ z);(.[x;y;,;z 1];y;2_ z)] / character q=*z ;(.[x;y;,;,"",. i#z];y;(i:1+Q 1_ z)_ z) / string (*z)_in n ;(.[x;y;,;.{_ssr[(-t=*-1#x)!x;t;m]}i#z];y;(i:N z)_ z) / number (*z)_in K ;(.[x;y;,;`$i#z];y;(i:1+z[1]_in d,t)_ z) / operator (*z)_in a ;(.[x;y;,;`$i#z];y;(i:(z _lin a,n)?0)_ z) / name '"syntax"]} / oops *(p .)/(();!0;x," ")} / represent r:{ r:{:[(t:4:x)_in 1 2 ;:[x<0;(1_5:x),":";5:x] / number t=-3 ;(","=*t)_ t:5:x / string t=7 ;"\004" / function t<1 ;1!"][",1_,/" ",'_f'x / list t=5 ;(1!"][",,/_f[1]'. x)," .:" / dictionary t=3 ;"'",1_-1_5:x / character $x]} / symbol r x} / eliminate abstractions l:{|*(m .)/(();|x)} m:{:[~#y;(x;y);E_~*y;(|n[y 1;|x];2_ y);(x,,*y;1_ y)]} n:{,/(o[x].)/(();y)} o:{(:[~#z;y;A_~*z;y,A_,A_,`S;x~*z;y,`I;y,A_,`K,,*z];1_ z)} / list <-> tree, parts t:{:[A_~*x;_f's 1_ x;1=#x;*x;x]} s:{(0,1+(+\-1 1 x~\:A_)?-1)_ x} t_:{:[(-4=4:x)|@x;x;4:x;,x;A_,,/_f'x]} t_:{:[@x;x;(4:x)_in 0 -4;A_,,/_f'x;,x]} / optimization forms O:(t`$')''+(("//SKK" ;,"I") ("//S/KxI" ;,"x") ("//SI/Kx" ;"/Tx") ("//SxI" ;"/Wx") ("//S/Kx/Ky" ;"/K/xy") ("//S/Kx//Byz" ;"///Dxyz") ("//S/Kxy" ;"//Bxy") ("//S//Bxy/Kz" ;"///Exyz") ("//Sx/Ky" ;"//Cxy") ("//S//Bxyz" ;"///Fxyz")) / optimize e:{j't_@{{f[y;z;x]}/[x;*O;O 1]}/t x} f:{:[(@z)|~(4:z)_in 0 -4;z;_n~d:g[.();x;z:_f[x;y]'z];z;h[d;y]]} g:{:[_n~x;x;~@y;:[~@z;_f/[x;y;z]];y _in`x`y`z;@[x;y;:;z];@y;:[y~z;x]]} h:{:[4:y;{:[1=#x;*x;x]}@i/[y,();!x;x[]];_f[x]'y]} i:{@[x;&x~\:y;:[;z]]} j:{:[(A_~x)|~4:x;x;(#**W)=i:W[0]?x;x;(~@f)|7=4:f:W[1;i];f;_f x]} / apply a:{**|(b .)/(();x,())} b:{d[x;y];:[(1=#y)&~#x;(x;y);A_ _in(-1#x),1#y;(x,1#y;1_ y);c[-1_ x;y;*-1#x]]} c:{[x;y;z]:[7=4:z;(-1_ x;@[y;0;{x[y]}[z]]);(x;z,y)]} d:{`0:,/(40$-1_1_ r x)," : ",-40$-1_1_ r y;0:`} q:a e l p@ / u"plus\\x\\y//+x y" / u"times\\x\\y//*x y" / u"f3\\x\\y\\z//times//plus x y z" / q"///\\x\\y\\z//*//+x y z 10 20 30 / q"///f3 10 20 30" u"inc\\x//+x 1" u"inc2\\x/inc/inc x" q"/inc2 5" / q"//\\x\\y//+x y[2 3][4 5]" / q"///\\x\\y\\z//*//+x y z 10 20 30" / u"foo\\x///if x //+1 x //+100 x" / q"/foo 7" / u p"foo\\x/foo//-x 1" / q"/foo 2" / u"foo\\x/foo//-x 1" / q"/foo 2" / u"foo\\x///if x/foo//-x 1 0" / q"/foo 3" / apply a:{d[x;y];:[(1=#y)&~#x;(x;y);A_ _in(-1#x),1#y;(x,1#y;1_ y);b[-2_ x;1_ y;*-1#x;*y]]} b:{[x;y;X;Y]:[~7=4:f:c X;(x;f,(,Y),y);(4:g:c Y)_in 0 -4;(x,f;g,y);(x;(,f[g]),y)]} c:{:[4=4:x;_f W[1;W[0]?x];x]} d:{`0:,/(40$-1_1_ r x)," : ",-40$-1_1_ r y;0:`} / u p "foo\\x/foo//-x 1" / **(a .)/(();e l p"/foo 3") / u p"fac\\x///if x//*x/fac//-x 1 1" / **|(a .)/(();e l p"//\\x\\y//+x y[2 3][4 5]") / **|(a .)/(();e l p"///\\x\\y\\z//*//+x y z 10 20 30") / u p"foo\\x///if x//+2x//+100 x" / **|(a .)/(();e l p"/foo 3") / u p"neg\\x/-:x" / u p"foo\\x///if x /-://-x 1 0" / **|(a .)/(();e l p"/foo 3") / **|(a .)/(();e l p"/neg 3") / **|(a .)/(();e l p"//\\x\\y//+x y 2 3") \ / interpret .m.p:" " / prompt .m.r:{ / respond if[x~," ";.m[`r`p]:_n;:_n] / exit to k if[(#x)&&/x=" ";_exit 0] / exit :[";"=*x;u 1_ x;`0:,r q x]} / define or interpret \ //\x\y//+x y[1 2][3 4] ;foo\x///if x//+2x//+100 x ;foo\x///if x//+2 x 100 /foo 0 100 /foo 3 5 ;fac\x///if x//*x/fac//-x 1 1 ;neg\x/-:x ;hoo\x///if x /neg//-x 1 0 ;goo\x///if x /\y/-:y//-x 1 0