Gary Byers gb at clozure.com
Wed Nov 29 09:40:25 UTC 2006

I'd vote for skipping the whole thing and using the existing FFI 
infrastructure; I was going to try to explain what DEFTRAP and
DEFTRAP-INLINE were, but I got a bad headache that only went away
when I stopped thinking about them.

(Briefly: on the 68K, instructions consisted of one or more 16-bit
words.  Words whose high nibble was #xA were not defined by the 68K
hardware, and Apple used the illegal instruction exception handler for
these "A-traps" to provide a mechanism to concisely (if slowly) call
into the OS and UI Toolbox.  After about 10 years, (with the move to
the PPC), Apple introduced shared library technology and the old
A-trap mechanism faded into history.  MCL's mechanism for defining the
operand and result type of "traps" was extended to deal with named
foreign functions; even though it's probably been 10 years or so since
anyone has defined a "trap" interface, the mechanisms used to define
foreign functions were never renamed.)

E.g., something like:

(use-interface-dir :gl) ; should define OpenGL/GLU/AGL/CGL/GLUT stuff

(defun glutcreatewindow (name)
   (with-cstrs ((c-name name))
     (#_glutCreateWindow c-name)))

or perhaps

(defun glutcreatewindow (name)
   (with-cstrs ((c-name name))
     (external-call "_glutCreateWindow" :address c-name :int)))

It might be easier to automatically translate into the latter.

What John Wiseman's MCL translation did sort of combined the
two ideas; the construct

(require-trap 'traps::foo ...)

basically caused the read-time effects of reading #_foo to occur
at (IIRC) macroexpand-time.  There isn't anything analogous in
OpenMCL, though there probably should be (even though the need
for the construct is fairly obscure.)  If you have enough information
to generate the EXTERNAL-CALL forms, that approach would avoid
the issue of what happens at read time and what doesn't.

On Tue, 28 Nov 2006, Brent Fulgham wrote:

> The MCL code for the Open Agent Engine (specifically the MCL-translation for 
> Allegro CL forms) makes use of a form called "DEFTRAP-INLINE" (see the 
> attached file for details).  I'm not sure how best to map this to OpenMCL's 
> internals, or if it would be better to skip the whole thing and just use 
> OpenMCL's existing FFI infrastructure.  On the one hand it would be nice to 
> stay as close as possible to the existing code; on the other, it may be more 
> trouble than it's worth.
> The basic idea is (from John Wiseman's comments in his sources):
> ========================================================================
> Example expansion #1:
> (foreign-function glutcreatewindow ((POINTER CHAR)) INT
>                   "glutCreateWindow")
> ==>
>     ((ARG1 :POINTER))
>     :LONG
>     'NIL)
>     (WITH-CSTRS ((#:G2122 ARG1))
> Example expansion #2:
> (foreign-function glclearindex (FLOAT) VOID "glClearIndex")
> ==>
>     ((ARG1 :SINGLE-FLOAT))
>     NIL
>     'NIL)
> ========================================================================
> Thanks,
> -Brent

More information about the Openmcl-devel mailing list