I need to define a function in Racket's FFI that takes a callback:
(define-ffi-definer define-lib (ffi-lib "libLib"))
(define callback
(_fun [len : _int]
[elems : (_list i _int)] -> _void))
(define-lib registerCallback
(_fun callback -> _void)
#:c-id registerCallback)
I want to be able to define elems
in terms of len
, that is, so I can write:
(registerCallback (lambda (xs) stuff))
How is this accomplished?
Furthermore, my code as written gives the error:
length: contract violation
expected: list?
given: #<cpointer>
I presume this is because elems
can't be listified. What do I do?
CodePudding user response:
I wound up going with the brute force but effective solution of manually creating a wrapper function:
(define callback
(_fun [len : _int]
[elems : _pointer] -> _void))
(define-lib registerCallback-raw
(_fun callback -> _void)
#:c-id registerCallback)
(define (registerCallback callback)
(registerCallback-raw
(lambda (len elems)
(let ((elems (cblock->list elems _int len)))
(callback elems)))))