packages icon



 DEFUNC(3)              C LIBRARY FUNCTIONS              DEFUNC(3)



 NAME
      defunc -- a portable C library package for runtime  function
      constructing.

 DESCRIPTION
      defunc (Dynamic  Expressible  Function  Constructing)  is  a
      portable  C  library package for constructing functions from
      runtime inputted expressions.

      defunc  library  function  dfopen()  accepts  an  expression
      string and, on success, returns a function pointer. e.g.

           #include <defunc.h>

           foo()
           {
               double (*fnctptr)();
                 ....
               fnctptr = dfopen("(x*x+y*y)^0.5");
                 ....
           };

      The function dfopen() is reentrant. That is, you can repeat-
      edly  call  dfopen()  without worry about the new result may
      overlap or damage the old one, provided they are assigned to
      different lvalues. e.g.

           double (*fnctptr1)();
           double (*fnctptr2)();
            ...
           fnctptr1 = dfopen("exp(-x*x)");
           fnctptr2 = dfopen("exp(-x)*sin(x)");
            ...

      Then, fnctptr1 and fnctptr2  will  point  to  two  different
      functions.

      Function dfopen() parses the expression be passed  based  on
      tokens  it  recognized. Except for numerical string constant
      tokens(i.e. anonymous  constant  tokens)  and  14  build  in
      tokens  "+",  "-",  "*", "/", "^", "**", "(", ")", ",", "=",
      ";", "[", "]"  and  "$",  all  other  tokens  are  external.
      External tokens include argument tokens, function tokens and
      named constant tokens. They are stored  in  a  global  token
      table.  They can be set/reset or appended/deleted statically
      as well as dynamically. e.g.

           nameargu("re", "im");

      This will reset argument tokens to "re" and "im"(the default
      are "x" and "y").




 defunc 1.3          Last change: January 1994                   1






 DEFUNC(3)              C LIBRARY FUNCTIONS              DEFUNC(3)



           namefnct("log", log);
           namefnct("ln" , log);

      Here, the external function log()  has  been  added  to  the
      token list with 2 alias names "log" and "ln".

           namecnst("pi", 2.0*asin(1.0));
           namecnst("PI", 2.0*asin(1.0));

      This will add a named constant token to the list with  alias
      names "pi" and "PI" and value 3.1415926... .

           clrcnst("PI");

      This will delete the constant token  "PI"  from  the  global
      token  table.  After an external token has been put into the
      global token list, it can be used in expressions  passed  to
      dfopen().  e.g. After you put the exponential function exp()
      into token table with

           namefnct("exp", exp);
             /* add external function exp() to the token table */

      Than you can use it to construct a gaussian function dynami-
      cally as

           double (*gauss)();
            ...
           gauss = dfopen("exp(-x*x)");

      Argument tokens, named constant tokens and dynamically  con-
      structed  functions  can be reset or added to the token list
      dynamically. This can be done directly from  the  expression
      passed to dfopen() function. e.g.

           fnctptr = dfopen("Rho(re, im)=(re*re+im*im)^0.5");

      This will reset the argument tokens to "re" and "im", return
      a  duplex  function pointer and add this function pointer to
      the global token list with name "Rho".

           dfopen("gauss(x)=exp(-x*x)");

      This sets the first argument  tokens  to  "x"  and  put  the
      return  function pointer to the global token table with name
      "gauss" while the return function pointer is not assigned to
      any lvalue. Now, the token "gauss" is recognizable by defunc
      and you can in turn use it to construct new  function.  Such
      as

           dfopen("gauss2d(x,y)=gauss(x)*gauss(y)");




 defunc 1.3          Last change: January 1994                   2






 DEFUNC(3)              C LIBRARY FUNCTIONS              DEFUNC(3)



      will return a 2 dimension gaussian function and  put  it  to
      token  table  with  name "gauss2d". If you don't want this 2
      dimension gaussian function be putted into the  token  table
      but you still want reset the argument tokens, for example to
      "a", "b", you can use

           fnctptr = dfopen("$(a, b) = gauss(a)*gauss(b)");

      or

           fnctptr = dfopen("$gauss(a, b) = gauss(a)*gauss(b)");

      Here, fnctptr is a function pointer to accept  the  returned
      value from dfopen().

      Named constant tokens can also be added to  the  token  list
      from expression passed to dfopen(). e.g.

           fnctptr = dfopen("pi = 4*atan2(1,1)");

      This will return a constant function and add  a  named  con-
      stant  token  to  the token list with value 3.1415926... and
      name "pi".

 SEE ALSO
      dfopen(3)

 AUTHOR
      Ke Jin
      Physics Department
      Queen's University
      Kingston, Ontario
      Canada K7L 3N6
      jinke@sparky.phy.queensu.ca

 BUGS
      Report bugs of defunc library to the author by email.


















 defunc 1.3          Last change: January 1994                   3