Put the call to eval outside and add the wrapper `(lambda (x y)
,code-with-x-and-y-free). Then just call that function each time,
instead of calling eval each time.

Robby

On Tue, Jun 7, 2011 at 7:19 AM, Stephen Bloch <sbl...@adelphi.edu> wrote:
> 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
> sbl...@adelphi.edu
>
>
> _________________________________________________
>  For list-related administrative tasks:
>  http://lists.racket-lang.org/listinfo/users
>

_________________________________________________
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/users

Reply via email to