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