On 17/03/2012 11:01, Luís Oliveira wrote:
At the end of gl/bindings.lisp there's an alternative implementation of DEFGLEXTFUN that doesn't call compile or redefine anything. Does that work better for you?
I tried this version:
(defmacro defglextfun ((cname lname) return-type &body args) (alexandria:with-unique-names (pointer) `(let ((,pointer (null-pointer))) (defun ,lname ,(mapcar #'car args) (when (null-pointer-p ,pointer) (setf ,pointer (gl-get-proc-address ,cname)) (assert (not (null-pointer-p ,pointer)) () "Couldn't load symbol ~A~%" ,cname) (format t "Loaded function pointer for ~A: ~A~%" ,cname ,pointer) (push (lambda () (setf ,pointer (null-pointer))) *gl-extension-resetter-list*)) (foreign-funcall-pointer ,pointer (:library opengl) ,@(loop for arg in args collect (second arg) collect (first arg)) ,return-type)))))
However, compilation of gl/funcs.lisp fails due to heap exhaustion (using SBCL 1.0.55).