[Rd] Rf_errorcall - translate to Pascal

Hans-Peter gchappi at gmail.com
Thu Feb 16 17:37:56 CET 2006


Hello!

Thanks for your answers!

---
2006/2/16, Duncan Murdoch <murdoch at stats.uwo.ca>:
> I think it would be helpful to know the scope of the problem.  Could you
> collect together a complete list of examples like this?

yes, I will do that. Until now it's only the one function mentioned
and the 2 macro groups.
Btw: your Delphi notes were great to get me started !!!

---
2006/2/16, Rainer M Krug <rkrug at sun.ac.za>:
> Hans-Peter wrote:
> > I (try to) convert the external R header files to Pascal (Delphi). At
> Sounds interesting - Could you keep me updated about your progress? I
> would be interested in the header files to use them in the analysis of
> simulations from Delphi.

Sure, but I cannot promise anything. I did the same for Matlab but
it's much more difficult with R.

---
2006/2/16, Prof Brian Ripley <ripley at stats.ox.ac.uk>:
> Yes, and their names are case-sensitive too.  So it is intentional that
> errorcall is not in R_Ext/Error.h.  Since it is needed for writing
> front-ends and now mentioned in Writing R Extensions it should probably be
> in Rinternals.h.

that would be great!

>But note that is basically the only way that a non-core
> programmer is going to be writing code that gets passed 'call' objects.

ok, thanks

> > As a sidenote: in Defn.h are two macrogroups:
> This is intentional.  Both Defn.h and Rinternals.h have these in a section
> protected by
> #ifdef USE_RINTERNALS
> #endif
> and that section should not be regarded as public.

I know that USE_RINTERNALS is ...internal and can change. But I had to
translate it nevertheless, because I need at least the type definition
"SEXP". And e.g. in chapter "4.8.2 Calling .External" there are code
samples with the macros CADR, TYPEOF, CHAR, STRING_ELT, ... which
AFAIK can run in Pascal only if they are redefined as pascal
functions. Regarding the possible changes I have to think about DUnit
tests to catch them.

>There _are_ (mis-titled) sections
> /* Promise Access Macros */
> /* Hashing Macros */
> in Rinternals.h, and those are the function equivalents defined for
> external use.

Sorry, I don't understand. Eg. in Rinternals.h the first entry in /*
Promise Access Macros */ is:   SEXP (PRCODE)(SEXP x);
                 ~~~~~~~
Do you now mean, that the macro PRCODE is defined for external use? 
On the other hand, it's nowhere in the "writing R extensions
documentation". But it's e.g. used in the library methods (in the
function: methods-List_dispatch.c).

If its meant for external use, then AFAIK the only way to use this
macro in Pascal code is to translate it as a function, like e.g.:

  function rhPrcode( _x: pSexp ): pSexp;
    begin
      result:= _x.promsxp.expr;
    end;

<license related>
And now it's a bit unnice, that "_x.promsxp.expr" is defined in Defn.h
[as: ((x)->u.promsxp.expr)] and not in Rinternal.h. With almost all
other macros, e.g. FORMALS this is different, they are defined in
Rinternal.h [e.g.: ((x)->u.closxp.formals)]. In this macro case I
think its also for strict license interpretations irrelevant, because
SEXPREC and promsxp_struct are fully declared in Rinternal.h. But it's
not nice and maybe I just skip it.
</license related>


--
Regards,
Hans-Peter



More information about the R-devel mailing list