6 Derived Utilities
6.1 Tagged C Pointer Types
The unsafe cpointer-has-tag? and cpointer-push-tag! operations manage tags to distinguish pointer types.
| ||||||||||||||||||||||||||||
tag : any/c | ||||||||||||||||||||||||||||
ptr-type : ctype? = xpointer | ||||||||||||||||||||||||||||
scheme-to-c : (any/c . -> . any/c) = values | ||||||||||||||||||||||||||||
c-to-scheme : (any/c . -> . any/c) = values | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
tag : any/c | ||||||||||||||||||||||||||||
ptr-type : ctype? = xpointer | ||||||||||||||||||||||||||||
scheme-to-c : (any/c . -> . any/c) = values | ||||||||||||||||||||||||||||
c-to-scheme : (any/c . -> . any/c) = values |
Pointer tags are checked with cpointer-has-tag? and changed with cpointer-push-tag! which means that other tags are preserved. Specifically, if a base ptr-type is given and is itself a _cpointer, then the new type will handle pointers that have the new tag in addition to ptr-type’s tag(s). When the tag is a pair, its first value is used for printing, so the most recently pushed tag which corresponds to the inheriting type will be displayed.
Note that tags are compared with eq? (or memq), which means an interface can hide its value from users (e.g., not provide the cpointer-tag accessor), which makes such pointers un-fake-able.
_cpointer/null is similar to _cpointer except that it tolerates NULL pointers both going to C and back. Note that NULL pointers are represented as #f in Scheme, so they are not tagged.
(define-cpointer-type _id) |
(define-cpointer-type _id scheme-to-c-expr) |
(define-cpointer-type _id scheme-to-c-expr c-to-scheme-expr) |
The optional expression produces optional arguments to _cpointer.
In addition to defining _id to a type generated by _cpointer, _id/null is bound to a type produced by _cpointer/null type. Finally, id? is defined as a predicate, and id-tag is defined as an accessor to obtain a tag. The tag is the string form of id.
6.1.1 Unsafe Tagged C Pointer Functions
(cpointer-has-tag? cptr tag) → boolean? |
cptr : any/c |
tag : any/c |
(cpointer-push-tag! cptr tag) → void |
cptr : any/c |
tag : any/c |
The cpointer-has-tag? function checks whether if the given cptr has the tag. A pointer has a tag tag when its tag is either eq? to tag or a list that contains (in the sense of memq) tag.
The cpointer-push-tag! function pushes the given tag value on cptr’s tags. The main properties of this operation are: (a) pushing any tag will make later calls to cpointer-has-tag? succeed with this tag, and (b) the pushed tag will be used when printing the pointer (until a new value is pushed). Technically, pushing a tag will simply set it if there is no tag set, otherwise push it on an existing list or an existing value (treated as a single-element list).
6.2 Safe C Vectors
The cvector form can be used as a type C vectors (i.e., a pointer to a memory block).
(make-cvector type length) → cvector? |
type : ctype? |
length : exact-nonnegative-integer? |
(cvector-length cvec) → exact-nonnegative-integer? |
cvec : cvector? |
(cvector-type cvec) → ctype? |
cvec : cvector? |
(cvector-ptr cvec) → cpointer? |
cvec : cvector? |
(cvector-ref cvec k) → any |
cvec : cvector? |
k : exact-nonnegative-integer? |
(cvector-set! cvec k val) → void? |
cvec : cvector? |
k : exact-nonnegative-integer? |
val : any |
(cvector->list cvec) → list? |
cvec : cvector? |
(list->cvector lst type) → cvector? |
lst : list? |
type : ctype? |
6.2.1 Unsafe C Vector Construction
(make-cvector* cptr type length) → cvector? |
cptr : any/c |
type : ctype? |
length : exact-nonnegative-integer? |
6.3 SRFI-4 Vectors
SRFI-4 vectors are similar to C vectors (see Safe C Vectors), except that they define different types of vectors, each with a hard-wired type.
An exception is the u8 family of bindings, which are just aliases for byte-string bindings: make-u8vector, u8vector. u8vector?, u8vector-length, u8vector-ref, u8vector-set!, list->u8vector, u8vector->list.
(make-u8vector len) → u8vector? |
len : exact-nonnegative-integer? |
(u8vector val ...) → u8vector? |
val : number? |
(u8vector? v) → boolean? |
v : any/c |
(u8vector-length vec) → exact-nonnegative-integer? |
vec : u8vector? |
(u8vector-ref vec k) → number? |
vec : u8vector? |
k : exact-nonnegative-integer? |
(u8vector-set! vec k val) → void? |
vec : u8vector? |
k : exact-nonnegative-integer? |
val : number? |
(list->u8vector lst) → u8vector? |
lst : (listof number?) |
(u8vector->list vec) → (listof number?) |
vec : u8vector? |
(make-s8vector len) → s8vector? |
len : exact-nonnegative-integer? |
(s8vector val ...) → s8vector? |
val : number? |
(s8vector? v) → boolean? |
v : any/c |
(s8vector-length vec) → exact-nonnegative-integer? |
vec : s8vector? |
(s8vector-ref vec k) → number? |
vec : s8vector? |
k : exact-nonnegative-integer? |
(s8vector-set! vec k val) → void? |
vec : s8vector? |
k : exact-nonnegative-integer? |
val : number? |
(list->s8vector lst) → s8vector? |
lst : (listof number?) |
(s8vector->list vec) → (listof number?) |
vec : s8vector? |
(make-s16vector len) → s16vector? |
len : exact-nonnegative-integer? |
(s16vector val ...) → s16vector? |
val : number? |
(s16vector? v) → boolean? |
v : any/c |
(s16vector-length vec) → exact-nonnegative-integer? |
vec : s16vector? |
(s16vector-ref vec k) → number? |
vec : s16vector? |
k : exact-nonnegative-integer? |
(s16vector-set! vec k val) → void? |
vec : s16vector? |
k : exact-nonnegative-integer? |
val : number? |
(list->s16vector lst) → s16vector? |
lst : (listof number?) |
(s16vector->list vec) → (listof number?) |
vec : s16vector? |
(_s16vector mode maybe-len) |
_s16vector |
(make-u16vector len) → u16vector? |
len : exact-nonnegative-integer? |
(u16vector val ...) → u16vector? |
val : number? |
(u16vector? v) → boolean? |
v : any/c |
(u16vector-length vec) → exact-nonnegative-integer? |
vec : u16vector? |
(u16vector-ref vec k) → number? |
vec : u16vector? |
k : exact-nonnegative-integer? |
(u16vector-set! vec k val) → void? |
vec : u16vector? |
k : exact-nonnegative-integer? |
val : number? |
(list->u16vector lst) → u16vector? |
lst : (listof number?) |
(u16vector->list vec) → (listof number?) |
vec : u16vector? |
(_u16vector mode maybe-len) |
_u16vector |
(make-s32vector len) → s32vector? |
len : exact-nonnegative-integer? |
(s32vector val ...) → s32vector? |
val : number? |
(s32vector? v) → boolean? |
v : any/c |
(s32vector-length vec) → exact-nonnegative-integer? |
vec : s32vector? |
(s32vector-ref vec k) → number? |
vec : s32vector? |
k : exact-nonnegative-integer? |
(s32vector-set! vec k val) → void? |
vec : s32vector? |
k : exact-nonnegative-integer? |
val : number? |
(list->s32vector lst) → s32vector? |
lst : (listof number?) |
(s32vector->list vec) → (listof number?) |
vec : s32vector? |
(_s32vector mode maybe-len) |
_s32vector |
(make-u32vector len) → u32vector? |
len : exact-nonnegative-integer? |
(u32vector val ...) → u32vector? |
val : number? |
(u32vector? v) → boolean? |
v : any/c |
(u32vector-length vec) → exact-nonnegative-integer? |
vec : u32vector? |
(u32vector-ref vec k) → number? |
vec : u32vector? |
k : exact-nonnegative-integer? |
(u32vector-set! vec k val) → void? |
vec : u32vector? |
k : exact-nonnegative-integer? |
val : number? |
(list->u32vector lst) → u32vector? |
lst : (listof number?) |
(u32vector->list vec) → (listof number?) |
vec : u32vector? |
(_u32vector mode maybe-len) |
_u32vector |
(make-s64vector len) → s64vector? |
len : exact-nonnegative-integer? |
(s64vector val ...) → s64vector? |
val : number? |
(s64vector? v) → boolean? |
v : any/c |
(s64vector-length vec) → exact-nonnegative-integer? |
vec : s64vector? |
(s64vector-ref vec k) → number? |
vec : s64vector? |
k : exact-nonnegative-integer? |
(s64vector-set! vec k val) → void? |
vec : s64vector? |
k : exact-nonnegative-integer? |
val : number? |
(list->s64vector lst) → s64vector? |
lst : (listof number?) |
(s64vector->list vec) → (listof number?) |
vec : s64vector? |
(_s64vector mode maybe-len) |
_s64vector |
(make-u64vector len) → u64vector? |
len : exact-nonnegative-integer? |
(u64vector val ...) → u64vector? |
val : number? |
(u64vector? v) → boolean? |
v : any/c |
(u64vector-length vec) → exact-nonnegative-integer? |
vec : u64vector? |
(u64vector-ref vec k) → number? |
vec : u64vector? |
k : exact-nonnegative-integer? |
(u64vector-set! vec k val) → void? |
vec : u64vector? |
k : exact-nonnegative-integer? |
val : number? |
(list->u64vector lst) → u64vector? |
lst : (listof number?) |
(u64vector->list vec) → (listof number?) |
vec : u64vector? |
(_u64vector mode maybe-len) |
_u64vector |
(make-f32vector len) → f32vector? |
len : exact-nonnegative-integer? |
(f32vector val ...) → f32vector? |
val : number? |
(f32vector? v) → boolean? |
v : any/c |
(f32vector-length vec) → exact-nonnegative-integer? |
vec : f32vector? |
(f32vector-ref vec k) → number? |
vec : f32vector? |
k : exact-nonnegative-integer? |
(f32vector-set! vec k val) → void? |
vec : f32vector? |
k : exact-nonnegative-integer? |
val : number? |
(list->f32vector lst) → f32vector? |
lst : (listof number?) |
(f32vector->list vec) → (listof number?) |
vec : f32vector? |
(_f32vector mode maybe-len) |
_f32vector |
(make-f64vector len) → f64vector? |
len : exact-nonnegative-integer? |
(f64vector val ...) → f64vector? |
val : number? |
(f64vector? v) → boolean? |
v : any/c |
(f64vector-length vec) → exact-nonnegative-integer? |
vec : f64vector? |
(f64vector-ref vec k) → number? |
vec : f64vector? |
k : exact-nonnegative-integer? |
(f64vector-set! vec k val) → void? |
vec : f64vector? |
k : exact-nonnegative-integer? |
val : number? |
(list->f64vector lst) → f64vector? |
lst : (listof number?) |
(f64vector->list vec) → (listof number?) |
vec : f64vector? |
(_f64vector mode maybe-len) |
_f64vector |