Sometimes it is convenient to put constant terms and atoms as global
variables in a file (with a static
qualifier), so that they
are only created (and looked up) cone. This is fine for atoms and
functors, which can be created by something like this:
static PlAtom ATOM_foo("foo"); static PlFunctor FUNCTOR_ff_2("ff", 2);
C++ makes no guarantees about the order of creating global variables
across “translation units” (that is, individual C++ files),
but the Prolog runtime ensures that the necessary initialization has
been done to allow PlAtom
and PlFunctor
objects to be created. However, to be safe, it is best to put such
global variables
inside functions - C++ will initialize them on their firstuse.
Global Terms need a bit of care. For one thing, terms are ephemeral,
so it is wrong to have a PlTerm
static variable - instead,
a
PlRecord
must be used, which will provide a fresh copy of
the term using PlRecord::term(). There is no guarantee that the
Prolog runtime has initialized everything needed for creating entries in
the recorded database (see
Recorded
database). Therefore, global recorded terms must be wrapped inside a
function. C++ will call the constructor upon first use. For example:
static PlTerm term_foo_bar() { static PlRecord r(PlCompound("foo", PlTermv(PlTerm_atom("bar"))).record()); return r.term(); }