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();
}