Conversion declaration predicates:
foreign_resource(
+ResourceName,
+Functions)
hookinit(
Function)
and deinit(
Function)
respectively (see Init and Deinit Functions). This predicate
should be defined entirely in terms of facts (unit clauses)
and will be called in the relevant module, i.e. not necessarily
in the user
module. For example:
foreign_resource('terminal', [scroll,pos_cursor,ask]).
specifies that functions scroll()
, pos_cursor()
and
ask()
are to be found in the resource terminal.
foreign(
+CFunctionName,
+Predicate)
hookforeign(
+CFunctionName,
+Language,
+Predicate)
hookc
, so there is no advantage
in using foreign/3
over foreign/2
. CFunctionName is
the name of a C function. Predicate specifies the name of the
Prolog predicate that will be used to call CFunction().
Predicate also specifies how the predicate arguments
are to be translated to and from the corresponding C
arguments. These predicates should be defined entirely in
terms of facts (unit clauses) and will be called in the
relevant module, i.e. not necessarily in the user
module. For example:
foreign(pos_cursor, c, move_cursor(+integer, +integer)).
The above example says that the C function pos_cursor()
has two
integer value arguments and that we will use the predicate
move_cursor/2
to call this function. A goal
move_cursor(5, 23)
would translate into the C call
pos_cursor(5,23);
.
The third argument of the predicate foreign/3
specifies how to translate between Prolog arguments and C
arguments. A call to a foreign predicate will raise an
exception if an input arguments is uninstantiated
(instantiation_error/2
) or has the wrong type
(type_error/4
) or domain (domain_error/4
). The call will
fail upon return from the function if the output arguments do not
unify with the actual arguments.
The available conversions are listed in the next subsection.