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