Recursive queries can be used to solve a variety of problems that require multiple passes, not just recursive data structures. Here is an implementation of the Mandelbrot set as ASCII art.
xaxis := {{ x:=-2.0 }} recurse( {{ x:=x+0.05 }} [?(x<1.2)] ) yaxis := {{ y:=-1.0 }} recurse( {{ y:=y+0.1 }} [?(y<1.1)] ) m := ({{ iter:=0, x:=0, y:=0 }} join xaxis[{ cx:=x }] join yaxis[{ cy:=y }]) recurse( {{ iter:=iter+1, x := x*x-y*y+cx, y:=2*x*y+cy, cx, cy, }} [?(x*x+y*y<4.0 and iter<28)] ) m.count m2 := m[{ iter := fold(max,iter), cx, cy }] [$(cy,cx)] m2.count a := m2 [ { cy, t := fold(&, right(left(' .+*#', 1 + iter div 6), 1)) }] a
This query iterates each point up to 28 times to find those that lie on the border of the Mandelbrot set. Each point that is still within range is iterated until no more can be found. The number of iterations selects which character to display.
Here is the result.
cy | t -------------------------------------------------------------- -1.0 | ....# -0.9 | ..#*.. -0.8 | ..+####+. -0.7 | .......+####+... + -0.6 | ..##+###########*.++++ -0.5 | .+.##################*. -0.4 | .............*###################+.* -0.3 | ..+*.+#+....*#####################+. -0.2 | ...+#######++#######################. -0.1 | ...++*################################. 0.0 | #############################################... 0.1 | ...++*################################. 0.2 | ...+#######++#######################. 0.3 | ..+*.+#+....*#####################+. 0.4 | .............*###################+.* 0.5 | .+.##################*. 0.6 | ..##+###########*.++++ 0.7 | .......+####+... + 0.8 | ..+####+. 0.9 | ..#*.. 1.0 | ....#