next up previous contents
Next: The def-alien-routine Macro Up: 8.7 Alien Function Calls Previous: 8.7 Alien Function Calls

The alien-funcall Primitive

[Function]
alien: alien-funcall alien-function &rest arguments

This function is the foreign function call primitive: alien-function is called with the supplied arguments and its value is returned. The alien-function is an arbitrary run-time expression; to call a constant function, use  extern-alien (page gif) or def-alien-routine.

The type of alien-function must be (alien (function ...)) or (alien (* (function ...))), See section 8.2.3. The function type is used to determine how to call the function (as through it was declared with a prototype.) The type need not be known at compile time, but only known-type calls are efficiently compiled. Limitations:

Here is an example which allocates a (struct foo), calls a foreign function to initialize it, then returns a Lisp vector of all the (* (struct foo)) objects filled in by the foreign call:

;;
;; Allocate a foo on the stack.
(with-alien ((f (struct foo)))
  ;;
  ;; Call some C function to fill in foo fields.
  (alien-funcall (extern-alien "mangle_foo" (function void (* foo)))
                 (addr f))
  ;;
  ;; Find how many foos to use by getting the A field.
  (let* ((num (slot f 'a))
         (result (make-array num)))
    ;;
    ;; Get a pointer to the array so that we don't have to keep extracting it:
    (with-alien ((a (* (array (* (struct foo)) 100)) (addr (slot f 'b))))
      ;;
      ;; Loop over the first N elements and stash them in the result vector.
      (dotimes (i num)
        (setf (svref result i) (deref (deref a) i)))
      result)))


Raymond Toy
Mon Jul 14 09:11:27 EDT 1997