On this page:
make-union-type
_  union
union?
union-ref
union-set!
union-ptr

3.9 C Union Types 🔗

procedure

(make-union-type type ...+)  ctype?

  type : ctype?
The primitive type constructor for creating new C union types. Like C struct types, union types are new primitive types with no conversion functions associated. Unions are always treated like structs with 'atomic allocation mode.

Example:
> (make-union-type (_list-struct _int _int)
                   (_list-struct _double _double))

#<compound-ctype>

procedure

(_union type ...+)  ctype?

  type : ctype?
Creates a union type whose Racket representation is a union that works with union-ref and union-set!. The union is not copied; the Racket representation is backed by the underlying C representation.

Example:
> (_union (_list-struct _int _int)
          (_list-struct _double _double))

#<compound-ctype>

procedure

(union? v)  boolean?

  v : any/c
Returns #t if v is a Racket representation of a C value via _union, #f otherwise.

Examples:
> (define a-union-type
    (_union (_list-struct _int _int)
            (_list-struct _double _double)))
> (define a-union-val
    (cast (list 3.14 2.71)
          (_list-struct _double _double)
          a-union-type))
> (union? a-union-val)

#t

> (union? 3)

#f

procedure

(union-ref u i)  any/c

  u : union?
  i : exact-nonnegative-integer?
Extracts a variant from a union. The variants are indexed starting at 0.

Examples:
; see examples for union? for definitions
> (union-ref a-union-val 1)

'(3.14 2.71)

procedure

(union-set! u i v)  void?

  u : union?
  i : exact-nonnegative-integer?
  v : any/c
Sets a variant in a union.

Examples:
; see examples for union? for definitions
> (union-set! a-union-val 0 (list 4 5))
> a-union-val

#<union>

> (union-ref a-union-val 0)

'(4 5)

procedure

(union-ptr u)  cpointer?

  u : union?
Extracts the pointer for a union’s storage.

Example:
> (union-ptr a-union-val)

#<cpointer+offset>