Unify t with a (normally) compound term. The remaining
arguments are a sequence of a type identifier followed by the required
arguments. This predicate is an extension to the Quintus and SICStus
foreign interface from which the SWI-Prolog foreign interface has been
derived, but has proved to be a powerful and comfortable way to create
compound terms from C. Due to the vararg packing/unpacking and the
required type-switching this interface is slightly slower than using the
primitives. Please note that some bad C compilers have fairly low limits
on the number of arguments that may be passed to a function.
Special attention is required when passing numbers. C‘promotes’any
integral smaller than int to int. That is, the
types
char, short and int are all
passed as int. In addition, on most 32-bit platforms int
and long are the same. Up to version 4.0.5, only PL_INTEGER
could be specified, which was taken from the stack as long.
Such code fails when passing small integral types on machines where int
is smaller than long. It is advised to use PL_SHORT, PL_INT
or PL_LONG as appropriate. Similarly, C compilers promote
float to double and therefore PL_FLOAT
and
PL_DOUBLE are synonyms.
The type identifiers are:
PL_VARIABLE none- No op. Used in arguments of
PL_FUNCTOR.
PL_BOOL int- Unify the argument with
true or false.
PL_ATOM atom_t- Unify the argument with an atom, as in PL_unify_atom().
PL_CHARS const char *- Unify the argument with an atom constructed from the C
char *,
as in PL_unify_atom_chars().
PL_NCHARS size_t, const char *- Unify the argument with an atom constructed from length and
char* as in PL_unify_atom_nchars().
PL_UTF8_CHARS const char *- Create an atom from a UTF-8 string.
PL_UTF8_STRING const char *- Create a packed string object from a UTF-8 string.
PL_MBCHARS const char *- Create an atom from a multi-byte string in the current locale.
PL_MBCODES const char *- Create a list of character codes from a multi-byte string in the current
locale.
PL_MBSTRING const char *- Create a packed string object from a multi-byte string in the current
locale.
PL_NWCHARS size_t, const wchar_t *- Create an atom from a length and a wide character pointer.
PL_NWCODES size_t, const wchar_t *- Create a list of character codes from a length and a wide character
pointer.
PL_NWSTRING size_t, const wchar_t *- Create a packed string object from a length and a wide character
pointer.
PL_SHORT short- Unify the argument with an integer, as in PL_unify_integer().
As
short is promoted to int, PL_SHORT
is a synonym for PL_INT.
PL_INTEGER long- Unify the argument with an integer, as in PL_unify_integer().
PL_INT int- Unify the argument with an integer, as in PL_unify_integer().
PL_LONG long- Unify the argument with an integer, as in PL_unify_integer().
PL_INT64 int64_t- Unify the argument with a 64-bit integer, as in PL_unify_int64().
PL_INTPTR intptr_t- Unify the argument with an integer with the same width as a pointer. On
most machines this is the same as
PL_LONG. but on 64-bit
MS-Windows pointers are 64 bits while longs are only 32 bits.
PL_DOUBLE double- Unify the argument with a float, as in PL_unify_float().
Note that, as the argument is passed using the C vararg conventions, a
float must be casted to a double explicitly.
PL_FLOAT double- Unify the argument with a float, as in PL_unify_float().
PL_POINTER void *- Unify the argument with a pointer, as in PL_unify_pointer().
PL_STRING const char *- Unify the argument with a string object, as in PL_unify_string_chars().
PL_TERM term_t- Unify a subterm. Note this may be the return value of a PL_new_term_ref()
call to get access to a variable.
PL_FUNCTOR functor_t, ...- Unify the argument with a compound term. This specification should be
followed by exactly as many specifications as the number of arguments of
the compound term.
PL_FUNCTOR_CHARS const char *name, int arity,
...- Create a functor from the given name and arity and then behave as
PL_FUNCTOR.
PL_LIST int length, ...- Create a list of the indicated length. The remaining arguments contain
the elements of the list.
For example, to unify an argument with the term language(dutch),
the following skeleton may be used:
static functor_t FUNCTOR_language1;
static void
init_constants()
{ FUNCTOR_language1 = PL_new_functor(PL_new_atom("language"),1);
}
foreign_t
pl_get_lang(term_t r)
{ return PL_unify_term(r,
PL_FUNCTOR, FUNCTOR_language1,
PL_CHARS, "dutch");
}
install_t
install()
{ PL_register_foreign("get_lang", 1, pl_get_lang, 0);
init_constants();
}