Foreign Function Interfaces
Embedding Scheme in C: Chibi (sexp_eval_string), Guile (scm_init_guile, scm_c_eval_string), Gambit, ECL-like approaches in Chez (Sscheme_init).
;; Chez Scheme
(load-shared-object "libc.so.6") ; macOS: "libc.dylib"
(define strlen (foreign-procedure "strlen" (string) size_t))
(strlen "Scheme") ; 6
(define c-abs (foreign-procedure "abs" (int) int))
(c-abs -42) ; 42
;; Guile
(use-modules (system foreign) (system foreign-library))
(define c-strlen
(foreign-library-function #f "strlen" ; #f = the current process (libc)
#:return-type size_t
#:arg-types (list '*)))
(c-strlen (string->pointer "Guile")) ; 5
;; CHICKEN: embed C directly
(import (chicken foreign))
(define c-sqrt (foreign-lambda double "sqrt" double))
(c-sqrt 2.0) ; 1.4142135623730951
(foreign-declare "#include <stdio.h>")
(define say-hi (foreign-lambda* void () "printf(\"Hi from C\\n\");"))
;; Gambit: c-lambda
;; (define c-cos (c-lambda (double) double "cos"))