On Nov 30, 2009, at 13:14 , Guillaume Yziquel wrote:

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:

https://stat.ethz.ch/pipermail/r-devel/2009-November/055813.html

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?


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

> .Internal(inspect(function(x) x + 1))
@19e376c 03 CLOSXP g0c0 [ATT]
FORMALS:
  @19e399c 02 LISTSXP g0c0 []
    TAG: @1029840 01 SYMSXP g0c0 [MARK,NAM(2)] "x"
    @1007378 01 SYMSXP g0c0 [MARK,NAM(2)] ""
BODY:
  @19e3948 06 LANGSXP g0c0 []
    @101080c 01 SYMSXP g0c0 [MARK,gp=0x4000] "+"
    @1029840 01 SYMSXP g0c0 [MARK,NAM(2)] "x"
    @19e1248 14 REALSXP g0c1 [] (len=1, tl=27187120) 1
CLOENV:
  @1023c38 04 ENVSXP g0c0 [MARK,NAM(2),gp=0x8000]
ATTRIB:
  @19e3750 02 LISTSXP g0c0 []
    TAG: @1006ee0 01 SYMSXP g0c0 [MARK,gp=0x4000] "source"
    @19e1228 16 STRSXP g0c1 [] (len=1, tl=16806832)
      @150cdc8 09 CHARSXP g0c3 [gp=0x20] "function(x) x + 1"


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.


... or reading R-ext:

"There are a series of small macros/functions to help construct pairlists and language objects (whose internal structures just differ by SEXPTYPE. Function CONS(u, v) is the basic building block: is constructs a pairlist from u followed by v (which is a pairlist or R_NilValue). LCONS is a variant that constructs a language object. Functions list1 to list4 construct a pairlist from one to four items, andlang1 to lang4 do the same for a language object (a function to call plus zero to three arguments). Function elt and lastElt find the ith element and the last element of a pairlist, and nthcdr returns a pointer to the nth position in the pairlist (whose CAR is the nth item)."


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:

No, you don't - you do care what the *types* are (i.e. TYPEOF) and how they behave, but you should *not* care how they are implemented in the internals. That is deliberately hidden by the API.


https://stat.ethz.ch/pipermail/r-devel/2009-November/055813.html

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.

Hopefully not - again, see above comment.

Cheers,
Simon


Much in the same spirit as the link below, which I really entice you to read:

http://ocsigen.org/eliom/manual/1.2.0/1#p1baseprinciples

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
http://yziquel.homelinux.org/



______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to