■
CHICKENというSchemeの処理系があって、SchemeコードをCのコードに変換したり、Cコンパイラを使って実行ファイルを生成してくれる。この処理系を使って、CからSchemeを呼ぶコードを書きたい。
(マニュアルを見ながら今日書き始めたばかりなので、あちこち間違ってるかも)
bind.scm
(define-external (average (int num1) (int num2)) int (/ (+ num1 num2) 2)) (define-external (str_len (c-string str)) int (string-length str))
define-externalは、処理系独自の構文で、
(define-external (関数名 (引数の型 引数名) ... ) 返り値の型 関数本体)
こんな風に書いて、Cから呼べる関数を定義する。
こうしてから、
main.c
#include <stdio.h> #include "chicken.h" extern int average(int, int); extern int str_len(char*); int main(int argc, char* argv[]) { int ave; int len; CHICKEN_run(CHICKEN_default_top); ave = average(2, 4); printf("%d\n", ave); len = str_len("test"); printf("%d\n", len); return 0; }
などと書いてコンパイルする。
csc bind.scm main.c -e ./bind
すると、CからScheme(をCにコンパイルしたもの)が呼べるはずなのだけど、
3 Segmentation fault
になる。原因がわからない。文字列を使おうとするとダメっぽい。