The following functions provide for communication using atoms and 
functors.
- atom_t PL_new_atom(const 
char *)
- Return an atom handle for the given C-string. This function always 
succeeds. The returned handle is valid as long as the atom is referenced 
(see section 
12.4.2.1). Currently aborts the process with a fatal error 
on failure. Future versions may raise a resource exception and return (atom_t)0.
The following atoms are provided as macros, giving access to the 
empty list symbol and the name of the list constructor. Prior to versionĀ 7,
ATOM_nilis the same asPL_new_atom("[]")andATOM_dotis the same asPL_new_atom("."). 
This is no longer the case in SWI-Prolog versionĀ 7.
 
- atom_t ATOM_nil(A)
- tomic constant that represents the empty list. It is advised to use PL_get_nil(), PL_put_nil() 
or PL_unify_nil() 
where applicable.
- atom_t ATOM_dot(A)
- tomic constant that represents the name of the list constructor. The 
list constructor itself is created using
PL_new_functor(ATOM_dot,2). 
It is advised to use
PL_get_list(), PL_put_list() 
or PL_unify_list() 
where applicable.
 
- atom_t PL_new_atom_mbchars(int 
rep, size_t len, const char *s)
- This function generalizes PL_new_atom() 
and PL_new_atom_nchars() 
while allowing for multiple encodings. The rep argument is 
one of
REP_ISO_LATIN_1,REP_UTF8orREP_MB. 
If
len is(size_t)-1, it is computed from s 
using
strlen(). Raises an exception if s violates rep 
and returns(atom_t)0. For other error conditions, see PL_new_atom().
- bool PL_atom_mbchars(atom_t 
atom, size_t len, char *s, unsigned int flags)
- This function generalizes fetching the text associated with an atom. The 
encoding depends on the flags REP_UTF8,REP_MBorREP_ISO_LATIN_1. Storage is defined by theBUF_*flags as described with PL_get_chars(). 
The flagCVT_EXCEPTIONdefines whether or not the function 
fails silently or raises a Prolog exception. This function may fail 
because atom is not a text atom but a blob (see section 
12.4.10), conversion to the requested encoding is not possible or a 
resource error occurs.
- const char* PL_atom_chars(atom_t 
atom)
- Deprecated. This function returns a pointer to the content represented 
by the atom or blob regardless of its type. New code that uses blobs 
should use the blob functions such as PL_blob_data() 
to get a pointer to the content, the size of the content, and the type 
of the content. Most applications that need to get text from a term_thandle should use PL_atom_nchars(), PL_atom_wchars(), 
or PL_atom_mbchars(). 
If it is
known that atom is a classical Prolog text atom, one 
can use PL_atom_nchars() 
to obtain the C string and its length (for ISO-Latin-1 atoms) or PL_atom_wchars() 
to obtain a C wide string (wchar_t).
- size_t PL_atom_index(atom_t 
atom)
- Extract the index of an atom. This is a relatively small 
integer. Atoms are numbered sequentially, starting at one (1). Note that 
the sequence may have holes due to atom garbage collection. The released 
index may later be reused for a new atom. The index may be used as a 
compact identifier for the atom. Extracting the index has no impact on 
the lifetime of the atom, i.e., the index is valid as long as the atom_tis valid.
- atom_t PL_atom_from_index(size_t 
index)
- Recover an atom from its index as obtained by PL_atom_index().
- functor_t PL_new_functor(atom_t 
name, int arity)
- Returns a functor identifier, a handle for the name/arity pair. 
The returned handle is valid for the entire Prolog session. Future 
versions may garbage collect functors as part of atom garbage 
collection. Currently aborts the process with a fatal error on 
failure. Future versions may raise a resource exception and return
(atom_t)0.
- atom_t PL_functor_name(functor_t 
f)
- Return an atom representing the name of the given functor.
- size_t PL_functor_arity(functor_t 
f)
- Return the arity of the given functor.
With the introduction of atom garbage collection in version 3.3.0, 
atoms no longer live as long as the process. Instead, their lifetime is 
guaranteed only as long as they are referenced. In the single-threaded 
version, atom garbage collections are only invoked at the
call-port. In the multithreaded version (see chapter 
10), they appear asynchronously, except for the invoking thread.
For dealing with atom garbage collection, two additional functions 
are provided:
- void PL_register_atom(atom_t 
atom)
- Increment the reference count of the atom by one. PL_new_atom() 
performs this automatically, returning an atom with a reference count of 
at least one.219Otherwise 
asynchronous atom garbage collection might destroy the atom before it is 
used.
- void PL_unregister_atom(atom_t 
atom)
- Decrement the reference count of the atom. If the reference count drops 
below zero, an assertion error is raised.
Please note that the following two calls are different with respect 
to atom garbage collection:
PL_unify_atom_chars(t, "text");
PL_unify_atom(t, PL_new_atom("text"));
The latter increments the reference count of the atom text, 
which effectively ensures the atom will never be collected. It is 
advised to use the *_chars() or *_nchars() functions 
whenever applicable.