[racket] A little improvement

From: Harry Spier (vasishtha.spier at gmail.com)
Date: Sat Jun 16 21:57:15 EDT 2012

Matthias Felleisen <matthias at ...> writes:
. 
> 
> If this is about sequencing a bunch of functional manipulations, try this: 
> 
> #lang racket
> 
> ;; this would be in a library
> 
> (define-syntax let**
>   (syntax-rules ()
>     [(_ tmp body) body]
>     [(_ tmp a b ... body) (let ([tmp a]) (let** tmp b ... body))]))
> 
> ;; -----------------------------------------------------------------------------
> 
> (define (fix str)
>   (let** tmp str
>          (regexp-replace* " / " tmp "_")
>          (regexp-replace* " " tmp "_")
>          (regexp-replace* "%" tmp "")
>          (regexp-replace* "-" tmp "_")
>          (string-upcase tmp)))
> 
> (fix "this/is%a-test right?")
> 
> I have found this useful and readable in circumstances where the above is a sequence of say image
> manipulations where even a for/fold isn't quite right. 
> 

Using this macro that Matthias shared I made a nice little "tuning tool".  

I added the macro form let**   to a library and then created a "companion macro" let-debug** which was similar but which printed out the manipulating procedure name.and wrapped the manipulating procedure with the "time" function   I.e.

(define-syntax let-debug**
  (syntax-rules ()
    [(_ tmp body) (begin (displayln 'body) (time body))]
    [(_ tmp a b ... body) (let ([tmp (begin (displayln 'a) (time a))]) (let-debug** tmp b ... body))]))



So I write something like:

(let-debug** data image-data
      (image->transformation1 data)
      (transformation1->transformation2  data)
      (transformation2->transformation3 data)
      etc. etc.)

This then prints out each procedure name and the cpu, garbage collection and actual time it uses.  I can then see any inefficiencies and once I've fixed these, instead of having to take out a bunch of "display" and "time" functions I just have to change one word in my code "  let-debug** " back to "  let**   " to stop printing the debugging information and be back in production code.

Harry Spier

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20120616/37e5d5b8/attachment.html>

Posted on the users mailing list.