SBCL User Manual
Prev | Chapter 5. The Foreign Function Interface | Next

# Foreign Data Structure Examples

Now that we have alien types, operations and variables, we can manipulate foreign data structures. This C declaration

    struct foo {
        int a;
        struct foo *b[100];
    };

can be translated into the following alien type:

    (define-alien-type nil
      (struct foo
        (a int)
        (b (array (* (struct foo)) 100))))

Once the `foo` alien type has been defined as above, the C expression

    struct foo f;
    f.b[7].a

can be translated in this way:

    (with-alien ((f (struct foo)))
      (slot (deref (slot f 'b) 7) 'a)
      ;;
      ;; Do something with f...
      )

Or consider this example of an external C variable and some accesses:

    struct c_struct {
            short x, y;
            char a, b;
            int z;
            c_struct *n;
    };
    extern struct c_struct *my_struct;
    my_struct->x++;
    my_struct->a = 5;
    my_struct = my_struct->n;

which can be manipulated in Lisp like this:

    (define-alien-type nil
      (struct c-struct
              (x short)
              (y short)
              (a char)
              (b char)
              (z int)
              (n (* c-struct))))
    (define-alien-variable "my_struct" (* c-struct))
    (incf (slot my-struct 'x))
    (setf (slot my-struct 'a) 5)
    (setq my-struct (slot my-struct 'n))

Prev | Home | Next
Foreign Variables | Up | Loading Unix Object Files