FFI callback 実装中
int returnCallback(int (*func) (void)) { return func(); }
(let () (define libffitest (open-shared-library "./libffitest.so.1.0")) (define returnCallback (c-function libffitest int returnCallback void*)) (let ([callback (make-c-callback 'int '(void) (lambda () 10))]) (test-true (pointer? callback)) (test-eq 10 (returnCallback callback))))
以上のような簡単な例が動いた。
今回の FFI callback のような「ぱっとは理解できないややこしい仕組み」を実装する場合は、一番簡単な具体例から実装し、抽象化していくと良い。プログラマは具体→抽象が得意なのだから。
と、Kent Beck がTest Driven Developmentで書いてたよ。