[racket] A little improvement
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>