anchor.diff:     #:with-foreign-pointer
      #:%foreign-funcall
      #:%foreign-funcall-pointer
  +   #:%foreign-funcall-varargs
  +   #:%foreign-funcall-pointer-varargs
      #:%foreign-type-alignment
      #:%foreign-type-size
      #:%load-foreign-library
  
positive.code:     (with-unique-names (function)
        `(with-alien ((,function (* (function ,rettype ,@types)) ,ptr))
           (alien-funcall ,function ,@fargs)))))
  
  ;;;# Callbacks
  
  
negative.code: 
  (defun foreign-funcall-type-and-args (args)
    "Return an SB-ALIEN function type for ARGS."
    (let ((return-type 'void)
          types
          fargs)
      (loop while args
            do (let ((type (pop args)))
                 (cond ((eq type '&optional)
                        (push type types))
                       ((not args)
                        (setf return-type (convert-foreign-type type)))
                       (t
                        (push (convert-foreign-type type) types)
                        (push (pop args) fargs)))))
      (values (nreverse types)
              (nreverse fargs)
              return-type)))
  
  (defmacro %%foreign-funcall (name types fargs rettype)
    "Internal guts of %FOREIGN-FUNCALL."
  