10.23.1 Foreign Types

There are two sorts of objects that Prolog may want to handle: atomic and compound. Atomic objects include numbers and atoms, and compound objects include data structures and arrays. To be more precise about it, an atomic type is defined by one of the following:

integer
signed integer, large enough to hold a pointer.
integer_32
32 bit signed integer.
integer_16
16 bit signed integer.
integer_8
8 bit signed integer.
unsigned
unsigned integer, large enough to hold a pointer.
unsigned_32
32 bit unsigned integer.
unsigned_16
16 bit unsigned integer.
unsigned_8
8 bit unsigned integer.
float
64 bit floating-point number.
float_32
32 bit floating-point number.
atom
32 bit Prolog atom number. Unique for different atoms, but not consistent across Prolog sessions. The atom is made non garbage collectable. See Atoms in C.
string
A pointer to an encoded string. Represented as an atom in Prolog. Please note: This string must not be overwritten, as it constitutes the print name of an atom. Also, the atom and string are made non garbage collectable. See Atoms in C.
address
An untyped pointer. Like pointer(_), but library(structs) does no type checking for you. Represented as a Prolog integer.
opaque
Unknown type. Cannot be represented in Prolog. A pointer to an opaque object may be manipulated.

Compound types are defined by one of the following:

pointer(Type)
a pointer to a thing of type Type.
array(Num,Type)
A chunk of memory holding Num (an integer) things of type Type.
array(Type)
A chunk of memory holding some number of things of type Type. This type does not allow bounds checking, so it should be used with great care. It is also not possible to use this sort of array as an element in an array, or in a struct or union.
struct(Fields)
A compound structure. Fields is a list of Field_name:Type pairs. Each Field_name is an atom, and each Type is any valid type.
union(Members)
A union as in C. Members is a list of Member_name:Type pairs. Each Member_name is an atom, and each Type is any valid type. The space allocated for one of these is the maximum of the spaces needed for each member. It is not permitted to store into a union (you must get a member of the union to store into, as in C).

C programmers will recognize that the kinds of data supported by this package were designed for the C language. They should also work for other languages, but programmers must determine the proper type declarations in those languages. The table above makes clear the storage requirements and interpretation of each type.

Note that there is one important difference between the structs package and C: the structs package permits declarations of pointers to arrays. A pointer to an array is distinguished from a pointer to a single element. For example

     pointer(array(integer_8))

is probably a more appropriate declaration of a C string type than

     pointer(integer_8)

which is the orthodox way to declare a string in C.


Send feedback on this subject.