Version 1 is in SWI-cpp.h
; version 2 is in SWI-cpp2.h
.
The overall structure of the API has been retained - that is, it is a
thin layer on top of the interface provided by
SWI-Prolog.h
. Based on experience with the API, most of the
conversion operators have been removed or deprecated, and replaced by
"getter" methods. The overloaded constructors have been replaced by
subclasses for the various types. Some changes were also made to ensure
that the
operator for []
PlTerm
and PlTermv
doesn't cause unexpected implicit conversions.
2If there is an implicit
conversion operator from PlTerm
to term_t
and
also to char*
, then the
operator is ambiguous in []
PlTerm t=...; f(t[0])
if f
is overloaded to accept a term_t
or char*
.
More specifically:
false
from a predicate to indicate
failure, you can use throw PlFail()
. The convenience
function PlCheck(rc) can be used to throw PlFail()
,
if a false
is returned from a function in SWI-Prolog.h
(char*)t
, (int64_t)t
)
have been deprecated, replaced by "getters" (e.g.,
t.as_string()
, t.as_int64_t()
).3The
form (char*)t
is a C-style cast; C++'s preferred form is
more verbose: static_cast<char*>(t)
.char*
have been replaced by methods
that return std::string
to ensure that lifetime issues
don't cause subtle bugs.4If you
want to return a char*
from a function, you should not do return
t.as_string().c_str()
because that will return a pointer to local
or stack memory. Instead, you will need to change your interface to
return a std::string
and apply the c_str()
method to it. These errors can sometimes be caught by
specifying the Gnu C++ or Clang options -Wreturn-stack-address
or -Wreturn-local-addr
- Clang seems to do a better
analysis.PlString
has been renamed to PlTerm_string
to make it clear that it's a term that contains a Prolog string.PL_...(term_t, ...)
methods have been added to PlTerm
.std::string
and std::wstring
are now
supported in most places where char*
or wchar_t*
are allowed.int
for
true/false now return a C++ bool
.term_t
, atom_t
,
etc.) have been renamed from handle
, ref
, etc.
to
C_
.5This is done by
subclassing from Wrapped<term_t>
, Wrapped<atom_t>
,
etc., which define the field C_
, standard constructors, the
methods is_null(), not_null(), reset(),
and reset(v), plus the constant null
.PlForeignContextPtr<ContextType>
has been added, to simplify dynamic memory allocation in
non-deterministic predicates.PlStringBuffers
provides a simpler interface for
allocating strings on the stack than PL_STRINGS_MARK() and PL_STRINGS_RELEASE().More details are given in section 2.6 and section 2.7.