library(structs)
The structs
package allows Prolog to hold pointers to C data structures,
and to access and store into fields in those data structures.
Currently, the only representation for a pointer supported by SICStus
Prolog is an integer, so it isn't possible to guarantee that Prolog
can't confuse a pointer with an ordinary Prolog term. What this package
does is to represent such a pointer as a term with the type of the
structure or array as its functor and the integer that is the address
of the actual data as its only argument. We will refer such terms as
foreign terms.
The package consists of two modules, str_decl
and structs
. The
str_decl
module is used at compile time to translate the
structs-related constructs. Any file that defines or accesses structs
should include the command:
:- load_files(library(str_decl), [when(compile_time), if(changed)]).
The structs
module provides runtime support for structs. A
file that accesses structs should include the command:
:- use_module(library(structs)).
You will probably include both in most files that define and access structs.
Please note: A file that loads library(str_decl)
currently cannot
recursively load another file that loads library(str_decl)
, because that would
confuse the internal database being used by the package.
Important caveats:
You should not count on future versions of the structs package to continue to represent foreign terms as compound Prolog terms. In particular, you should never explicitly take apart a foreign term using unification or
functor/3
andarg/3
. You may use the predicateforeign_type/2
to find the type of a foreign term, andcast/3
(casting a foreign term to address) to get the address part of a foreign term. You may also usecast/3
to cast an address back to a foreign term. You should usenull_foreign_term/2
to check if a foreign term is null, or to create a null foreign term of some type.It should never be necessary to explicitly take apart foreign terms.