I was looking at <a
href="http://nifty.stanford.edu/2009/stone-random-art/">this Nifty
Assignment</a>, which of course lends itself very nicely to my
picturing-programs teachpack.
The random-expression generator to produce random trees over the algebra
EXPR = x |
y |
(sinpi EXPR) |
(cospi EXPR) |
(* EXPR EXPR) |
(avg EXPR EXPR)
is an easy student exercise. (Note that each of these functions maps [-1,1] to
[-1,1], so composing them at random makes sense.)
If I copy-and-paste the random expressions thus generated into the body of a
function definition, I (or my students) can produce cool graphics like the ones
at the Nifty Assignment web page, reasonably efficiently (e.g. a 300x300 pixel
image, each pixel of which requires 26 trig functions, in 1.5 seconds). But
that requires manual intervention to copy-and-paste the expressions into a
definition and then re-"Run".
Or I can take the random expression as a parameter and "eval" it (or more
precisely, insert it into a backquoted expression to bind "x" and "y", and
"eval" that). Much more elegant, not to mention scriptable, than doing the
copy-and-paste... but it takes c. 200 times longer to run, presumably because
the expression is being rebuilt and re-parsed for each pixel.
(define (eval-with-x-y x y fmla)
(eval `(let ((x ,x) (y ,y)) ,fmla)
eval-ns))
Is there a way I can get the best of both worlds? I'd like to take an
arbitrary s-expression (containing the free variables "x" and "y" as well as a
limited set of function names) and "compile" it into a function of x and y that
can be called efficiently on each of tens of thousands of pixels.
Assuming the answer is "yes" (this IS Racket, after all :-)), the next
challenge is to package it so it's accessible from student programs in *SL.
Stephen Bloch
[email protected]
_________________________________________________
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/users