Re: [Rd] PROTECT and OCaml GC.

From: Guillaume Yziquel <guillaume.yziquel_at_citycable.ch>
Date: Mon, 30 Nov 2009 22:07:13 +0100

Simon Urbanek a écrit :

>>
>> And it goes then to my other question: How can you pass to eval a 
>> LANGSXP where the CAR is an *anonymous* function, no SYMSXP involved?

>
> You just pass it as value of the call. I suspect the reason it doesn't
> work is in your code, not in the facility (note that the link above is
> useless since the construction is mystery - if you were constructing it
> right, it would work ;)).
>
> Small example:
>
> SEXP myEval(SEXP FN, SEXP first_arg) {
> return eval(LCONS(FN, CONS(first_arg, R_NilValue)), R_GlobalEnv);
> }
>
> > .Call("myEval",function(x) x + 1, 10)
> [1] 11

In the eval function in eval.c, you have:

> case LANGSXP:
> if (TYPEOF(CAR(e)) == SYMSXP)
> /* This will throw an error if the function is not found */
> PROTECT(op = findFun(CAR(e), rho));
> else
> PROTECT(op = eval(CAR(e), rho));

So imagine you have a LANGSXP whose CAR is a CLOSXP, the execution goes into the last line of the code snippet above. And re-entring eval with a CLOSXP, the code goes into

> tmp = R_NilValue; /* -Wall */
> #ifdef Win32
> /* This is an inlined version of Rwin_fpreset (src/gnuwin/extra.c)
> and resets the precision, rounding and exception modes of a ix86
> fpu.
> */
> __asm__ ( "fninit" );
> #endif
>
> R_Visible = TRUE;
> switch (TYPEOF(e)) {
> case NILSXP:
> case LISTSXP:
> case LGLSXP:
> case INTSXP:
> case REALSXP:
> case STRSXP:
> case CPLXSXP:
> case RAWSXP:
> case S4SXP:
> case SPECIALSXP:
> case BUILTINSXP:
> case ENVSXP:
> case CLOSXP:
> case VECSXP:
> case EXTPTRSXP:

so PROTECT(op = eval(CAR(e), rho)) evaluates to R_NilValue.

I figured out that's why evaluating a LANGSXP with CAR a CLOSXP simply fails.

I'll have a look at the code snippet you gave, since I do not understand why it doesn't fail the same way mine does.

Thanks a lot.

-- 
      Guillaume Yziquel
http://yziquel.homelinux.org/

______________________________________________
R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Mon 30 Nov 2009 - 21:10:04 GMT

This archive was generated by hypermail 2.2.0 : Mon 30 Nov 2009 - 22:20:54 GMT