[Openmcl-devel] A (stupid?) question

Hamilton Link helink at sandia.gov
Thu Jul 31 16:33:26 PDT 2003


GLUT is a good example, it's a framework full of callbacks for 
everything from drawing the main scene to handling mouse clicks.

On Thursday, July 31, 2003, at 04:30 PM, Gary Byers wrote:

>
>
> On Thu, 31 Jul 2003, Jubal wrote:
>
>> I was looking at the documentation for the OpenMCL foreign function
>> interface and was intrigued by the defcallback macro. I understand (I
>> think) what is does, but I am confused as to how one takes advantage 
>> of
>> this functionality. Specifially, how does one write C code that takes
>> advantage of the callback defined by defcallback. Say, (for a really
>> silly example) I wanted to do the following:
>>
>> (defcallback exchange (:single-float dollars :single-float rate
>> :single-float)
>> 	(* dollars rate))
>>
>> How would I then write a C program to call that function?
>>
>
> One example of a (fairly) well-known C function that takes a function
> as an argument is qsort, whose prototype is something like:
>
>      void
>      qsort(void *base, size_t nmemb, size_t size,
>              int (*compar)(const void *, const void *));
>
> As is clearly obvious to anyone with the intuitive ability to parse
> C function prototypes ... uh, I'd sort of guess that qsort's 4th 
> argument
> is supposed to be a function that takes two pointers as arguments and
> returns an int.
>
> (defcallback sort-char-pointers-for-qsort (:address pointer-a
>                                            :address pointer-b
>                                            :signed-fullword)
>
>   ;; If we read the qsort man page, we'll eventually discover that
>   ;; we're supposed to return a negative value if the thing pointer-a
>   ;; points to is less than the thing pointer-b points to, 0 if they're
>   ;; equal, and a positive value otherwise.
>
>   (let* ((thing-a (pref pointer-a :unsigned-byte))
>          (thing-b (pref pointer-b :unsigned-byte)))
>      (if (< thing-a thing-b)
>        -1
>        (if (= thing-a thing-b)
>          0
>          1))))
>
> (defun sort-string-the-hard-way (string)
>   (with-cstrs ((cstring string))
>     (#_qsort cstring (length string) 1 sort-char-pointers-for-qsort)
>     (%get-cstring cstring)))
>
> That's a case where we pass a C-callable function pointer to a function
> that we're calling.  A given C library might provide an interface where
> function pointers are to be stored in global memory locations, or 
> passed
> as arguments to initialization functions, or follow some other 
> convention.
> A function pointer defined by DEFCALLBACK obviously does need to be 
> passed
> to the foreign code that's going to call it -somehow-; the mechanism 
> that's
> used is generally defined by the caller (the C library or function that
> needs/uses the function pointer.)
>
>
>> Or am I completely missing the point?
>
> Not really.  qsort's the only example of a callback function that I can
> think of in the standard C library.  Some other C libraries (windowing
> toolkits, for example) make heavy uses of the mechanism.  It generally
> doesn't make sense to talk about passing callback functions around 
> unless
> there's some convention for their use;  DEFCALLBACK provides a way to
> define those functions when they're required, but doesn't define the
> conventions by which they're used.
>
>>
>>
>> --Paul
>>
>>
>> _______________________________________________
>> Openmcl-devel mailing list
>> Openmcl-devel at clozure.com
>> http://clozure.com/cgi-bin/mailman/listinfo/openmcl-devel
>>
>>
>
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/cgi-bin/mailman/listinfo/openmcl-devel
>



_______________________________________________
Openmcl-devel mailing list
Openmcl-devel at clozure.com
http://clozure.com/cgi-bin/mailman/listinfo/openmcl-devel



More information about the Openmcl-devel mailing list