Re: [Rd] PROTECT and OCaml GC.

From: Guillaume Yziquel <>
Date: Mon, 30 Nov 2009 19:14:18 +0100

Simon Urbanek a écrit :

>> Because I've been unable to find what exactly applyClosure or eval 
>> requires, when it comes to the structure of the argument LANGSXP. For 
>> example.

> LANGSXP is simply a pairlist representing the expression, e.g. to look
> at "a+2" expression:
> > .Internal(inspect(quote(a+2)))
> @1183698 06 LANGSXP g0c0 []
> @101080c 01 SYMSXP g0c0 [MARK,gp=0x4000] "+"
> @1130394 01 SYMSXP g0c0 [MARK] "a"
> @1c384e8 14 REALSXP g0c1 [] (len=1, tl=0) 2
> I would suggest you learn more about R first - this is all accessible at
> the R/S language level:
> > x
> a + 2
> > x[[1]]
> `+`
> > x[[2]]
> a
> > x[[3]]
> [1] 2

I've gathered that LANGSXP and LISTSXP are structured in this way. By reading the header files. Please see:

Now to continue one the topic of the top paragraph:

I've tried sending a LANGSXP where the CAR element is a SYMSXP. eval workd. I've tried sending a LANGSXP where the CAR element is a CLOSXP. eval doesn't work. This is what I meant about the "structure of the argument LANGSXP". And it's contained in the link above.

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?

This does not seem documented in R-ints.pdf, R-exts.pdf or R-lang.pdf.

>> Suppose I have an OCaml (or pure C if you wish) linked list of OCaml 
>> value wrapping SEXP values. Is it possible, using only the API, to 
>> create a LANGSXP / LISTSXP list out of these SEXPs?

> Of course - see CONS/LCONS.

Great. That's the kind of fruitful interaction that could have made me gain a few days and not bypass the API. Thanks.

>> The "general" aspect of my request therefore concerns bindings to 
>> languages with 'inferred polymorphic static typing'. Please understand 
>> what these languages are about before dismissing my remarks as "my 
>> way". You may not care, you wouldn't be the first.

> You're missing my point - "your way" was to hack into the internals of
> how R represents SEXPs (going down to each pointer inside the SEXP
> headers). None of the above applies to my remark.
> Cheers,
> Simon

You're also missing my point. "my way" is the only way I've come up with to examine how to make sure that the static typing system I'm putting in place fits with the internal structure of SEXPs. I do need to know the internal structure of sexps and the way they evolve under the influence of function such as eval, install, applyClosure, in order to statically type my code. Same link expressing this concern:

Documentation is terse on precise structure of sexps. You get description of individual sexps, not a *precise* description of how they are assembled, which is what the typing will have to express. Much in the same spirit as the link below, which I really entice you to read:

Statically typing the internal structure of assembled sexps is no different than statically typing XHTML.

Glad that we're heading somewhere...

All the best,

      Guillaume Yziquel

______________________________________________ mailing list
Received on Mon 30 Nov 2009 - 18:17:08 GMT

This archive was generated by hypermail 2.2.0 : Mon 30 Nov 2009 - 21:10:53 GMT