HSPには、そのように文字列の式を実行する機能がありません。
よって、「標準命令のみでは」実現不可能です。
ただし、
http://hsp.tv/play/pforum.php?mode=all&num=59875で書いた
拙作のevalっぽいのを使えば、それっぽいのが実現できます。
使用する際は
http://hsp.tv/play/pforum.php?mode=all&num=59837#59877の
NO.59877とNO.59880の注意書きを「必ず」読んでください。
また、EVAL_TEMPSOURCEやEVAL_TEMPOBJFILE、EVAL_TEMPVARFILEを定義すると
一時ファイルの名前や場所を変更できます。
とりあえず、サンプルのソースコードです。
// 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
_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 $1, 640, 480, 0
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
notesel test
noteload "test.txt"
noteget test, 0
eval test// testをeval testに変更する
使用する際は、
test ;ここ!!
を
eval test
に変更する必要があります。
(上のサンプルソースではすでに変更してあります)
あと、1つだけ重要な事を。
このような任意のソースコードが実行できる状態は、危険です。
ソースコードがネット上の第三者によって変更されるものでないなら
せいぜいプログラムの変数の読み書きがされる程度ですが、
サーバーからダウンロードする等の場合は、悪意ある第三者によって
ユーザーのコンピュータの
1. 諸々が破壊される
2. データが盗まれる
3. 操作権を得られる
といったことが起こりかねないので、よく注意しておいてください。