On Tue, Jul 02, 2002 at 02:07:19AM +0200, Karim BELABAS wrote:
> 1) make_arg(): parameters with default values are evaluated when the function
> is called [ was: when the function is defined (long time ago), see COMPAT-2.2 ]
>
> Hence default values are really formal expressions [character strings], which
> are evaluated to bona fide GENs by make_arg().
>
> [ btw, make_arg() was unnecessarily complicated, I simplified it ]
*This* probably was the reason for my surprise: that make_arg() would
sometimes evaluate args, sometimes not.
> 2) copy: clone the value
> push: store the address of the value
>
> Values of arguments are cloned, values of local variables are pushed (the
> initial value is assumed not to vary while we evaluate the function).
*Why* are they assumed to be constant? [But see below...]
> The patch fixes all the bug mentioned above. I'm not 100% sure it fixes all
> instances of the problem.
I assume that the parameters are not push()ed any more?
> It's been in my personal TODO list for a long time to check whether a
> function definition like
>
> f(&x, y) = ...
>
> would break anything. Here, x is a reference, y is a value. Modifying x in
> the function body would modify x in the calling frame. Modifying y would
> modify a copy (current behaviour).
This interface is *exactly* why I started all this investigation (but
my idea was to encode it as
f('x, y) = ...
;-)
> Not sure about the calling, syntax. Maybe f(x,y), or f(&x, y) to emphasize
> we're passing a reference.
There is no such emphasis for forprime(X...), thus there should be
none for the user defined functions. The *real* (as opposed to
efficiency problems ;-) need to have such f's is to allow user
functions which have the same syntax as forprime(), ploth() etc.
E.g., one could duplicate forprime() as
my_forprime('x==a, b, f()) = x=nextprime(a); while(x<=b, f(); x=nextprime(x))
(not checked). There are 3 enhancements needed: allowing '=' to
separate variables (very optional, denoted by '==' in the prototype),
aliasing (as you propose, denoted by 'x), and a "sexpr" argument
autoconverted to a 'local' function f().
Ilya