Home > Blockchain >  In Racket's FFI, how do you register a callback that takes a list?
In Racket's FFI, how do you register a callback that takes a list?

Time:05-06

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)))))
  • Related