%eclent; ]> Aggregate Types Overview Aggregate types are comprised of one or more primitive types. def-enum Defines a &C; enumeration. Macro Syntax def-enum name fields &key separator-string Arguments and Values name A symbol that names the enumeration. fields A list of field defintions. Each definition can be a symbol or a list of two elements. Symbols get assigned a value of the current counter which starts at 0 and increments by 1 for each subsequent symbol. It the field definition is a list, the first position is the symbol and the second position is the value to assign the the symbol. The current counter gets set to 1+ this value. separator-string A string that governs the creation of constants. The default is "#". Description Declares a &C; enumeration. It generates constants with integer values for the elements of the enumeration. The symbols for the these constant values are created by the concatenation of the enumeration name, separator-string, and field symbol. Also creates a foreign type with the name name of type :int. Examples (def-enum abc (:a :b :c)) ;; Creates constants abc#a (1), abc#b (2), abc#c (3) and defines ;; the foreign type "abc" to be :int (def-enum efoo (:e1 (:e2 10) :e3) :separator-string "-") ;; Creates constants efoo-e1 (1), efoo-e2 (10), efoo-e3 (11) and defines ;; the foreign type efoo to be :int Side Effects Creates a :int foreign type, defines constants. Affected by None. Exceptional Situations None. def-struct Defines a &C; structure. Macro Syntax def-struct name &rest fields Arguments and Values name A symbol that names the structure. fields A variable number of field defintions. Each definition is a list consisting of a symbol naming the field followed by its foreign type. Description Declares a structure. A special type is available as a slot in the field. It is a pointer that points to an instance of the parent structure. It's type is :pointer-self. Examples (def-struct foo (a :unsigned-int) (b (* :char)) (c (:array :int 10)) (next :pointer-self)) Side Effects Creates a foreign type. Affected by None. Exceptional Situations None. get-slot-value Retrieves a value from a slot of a structure. Macro Syntax get-slot-value obj type field => value Arguments and Values obj A pointer to foreign structure. type A name of the foreign structure. field A name of the desired field in foreign structure. value The value of the field in the structure. Description Accesses a slot value from a structure. This is generalized and can be used with setf. Examples (get-slot-value foo-ptr 'foo-structure 'field-name) (setf (get-slot-value foo-ptr 'foo-structure 'field-name) 10) Side Effects None. Affected by None. Exceptional Situations None. get-slot-pointer Retrieves a pointer from a slot of a structure. Macro Syntax get-slot-pointer obj type field => pointer Arguments and Values obj A pointer to foreign structure. type A name of the foreign structure. field A name of the desired field in foreign structure. pointer The value of the field in the structure. Description This is similar to get-slot-value. It is used when the value of a slot is a pointer type. Examples (get-slot-pointer foo-ptr 'foo-structure 'my-char-ptr) Side Effects None. Affected by None. Exceptional Situations None. def-array-pointer Defines a pointer to a array of type. Macro Syntax def-array-pointer name type Arguments and Values name A name of the new foreign type. type The foreign type of the array elements. Description Defines a type tat is a pointer to an array of type. Examples (def-array-pointer byte-array-pointer :unsigned-char) Side Effects Defines a new foreign type. Affected by None. Exceptional Situations None. deref-array Deference an array. Macro Syntax deref-array array type position => value Arguments and Values array A foreign array. type The foreign type of the array. position An integer specifying the position to retrieve from the array. value The value stored in the position of the array. Description Dereferences (retrieves) the value of an array element. Examples (def-array-pointer ca :char) (let ((fs (convert-to-foreign-string "ab"))) (values (null-char-p (deref-array fs 'ca 0)) (null-char-p (deref-array fs 'ca 2)))) => &nil; &t; Notes The TYPE argument is ignored for CL implementations other than AllegroCL. If you want to cast a pointer to another type use WITH-CAST-POINTER together with DEREF-POINTER/DEREF-ARRAY. Side Effects None. Affected by None. Exceptional Situations None. def-union Defines a foreign union type. Macro Syntax def-union name &rest fields Arguments and Values name A name of the new union type. fields A list of fields of the union. Description Defines a foreign union type. Examples (def-union test-union (a-char :char) (an-int :int)) (let ((u (allocate-foreign-object 'test-union))) (setf (get-slot-value u 'test-union 'an-int) (+ 65 (* 66 256))) (prog1 (ensure-char-character (get-slot-value u 'test-union 'a-char)) (free-foreign-object u))) => #\A Side Effects Defines a new foreign type. Affected by None. Exceptional Situations None.