Next: Loading Shared Object Files, Previous: Foreign Variables, Up: Foreign Function Interface

### 8.5 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))