This is a manual page for an old and unsupported version of CHICKEN. If you are still using it, please consider migrating to the latest version. You can find the manual for the latest release here.
It is also possible to define variables containing unboxed C data, so called locations. It should be noted that locations may only contain simple data, that is: everything that fits into a machine word, and double-precision floating point values.
- (define-location NAME TYPE [INIT])syntax
Identical to (define-external NAME TYPE [INIT]), but the variable is not accessible from outside of the current compilation unit (it is declared static).
- (let-location ((NAME TYPE [INIT]) ...) BODY ...)syntax
Defines a lexically bound location.
- (location NAME)syntax
- (location X)syntax
is essentially equivalent to
(See the manual section on locatives for more information about locatives)
Note that (location X) may be abbreviated as #$X.
(define-external foo int) ((foreign-lambda* void (((c-pointer int) ip)) "*ip = 123;") (location foo)) foo ==> 123
This facility is especially useful in situations, where a C function returns more than one result value:
#> #include <math.h> <# (define modf (foreign-lambda double "modf" double (c-pointer double)) ) (let-location ([i double]) (let ([f (modf 1.99 (location i))]) (print "i=" i ", f=" f) ) )
See location and c-string* for a tip on returning a c-string* type.
location returns a value of type c-pointer, when given the name of a callback-procedure defined with define-external.
Next: Other support procedures