Inline C is an idea taken from Lush - namely, the ability to just switch over to C when anything is slow or awkward in plain LISP. This is particularly useful when using outside libraries, because no LISP bindings are necessary.
(defun symm-eigenvals (matrix)
"Use GSL and BLAS to find the eigenvalues of a symmetric matrix
Usage: (symm-eigenvals
(make-array 4 :initial-contents '(1d0 2d0 2d0 1d0)
:element-type 'double-float))
==> #(3.0000000000000004d0 -1.0000000000000002d0)
"
(declare (type (simple-array double-float (*)) matrix))
(let* ((n^2 (length matrix))
(n-r (multiple-value-list (floor (sqrt n^2))))
(n (if (zerop (cadr n-r)) (car n-r) (error "matrix isn't square")))
(eivals (make-array n :element-type 'double-float)))
(cin:cinline ((double* matrix) (uint n) (double* eivals))
"""
#include <gsl/gsl_math.h>
#include <gsl/gsl_eigen.h>
"""
"""
gsl_matrix_view m = gsl_matrix_view_array ($matrix, $n, $n);
gsl_vector_view o = gsl_vector_view_array ($eivals, $n);
gsl_eigen_symm_workspace *w = gsl_eigen_symm_alloc ($n);
gsl_eigen_symm (&m.matrix, &o.vector, w);
gsl_eigen_symm_free (w);
"""
("gsl" "blas"))
eivals))
Right now, Inline C is only implemented for CMUCL and SBCL. UFFI was my first choice, but it doesn't give you access to the data pointer in a vector.
Future Direction
Back to Common-lisp.net.