在 Racket 的 FFI 中,如何注册一个接受列表的回调?
In Racket's FFI, how do you register a callback that takes a list?
我需要在 Racket 的 FFI 中定义一个接受回调的函数:
(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)
我希望能够根据 len
定义 elems
,也就是说,我可以这样写:
(registerCallback (lambda (xs) stuff))
这是如何实现的?
此外,我编写的代码给出了错误:
length: contract violation
expected: list?
given: #<cpointer>
我想这是因为 elems
无法列出。我该怎么办?
我最终采用了蛮力但有效的手动创建包装函数的解决方案:
(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)))))
我需要在 Racket 的 FFI 中定义一个接受回调的函数:
(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)
我希望能够根据 len
定义 elems
,也就是说,我可以这样写:
(registerCallback (lambda (xs) stuff))
这是如何实现的?
此外,我编写的代码给出了错误:
length: contract violation
expected: list?
given: #<cpointer>
我想这是因为 elems
无法列出。我该怎么办?
我最终采用了蛮力但有效的手动创建包装函数的解决方案:
(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)))))