| 401 |
/* gauche を起動して文字列をロード */ |
/* gauche を起動して文字列をロード */ |
| 402 |
static gchar *load_cstring_by_gauche(gchar *s) { |
static gchar *load_cstring_by_gauche(gchar *s) { |
| 403 |
gchar *msg; |
gchar *msg; |
| 404 |
|
gint result, i; |
| 405 |
g_print("%s\n", s); |
ScmEvalPacket packet; |
|
ScmObj result, error; |
|
| 406 |
/* 入力文字列ポートを開く */ |
/* 入力文字列ポートを開く */ |
| 407 |
ScmObj is = Scm_MakeInputStringPort(SCM_STRING(SCM_MAKE_STR_COPYING(s)), TRUE); |
ScmObj is = Scm_MakeInputStringPort(SCM_STRING(SCM_MAKE_STR_COPYING(s)), TRUE); |
| 408 |
/* 出力文字列ポート開く */ |
/* 出力文字列ポート開く */ |
| 409 |
ScmObj os = Scm_MakeOutputStringPort(TRUE); |
ScmObj os = Scm_MakeOutputStringPort(TRUE); |
| 410 |
|
|
| 411 |
Scm_Define(SCM_MODULE(Shiki_CURRENT_BUFFER_ENV), SCM_SYMBOL(SCM_INTERN("*input*")), is); |
Scm_Define(SCM_MODULE(Shiki_CURRENT_BUFFER_ENV), SCM_SYMBOL(SCM_INTERN("*input*")), is); |
| 412 |
Scm_Define(SCM_MODULE(Shiki_CURRENT_BUFFER_ENV), SCM_SYMBOL(SCM_INTERN("*error*")), SCM_FALSE); |
result = Scm_EvalCString("(load-from-port *input*)", SCM_OBJ(Shiki_CURRENT_BUFFER_ENV), &packet); |
|
/* Scheme のレベルでエラーハンドリングをしつつ,ポートから順番に S 式を読み込み,評価していく.コンパイルエラーなどは *error* に捕捉される */ |
|
|
result = Scm_EvalCString("(guard (e (else (set! *error* e) #f)) (eval (load-from-port *input*) (current-module)))", SCM_OBJ(Shiki_CURRENT_BUFFER_ENV)); |
|
|
|
|
|
error = Scm_GlobalVariableRef(SCM_MODULE(Shiki_CURRENT_BUFFER_ENV), SCM_SYMBOL(SCM_INTERN("*error*")), 0); |
|
| 413 |
|
|
| 414 |
/* 文字列を評価した結果をポートに書き込む */ |
if(result == -1) |
| 415 |
if (!SCM_FALSEP(error)) |
Scm_Write(packet.exception, os, SCM_WRITE_DISPLAY); |
|
Scm_Write(error, os, SCM_WRITE_DISPLAY); |
|
| 416 |
else |
else |
| 417 |
Scm_Write(result, os, SCM_WRITE_DISPLAY); |
for(i = 0; i < packet.numResults; i++) |
| 418 |
|
Scm_Printf(SCM_PORT(os), "%S\n", packet.results[i]); |
| 419 |
|
|
| 420 |
msg = Scm_GetString(SCM_STRING(Scm_GetOutputString(SCM_PORT(os)))); |
msg = Scm_GetString(SCM_STRING(Scm_GetOutputString(SCM_PORT(os)))); |
| 421 |
/* ポート閉じる */ |
/* ポート閉じる */ |