こんにちは、鈴木です。
「C言語からGaucheを使おう!」シリーズです。
前回の「C言語からGaucheを使おう! (4) Scm_EvalCStringでevalする」では C 文字列を eval する方法を調べました。
今回は Scm_Eval で eval する方法、つまり Gauche API で組み立てた S 式を eval する方法を調べます。
Scm_Eval 関数
前回同様、以下の Scheme プログラム相当の処理を行いたいと思います。
1 |
(eval '(+ 10 20) (interaction-environment)) |
サンプルコードを書いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <stdio.h> #include <gauche.h> int main() { ScmObj expression; ScmEvalPacket eval_packet; GC_INIT(); Scm_Init(GAUCHE_SIGNATURE); expression = SCM_LIST3(SCM_INTERN("+"), SCM_MAKE_INT(10), SCM_MAKE_INT(20)); if(Scm_Eval(expression, SCM_OBJ(Scm_UserModule()), &eval_packet) < 0) { printf("[%s] %s\n", SCM_STRING_CONST_CSTRING(Scm_ConditionTypeName(eval_packet.exception)), SCM_STRING_CONST_CSTRING(Scm_ConditionMessage(eval_packet.exception))); } else { printf("%ld\n", SCM_INT_VALUE(eval_packet.results[0])); } return 0; } |
ポイントは expression という変数を初期化している部分です。
SCM_INTERN("+") で取得したシンボルと、SCM_MAKE_INT(10) と SCM_MAKE_INT(20) からなるリストを作成しています。
これが eval する S 式になります。
他の部分は前回とほとんど同じで、Scm_EvalCString の代わりに Scm_Eval を呼び出しています。
エラー処理は評価結果の取得方法は前回の Scm_EvalCString の場合と同じです。
実行すると以下の出力が得られます。(※「C言語からGaucheを使おう! (1) コンパイル環境を整える」で作成した Makefile を使用します)
1 2 |
> make run 30 |
まとめ
どこまで続けられるか心配しながら「C言語からGaucheを使おう!」シリーズを書いているのですが、今回は比較的楽に調べることが出来ました。
今回のポイントは SCM_INTERN() でシンボルを取得する部分でした(他は Scm_EvalCString と同じでした)。
Comments
expressionへの代入はScm_Initの後にする必要があるのではないでしょうか?
ご指摘ありがとうございます!
間違えていましたので、本文を修正しました。