Back: 4.2 API for embedding Forward: 4.3.1 Using PROTOTYPE     FastBack: 4. Embedding Compiled Routines Inside Yorick Up: 4. Embedding Compiled Routines Inside Yorick FastForward: 4. Embedding Compiled Routines Inside Yorick         Top: Yorick: An Interpreted Language Contents: Table of Contents     About: About This Document

4.3 Embedding example

Suppose you want to write a function which returns sqrt(r^2-x^2), with some of the nice features of the abs function, to be called rtleg for “right triangle leg”. Your first option is to simply write an interpreted function:

 
func rtleg(r,x,..)
{
  rr = 1./r;
  x *= rr;  /* prevent overflow for very large or small r */
  y = 1. - x*x;
  while (!is_void((x=next_arg()))) { x *= rr; y -= x*x; }
  return r*sqrt(y);
}

This interpreted function is likely the best solution, because the required function is simple and vectorizes naturally. For the sake of argument, however, suppose that you wanted to create a compiled version of rtleg instead. Now you need not only interpreted code, in a file ‘rtleg.i’, but also compiled code in a file ‘rtleg.c’. Let’s consider two cases: First, let’s use the PROTOTYPE comment and let codger generate the required wrapper code. Second, let’s write the wrapper code using ‘yapi.h’ directly.


Back: 4.2 API for embedding Forward: 4.3.1 Using PROTOTYPE     FastBack: 4. Embedding Compiled Routines Inside Yorick Up: 4. Embedding Compiled Routines Inside Yorick FastForward: 4. Embedding Compiled Routines Inside Yorick         Top: Yorick: An Interpreted Language Contents: Table of Contents     About: About This Document