On Thu, 2009-05-28 at 06:20 +1000, Ramana Kumar wrote:
> I'm not sure about the "lots of distinct procedures" point. Because I
> would actually expect lambda* to be used quite a lot. I'm imagining
> someone essentially renames lambda* to lambda, and maybe there would
> also be a library (perhaps based on cut/cute) that re-exports (rnrs)
> procedures as curried versions. However since Ikarus expands
> everything to case-lambda anyway, maybe there are optimizations in
> place such that having long case-lambdas isn't as expensive as you
> think? I don't know - it does seem likely that you'll need to allocate
> all those tiny procedures... The number you also need to consider
> (along with the number of uses of lambda*) is how many arguments
> procedures usually have. It's usually << 10, so the number of lines
> never gets huge.
case-lambdas with many cases isn't what I was talking about. The issue
is the number of unique procedure expressions, in the final expansion,
which each result in a unique compiled procedure object-code occupying
memory (and maybe a serialized pre-compiled file).
Do:
(expand '(lambda* (a b c d e f) "return-value")
(interaction-environment)) ;; or wherever your lambda* is
:)
There are a ton of created procedures. I counted 96.
(lambda* (a b c) "return-value") results in 12. This is happening
because you have many recursive expansions of lambda* which each have
their own recursive expansions and so on.
Compared to:
(expand '(lambda/curry (a b c d e f) "return-value")
(environment '(xitomatl curry)))
Which results in only one procedure expression.
--
: Derick
----------------------------------------------------------------