/ cache common sub-expressions \d z leaves:{[t]:[@t;,();,/(!#t),/:'_f't[]]} nodes:{[p]{x@>#:'x}@?,/{(-1_1+!#x)#\:x}'p} paths:nodes leaves@ cache:{[t]:[~#t;(t;t);~#p:paths t;(t;());dup[t]p]} dup:{[t;p] j:&(0>4::'d i[;0])|1<#:'i:=d:t ./:p |{sub[;;y]. x}/[(();t);p i j]} sub:{[z;t;p]:[(~{`cons}~*1_ d)&{}~*d:t .*p;rep[z;t;p]d;(z;t)]} rep:{[z;t;p;d] q:({};{`get};-1+#z,:,d) t:{.[x;y;:;q]}/[t;p] (z;t)} \d ^ Cache:z.cache