On Thu, 2011-07-14 at 08:53 -0400, Stephen Bloch wrote:
> On Jul 14, 2011, at 7:56 AM, Maurizio Giordano wrote:
>
> > About optimization... in my case the main optimization is:
> > 1) My macro has to generate a function which has to perform some
> > recursive tasks
> > (for example, it has to do a recursive pattern matching on a set of
> > elements)
> > 2) Instead of generating a recursive function, I generate one very long
> > piece of code that expand (I say "inline") all the (potential) recursion
> > point.
>
> And how is that an optimization? What are you gaining by making the code
> much longer? If your function was "tail-recursive" (i.e. the result of the
> recursive call is returned as the result of the calling function, without any
> further processing), Scheme will already optimize it to take constant stack
> space (effectively replacing the recursive call, at the machine level, with
> some assignments and a "goto"). If it wasn't, it's very difficult to see how
> to inline it -- as I presume you've already discovered.
>
>
It is not tail recursive... as I reported in a past email, my macro
looks like this:
(define-syntax-rule replace
...
(eval `(lambda (x)
... static part ...
,(expander ...) ; this inject a part of the lambda
code
...static part ...)))
(define (expander ...)
`(let ((...))
... static part ...
(for (...)
...
,(expander ...) ; injection once again
... static part ...)
... static part ...))
I am wondering if it can be easily transformed in tail-recursive ...
maybe!
You may tell me this is not appropriate to the scheme programming
syle... you are right. I choose this way since my objective is to
write a sort of macroexpander (a cross-compiler) from my source language
(gamma-calculus) to scheme.
At this cross-compiler development stage, by producing all the code in
one-shoot, for me it is easier to analyze it and find out several
(other) optimizations.
Maybe you do not agree...
Cheers,
Maurizio.
> Stephen Bloch
> [email protected]
>
_________________________________________________
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/users