在 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)))))