Abstract

In order to add a system function, say ⎕FOO, to GNU APL the following steps are needed.

configure.ac

If ⎕FOO depends on a libraries (say LIBFOO) then add check for them in configure.ac.

src/Id.def

Add a macro for ⎕FOO in src/Id.def:

qf( FOO           , "⎕FOO"    ,          )

The position in the file is important: append to the group of IDs for the letter F (first character in FOO). qf is the macro for Quad-functions.

"src/Quad_FOO.hh

create this file:

#ifndef __Quad_FOO_DEFINED__
#define __Quad_FOO_DEFINED__

#include "QuadFunction.hh"
...

class Quad_FOO : public QuadFunction
{
public:
   /// Constructor.
   Quad_FOO()
      : QuadFunction(TOK_Quad_FOO),
        system_wisdom_loaded(false)
   {}

   static Quad_FOO * fun;          ///< Built-in function.
   static Quad_FOO  _fun;          ///< Built-in function.

protected:
   /// overloaded Function::eval_AB()
   Token eval_AB(Value_P A, Value_P B);

   /// overloaded Function::eval_B()
   Token eval_B(Value_P B);

   ...
};

#endif // __Quad_FOO_DEFINED__

"src/Quad_FOO.cc

create this file:

#include "Quad_FOO.hh"

Quad_FOO  Quad_FOO::_fun;
Quad_FOO * Quad_FOO::fun = &Quad_FOO::_fun;

#if defined(HAVE_LIBFOO) && defined(HAVE_FOO_H)

...
#else // no LIBFOO...

//-----------------------------------------------------------------------------
Token
Quad_FOO::eval_B(Value_P B)
{
    MORE_ERROR() <<
"⎕FOO is not available because either no libpcre2 libfftw3 was found on
this\n"
"system when GNU APL was compiled, or because it was disabled in
./configure.";

   SYNTAX_ERROR;
   return Token();
}
//-----------------------------------------------------------------------------
Token
Quad_FOO::eval_AB(Value_P A, Value_P B)
{
    MORE_ERROR() <<
"⎕FOO is not available because either no libfftw3 library was found on this\n"
"system when GNU APL was compiled, or because it was disabled in
./configure.";

   SYNTAX_ERROR;
   return Token();
}
//-----------------------------------------------------------------------------

#endif // HAVE_FOO_H

SVN: add the new giles to the repository:

svn add Quad_FOO.cc Quad_FOO.hh
svn commit

src/Id.cc

add:

#include "Quad_FOO.hh"

src/QuadFunction.cc

add:

#include "Quad_FOO.hh"

src/Workspace.cc

add:

#include "Quad_FOO.hh"

src/Makefile.am

add Quad_FOO.cc and Quad_FOO.hh to common_SOURCES:

Quad_FOO.cc                                     Quad_FOO.hh             \

src/Token.def

Add a TD() macro for ⎕FOO in src/Token.def:

TD(TOK_Quad_FOO      , TC_FUN2      , TV_FUN  , ID::Quad_FOO     )

src/SystemVariable.def

add a sf_def() macro:

  sf_def(Quad_FOO,   "FOO",   "Definitely not ⎕BAR"          )

Finalize

autoreconf
./configure
make