- Documentation
- Reference manual
- Foreign Language Interface
- The Foreign Include File
- Unifying data
- PL_unify()
- PL_unify_atom()
- PL_unify_bool()
- PL_unify_chars()
- PL_unify_atom_chars()
- PL_unify_list_chars()
- PL_unify_string_chars()
- PL_unify_integer()
- PL_unify_int64()
- PL_unify_uint64()
- PL_unify_float()
- PL_unify_pointer()
- PL_unify_functor()
- PL_unify_compound()
- PL_unify_list()
- PL_unify_nil()
- PL_unify_arg()
- PL_unify_term()
- PL_chars_to_term()
- PL_wchars_to_term()
- PL_quote()
- Unifying data
- The Foreign Include File
- Foreign Language Interface
- Packages
- Reference manual
TRUE
on success.
Care is needed if PL_unify()
returns FAIL
and the foreign function does not immediately
return to Prolog with FAIL
. Unification may perform
multiple changes to either t1 or t2. A failing
unification may have created bindings before failure is detected. Already
created bindings are not undone. For example, calling PL_unify()
on a(X, a)
and a(c,b)
binds
X to c
and fails when trying to unify a
to
b
. If control remains in C or even if we want to return
success to Prolog, we must undo such bindings. This is achieved
using
PL_open_foreign_frame()
and PL_rewind_foreign_frame(),
as shown in the snippet below.
{ fid_t fid = PL_open_foreign_frame(); ... if ( !PL_unify(t1, t2) ) PL_rewind_foreign_frame(fid); ... PL_close_foreign_frame(fid); }
In addition, PL_unify()
may have failed on an exception, typically a resource (stack)
overflow. This can be tested using
PL_exception(),
passing 0 (zero) for the query-id argument. Foreign functions that
encounter an exception must return FAIL
to Prolog as soon
as possible or call PL_clear_exception()
if they wish to ignore the exception.