You are looking at historical revision 23717 of this page. It may differ significantly from its current revision.
Foreign type specifiers
Here is a list of valid foreign type specifiers:
An arbitrary Scheme data object (immediate or non-immediate).
As argument: any value (#f is false, anything else is true).
As result: anything different from 0 and the NULL pointer is #t.
A short integer number.
int unsigned-int int32 unsigned-int32
An small integer number in fixnum range (at least 30 bit).
integer unsigned-integer integer32 unsigned-integer32 integer64
Either a fixnum or a flonum in the range of a (unsigned) machine int or with 32/64 bit width.
Either a fixnum or a flonum in the range of a (unsigned) machine long or with 32 bit width.
A floating-point number. If an exact integer is passed as an argument, then it is automatically converted to a float.
A floating-point number. Similar to double, but when used as a result type, then either an exact integer or a floating-point number is returned, depending on whether the result fits into an exact integer or not.
A symbol, which will be passed to foreign code as a zero-terminated string.
When declared as the result of foreign code, the result should be a string and a symbol with the same name will be interned in the symbol table (and returned to the caller).
An untyped pointer to the contents of a non-immediate Scheme object (not allowed as return type). The value #f is also allowed and is passed as a NULL pointer.
Don't confuse this type with (c-pointer ...) which means something different (a machine-pointer object).
scheme-pointer is typically used to get a pointer to the raw byte content of strings and blobs. But if you pass in a SRFI-4 vector, you will get a pointer to a blob object (not the blob's contents), which is almost certainly wrong. Instead, convert to a blob beforehand, or use a SRFI-4 specific type.
As scheme-pointer, but guaranteed not to be #f.
Don't confuse this type with (nonnull-c-pointer ...) which means something different (a machine-pointer object).
An untyped operating-system pointer or a locative. The value #f is also allowed and is passed as a NULL pointer. If uses as the type of a return value, a NULL pointer will be returned as #f.
As c-pointer, but guaranteed not to be #f/NULL.
A vector of foreign pointer objects. #f is allowed and passed as a NULL pointer.
As pointer-vector, but guaranteed not to be #f/NULL.
A blob object, passed as a pointer to its contents. Arguments of type blob may optionally be #f, which is passed as a NULL pointer.
This is not allowed as a return type.
As blob, but guaranteed not to be #f.
A SRFI-4 number-vector object, passed as a pointer to its contents.
These type specifiers are not allowed as return types.
As u8vector ..., but guaranteed not to be #f.
A C string (zero-terminated). The value #f is also allowed and is passed as a NULL pointer. If uses as the type of a return value, a NULL pointer will be returned as #f. Note that the string is copied (with a zero-byte appended) when passed as an argument to a foreign function. Also a return value of this type is copied into garbage collected memory.
As c-string, but guaranteed not to be #f/NULL.
Similar to [nonnull-] c-string, but if used as a result-type, the pointer returned by the foreign code will be freed (using the C-libraries free(1)) after copying. This type specifier is not valid as a result type for callbacks defined with define-external.
Same as c-string, but maps to the unsigned char * C type.
Expects a pointer to a list of C strings teminated by a NULL pointer and returns a list of strings.
Only valid as a result type of non-callback functions.
Similar to c-string-list but releases the storage of each string and the pointer array using free(1).
Specifies an undefined return value.
Not allowed as argument type.
The foreign type TYPE with an additional const specifier.
An enumeration type. Handled internally as an integer.
An operating-system pointer or a locative to an object of TYPE.
As (c-pointer TYPE), but guaranteed not to be #f/NULL.
A C++ reference type. Reference types are handled the same way as pointers inside Scheme code.
A struct of the name NAME, which should be a string.
Structs cannot be directly passed as arguments to foreign function, neither can they be result values. Pointers to structs are allowed, though.
(template TYPE ARGTYPE ...)
A C++ template type. For example vector<int> would be specified as (template "vector" int).
Template types cannot be directly passed as arguments or returned as results.
A union of the name NAME, which should be a string.
Unions cannot be directly passed as arguments to foreign function, neither can they be result values. Pointers to unions are allowed, though.
(instance CNAME SCHEMECLASS)
A pointer to a C++ class instance wrapped into a Scheme object instance. CNAME should designate the name of the C++ class, and SCHEMECLASS should be the class that wraps the instance pointer.
(make SCHEMECLASS 'this POINTER) (slot-ref INSTANCE 'this)
(instance-ref CNAME SCHEMECLASS)
A reference to a C++ class instance.
(function RESULTTYPE (ARGUMENTTYPE1 ... [...]) [CALLCONV])
A function pointer. CALLCONV specifies an optional calling convention and should be a string. The meaning of this string is entirely platform dependent. The value #f is also allowed and is passed as a NULL pointer.
Foreign types are mapped to C types in the following manner:
|[nonnull-]blob||unsigned char *|
|[nonnull-]u8vector||unsigned char *|
|[nonnull-]u16vector||unsigned short *|
|[nonnull-]unsigned-c-string||unsigned char *|
|([nonnull-]c-pointer TYPE)||TYPE *|
|(enum NAME)||enum NAME|
|(struct NAME)||struct NAME|
|(ref TYPE)||TYPE &|
|(template T1 T2 ...)||T1<T2, ...>|
|(union NAME)||union NAME|
|(function RTYPE (ATYPE ...) [CALLCONV])||[CALLCONV] RTYPE (*)(ATYPE, ...)|
|(instance CNAME SNAME)||CNAME *|
|(instance-ref CNAME SNAME)||CNAME &|
Previous: Accessing external objects