すいません、ふざけすぎました。
// HSPでevalっぽいの by Tetr@pod
// eval "ソースコード"
// でソースコードを実行します。
// 戻り値が0なら正常終了で、それ以外ならエラーが発生したことを示します。
// 実行時エラーの際戻り値が0になるのは、仕様です。
#ifndef mod_eval
#cmpopt varname 1
#ifndef EVAL_TEMPSOURCE
#define EVAL_TEMPSOURCE "eval_tmp.hsp"
#endif
#ifndef EVAL_TEMPOBJFILE
#define EVAL_TEMPOBJFILE "eval_tmp.ax"
#endif
#ifndef EVAL_TEMPVARFILE
#define EVAL_TEMPVARFILE "eval_tmp.var"
#endif
#module mod_eval
#uselib "hspda.dll"
#func _eval_vsave vsave $202
#func _eval_vload vload $202
#uselib "hspcmp.dll"
#func _eval_hsc_ini hsc_ini 6
#func _eval_hsc_objname hsc_objname 6
#func _eval_hsc_comp "_hsc_comp@16" int, int, int, int
#func _eval_hsc_bye hsc_bye $100
#uselib "hsp3imp.dll"
#func _eval_hspini hspini 0
#func _eval_hspbye hspbye 0
#func _eval_hspprm hspprm 0
#func _eval_hspexec hspexec 0
#deffunc eval str e, local fname, local temp, local s
_eval_vsave EVAL_TEMPVARFILE@
sdim temp
notesel temp
temp = "#cmpopt varname 1\n#uselib \"hspda.dll\"\n#func _eval_vsave vsave $202\n#func _eval_vload vload $202\n#undef end\n#define end(%1=1) if %1{_eval_vsave\"" + EVAL_TEMPVARFILE@ + "\"}end@hsp\n_eval_vload\"" + EVAL_TEMPVARFILE@ + "\"\n" + e + "\nend"
notesave EVAL_TEMPSOURCE@
sdim temp
noteunsel
_eval_hsc_ini EVAL_TEMPSOURCE@
_eval_hsc_objname EVAL_TEMPOBJFILE@
_eval_hsc_comp 0
if stat {
delete EVAL_TEMPSOURCE@
delete EVAL_TEMPVARFILE@
return -1
}
_eval_hsc_bye
delete EVAL_TEMPSOURCE@
fname = EVAL_TEMPOBJFILE@
_eval_hspprm 0, 0, 0, 0
_eval_hspprm $102, 0, 0, varptr(fname)
_eval_hspini $101, ginfo(26), ginfo(27), hwnd
if stat {
delete EVAL_TEMPOBJFILE@
delete EVAL_TEMPVARFILE@
return -2
}
_eval_hspexec
_eval_hspbye
delete EVAL_TEMPOBJFILE@
_eval_vload EVAL_TEMPVARFILE@
delete EVAL_TEMPVARFILE@
return stat
#global
#endif
// #if 0を#if 1にするとサンプルが動きます
#if 0
// 普通のコード
a = "abc"
eval "dialog a : a = 123"
mes "STAT=" + stat
mes a
mes
wait 100
// コンパイルエラーになるコード
eval "error"
mes "STAT=" + stat
mes a
mes
wait 100
// 実行時エラーになるコード
eval "a = 1 / 0"
mes "STAT=" + stat
mes a
mes
#endif
上のコードの #if 0 を #if 1 にするとサンプルが動きます。