A C++ interface to SWI-Prolog
AllApplicationManualNameSummaryHelp

  • Documentation
    • Reference manual
    • Packages
      • A C++ interface to SWI-Prolog
        • Introduction
        • Overview
        • Examples
        • The class PlTerm
        • The class PlTermv
        • Supporting Prolog constants
        • The class PlRegister
        • The class PlQuery
        • The PREDICATE macro
        • Exceptions
        • Embedded applications
        • Considerations
        • Conclusions

6 Supporting Prolog constants

Both for quick comparison as for quick building of lists of atoms, it is desirable to provide access to Prolog's atom-table, mapping handles to unique string-constants. If the handles of two atoms are different it is guaranteed they represent different text strings.

Suppose we want to test whether a term represents a certain atom, this interface presents a large number of alternatives:

Direct comparision to char *

Example:

PREDICATE(test, 1)
{ if ( A1 == "read" )
    ...;

This writes easily and is the preferred method is performance is not critical and only a few comparisons have to be made. It validates A1 to be a term-reference representing text (atom, string, integer or float) extracts the represented text and uses strcmp() to match the strings.

Direct comparision to PlAtom

Example:

static PlAtom ATOM_read("read");

PREDICATE(test, 1)
{ if ( A1 == ATOM_read )
    ...;

This case raises a type_error if A1 is not an atom. Otherwise it extacts the atom-handle and compares it to the atom-handle of the global PlAtom object. This approach is faster and provides more strict type-checking.

Extraction of the atom and comparison to PlAtom

Example:

static PlAtom ATOM_read("read");

PREDICATE(test, 1)
{ PlAtom a1(A1);

  if ( a1 == ATOM_read )
    ...;

This approach is basically the same as section 6, but in nested if-then-else the extraction of the atom from the term is done only once.

Extraction of the atom and comparison to char *

Example:

PREDICATE(test, 1)
{ PlAtom a1(A1);

  if ( a1 == "read" )
    ...;

This approach extracts the atom once and for each test extracts the represented string from the atom and compares it. It avoids the need for global atom constructors.

PlAtom :: PlAtom(atom_t handle)
Create from C-interface atom handle. Used internally and for integration with the C-interface.
PlAtom :: PlAtom(const wchar_t *text)
PlAtom :: PlAtom(const char *text)
Create an atom from a string. The text is copied if a new atom is created.
PlAtom :: PlAtom(const PlTerm &t)
If t represents an atom, the new instance represents this atom. Otherwise a type_error is thrown.
int PlAtom::operator ==(const wchar_t *text)
int PlAtom::operator ==(const char *text)
Yields TRUE if the atom represents text, FALSE otherwise. Performs a strcmp() for this.
int PlAtom::operator ==(const PlAtom &a)
Compares the two atom-handles, returning TRUE or FALSE.