// combinators I:{[x] x } K:{[x;y] x } S:{[x;y;z] x[z][y[z]] } B:{[x;y;z] x[y[z]] } C:{[x;y;z] x[z][y] } D:{[x;y;z;w] x[y[w]][z[w]] } E:{[x;y;z;w] x[y[w]][z] } F:{[x;y;z;w] x[y[z[w]]] } W:{[x;y] x[y][y] } T:{[x;y] y[x] } // K k:{:[7=4:x;x[];x]} k1:{x[k/y]} k2:{x[k/y][k/z]} Z:+,/{((x;k2[. x]);(x,":";k1[. x,":"]))}'"~!@#$%^&*_-+=|<,>?.:" Z[0]:(*Z;_hash*Z) // parse pp:{ p:{ b:" \t\r\n";q:"\"";e:"\\";l:"[";r:"]";c:"'";d:".";t:":";m:"-" / punctuation a:_ci,/97 65+\:!26 o:"~!@#$%^&*-_=+|<,>?;`()/\\{}" / operators n:"0123456789" / numbers Q:{(1(0 0 0;1 2 3;1 1 1;0 0 0)\(x="\\")+2*x="\"")?3} / find string N:{(t=x i)+i:&/x?/:b,q,e,l,r,c,t,o,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 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 o ;(.[x;y;,;`$i#z];y;(i:1+&/(1_ z)?/:b,q,e,l,r,c,o,a,n)_ z) / operator (*z)_in a ;(.[x;y;,;`$i#z];y;(i:(z _lin a,n,d,t)?0)_ z) / name '"syntax"]} / oops *(p .)/(();!0;x," ")} p:{:["`"=x;;(#**Z)>i:Z[0]?x;Z[1;i];. x]}' // apply/interpret a:{:[~#z;(y;z);_n _in(-1#y),1#z;(y,1#z;1_ z);(-2_ y;x[*-1#y;*z],1_ z)]} i:**(a[{x[y]}].)/(,()),,p@ // abstraction elimination l:{|*(m .)/(();|x)} m:{:[~#y;(x;y);"/"=*|2#y;(|n[*y;|x];2_ y);(x,*y;1_ y)]} n:{,/(o[x].)/(();y)} o:{(:[~#z;y;"`"~*z;y,"``S";x~*z;y,"I";y,"`K",*z];1_ z)} // combinator reduction / string <-> tree t:{:["`"=*x;_f'(0,1+(+\-1 1 x="`")?-1)_ x:1_ x;1=#x;*x;x]} s:{:[@x;x;"`",,/_f'x]} / optimization forms q:t''+(("``SKK" ;,"I") ("``S`KxI" ;,"x") ("``SI`Kx" ;"`Tx") ("``S`Kx`Ky" ;"`K`xy") ("``S`Kx``Byz" ;"```Dxyz") ("``S`Kxy" ;"``Bxy") ("``S``Bxy`Kz" ;"```Exyz") ("``Sx`Ky" ;"``Cxy") ("``S``Bxyz" ;"```Fxyz") ("``SxI" ;"`Wx")) / optimizer v:_ci 97+!26 d:{s@{{e[y;z;x]}/[x;*q;q 1]}/t x} e:{:[@z;z;_n~d:f[.();x;z:_f[x;y]'z];z;g[d;y]]} f:{:[_n~x;x;~@y;:[~@z;_f/[x;y;z]];y _in v;@[x;`$y;:;z];@y;:[y~z;x]]} g:{:[4:y;{:[1=#x;*x;x]}@h/[y,"";,/$!x;x[]];_f[x]'y]} h:{@[x;&x~\:y;:[;z]]} / eg i[d l"``/x/y``+xy23"] i[d l"/x/y``-xy"][2][3] i[d l"/x/y/z``+z``-xy"][2][3][4] i[d l"/x/y/z``xyz"][+][2][3] \ Ix x Kxy x Sxyz ``xz`yz Bxyz `x`yz Cxyz ``xyz Dxyzw ``x`yw`zw Exyzw ``x`ywz Fxyzw `x`y`zw Yx `x`Yx Wfx ``fxx Txf `fx