Bill Allombert on Thu, 22 Jan 2015 20:25:55 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Undocumented prototype code "C" in eval()


On Wed, Jan 21, 2015 at 08:29:44PM +0100, Bill Allombert wrote:
> On Tue, Jan 20, 2015 at 02:41:10PM +0100, Jeroen Demeyer wrote:
> > The function eval() has a code C in the prototype which is not documented:
> > 
> > Function: eval
> > Section: polynomials
> > C-Name: geval_gp
> > Prototype: GC
> 
> Indeed, it is a private code for the GP compiler.
> This allows the code run through eval() to reference lexical variables
> declared with my() by the caller.
> This is the magic used so that
> my(z=2);eval("z^2")
> works. 
> 
> The parameter C is a "pack", a data structure describing the list of 
> lexical variables. This is used to preseed the GP compiler before 
> compiling "z^2" so that z is known.

We have improved the documentation in rev 8fcea79e
It now reads

\subsec{Functions related to the GP evaluator}

The prototype code \kbd{C} instructs the GP compiler to save the current
lexical context (pairs made of a lexical variable name and its value)
in a \kbd{GEN}, called \kbd{pack} in the sequel. This \kbd{pack} can be used
to evaluate expressions in the corresponding lexical context, providing it is
current.

\fun{GEN}{localvars_read_str}{const char *s, GEN pack} evaluate the string $s$
in the lexical context given by \kbd{pack}.  Used by \tet{geval_gp} in GP
to implement the behaviour below:
\bprog
? my(z=3);eval("z=z^2");z
%1 = 9
@eprog

Thanks for reporting this issue!
Cheers,
Bill