Hi,

Maybe sending an R expression and getting an R expression back
for a 'suitable subset' of expressions is ok initially. Suitable could
cover 3 levels:

1) Mapping of names and standard functions, e.g. pi to Pi and
      sin(x) to Sin(x) etc.

2) It would be nice if we can use threading of functions, which will  
require
      converting R lists, vectors, matrices etc to yacas lists.

3) And finally, what about functions such as apply, quote, etc.?

Not sure how to get around the superfluous parse step when
calling an R function, e.g.  yacas(rExp). Rebuilding the original
argument to pass to yacas with reparse(substitute(rExp)) again
might again be ok initially.

Earlier I asked the question on where to do the back and forth
translation of R expressions to yacas statements. At that time I
focused on R or C++. The latter likely if its done using the
parsed tree.

Two other possibilities might be to 'redo' yacas to make yacas much
closer to R (examples that come to mind is all cases of sin(x) in R to
Sin(x) in yacas - as in 1) above -, although as  Gabor indicated, CForm
helps on the way back). The 2nd option is adding a whole bunch of Rules
to the yacas scripts to do this, e.g '10 # sin(x) <-- Sin(x)'. Not  
sure if
adding a special low level generic object to yacas would help here.

As rules in yacas are global, all of these substitutions could be  
collected
in 1 or a few yacas scripts read in when R's yacas function starts the
yacas_client.

I do work on Mac, have helped Simon and Stefano occasionally with
the Mac OS GUI.  If you have a yacas version as an Xcode project,  
that would
make playing around and trying some of above steps easier. I've  
looked at the
Mac OS GUI version of Yacas, seems based on an older version and  
vanilla 1.0.57
compiles fine on Mac OS. My guess is, if possible, we want a single  
approach
across the different platforms.

Rob


On Jul 17, 2005, at 8:29 AM, Ayal Pinkus wrote:

>> Using this instead of Tcl_Eval() gives some efficiency gain, but more
>> importantly, it avoids the "quoting hell" associated with the
>> construction of the relevant command strings.

> Interesting. You are not the first person asking this, actually.
>
> I chose for the C API as it is nice and clean, no name mangling issues
> while switching to a new gcc compiler, and it allows people to use it
> from C also. Back then, I thought all people would want to do is  
> send a
> string and receive one back.

>> Since both R and Yacas are "Lisp under the hood" languages (and Tcl
>> too for that matter), it is a fairly good guess that their parse  
>> trees
>> are similar, and that it would be a fairly simple task to translate
>> back and forth between them. Well, between suitable subsets, at  
>> least.
>> R's parse trees can in principle contain arbitrary R objects, but in
>> this context, we might only need constants, names, operators, and
>> function calls.

On Jul 15, 2005, at 6:25 AM, Peter Dalgaard wrote:

>> I wonder how difficult it would be to translate expressions back and
>> forth from R to yacas in either R or C++. And maybe strip 'In>'  
>> and 'Out>' like parts.
>
> You could also just do what those examples do and embed the whole
> enchillada in R. The slightly bad news is that the yacas_eval
> interface is text-based, which means that to handle an R expression
> via yacas you're going through a deparse-parse-operate-deparse-parse
> sequence. It would be nicer if you could just convert parse trees
> between the two languages. The good news is that there's a Lisp route
> (see example3), which should make the parser/deparser coding somewhat
> easier.

On Jul 15, 2005, at 3:44 AM, Gabor Grothendieck wrote:

> On 7/15/05, Rob J Goedman <goedman@mac.com> wrote:
>
>> I wonder how difficult it would be to translate expressions back and
>> forth from R to yacas in either R
>> or C++. And maybe strip 'In>' and 'Out>' like parts.
>
> Not sure how generally this works but see my prior post:
>    http://tolstoy.newcastle.edu.au/R/help/04/03/1299.html

 > system("echo 'WriteString(CForm(Integrate(x)1/x))' | yacas_client")
In> WriteString(CForm(Integrate(x)1/x))
log(x)
Out> True
In>





	[[alternative HTML version deleted]]

