C言語からGaucheを使おう! (8) Scm_LoadFromPortでloadする

こんにちは、鈴木です。

 

「C言語からGaucheを使おう!」シリーズも 8 回目となりました。

前回の「C言語からGaucheを使おう! (7) デバッグ用の道具を準備する」ではデバッグ出力する方法を調べました。

今回は Scm_LoadFromPort 関数で文字列として用意した Scheme プログラムを load する方法を調べます。

 

Scm_LoadFromPort 関数

Scm_LoadFromPort 関数を使用すると、入力ポートから Scheme プログラムをロードすることができます。

今回はリテラルで用意した文字列から文字列ポートを作成し、そこから Scm_LoadFromPort でロードします。

サンプルコードです。

いくつかの関数に分かれていますが、load_from_port 関数の中で、

という Scheme プログラムをロードしています。

そして動作確認として apply_something 関数の中で、

相当の処理を実行しています。

まずは実行結果を見てみましょう。(※「C言語からGaucheを使おう! (1) コンパイル環境を整える」で作成した Makefile を使用します)

出力結果の 1 行目は「(apply sum '((1 2 3)))」の結果、つまり 1, 2, 3 の合計である 6 です。

2 行目は「(apply average '((1 2 3)))」の結果、つまり 1, 2, 3 の平均である 2 です。

 

load_from_port 関数

load_from_port 関数を詳しく見ていきましょう。

まず、source という変数に文字列で準備した Scheme コードを代入しています。

余談ですが、C 言語では連続する文字列リテラルは、ひとつの文字列リテラルに連結されます。つまり、「"a" "b" "c"」は「"abc"」と解釈されます。

次に Scm_MakeInputStringPort 関数を用いて、文字列から入力ポートを作成し、変数 port に代入しています。

そして、Scm_LoadFrmPort で作成した入力ポートから Scheme コードをロードしています。

これで今回やろうとしていた Scheme プログラムのロードは完了です。

 

apply_something 関数

apply_something 関数は動作確認のために作成した関数です。

load_from_port でロードした Scheme プログラムに含まれている手続きを Scm_Apply で呼び出しています。

コメントにも書いていますが、「(apply sum '((1 2 3)))」と「(apply average '((1 2 3)))」相当の処理を実行しています。

 

まとめ

長い道のりでしたが、ひとまず Scheme プログラムをロードして C 言語から呼び出す(値の受け渡しも行う)、ということが達成できました。

 

Comments are closed, but you can leave a trackback: Trackback URL.