1 A C++ interface to SWI-Prolog (Version 1)
AllApplicationManualNameSummaryHelp

  • Documentation
    • Reference manual
    • Packages
      • A C++ interface to SWI-Prolog
        • A C++ interface to SWI-Prolog (Version 1)
          • 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

1.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 1.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 &)
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 &)
Compares the two atom-handles, returning TRUE or FALSE.