call_Lua 似非モジュール:Lua プログラム汎用化

2017-04-16 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-04-15)の記事「call_Lua 似非モジュール:Lua51.dll 利用版」で、
GSL Shell インストール場所にあるLua51.dllを使った。

今回は、
呼び出す Lua 関数を汎用的なものとした。
その為には、文字列データの受け渡しをどうするか?

これまでの参考資料を、更に学習し出来た様ダ。


先ず、呼び出す Lua プログラムは:
----- fun_eval.lua -----
function EVAL( arg1 )
assert( load( arg1 ) )()
return 'OK'
end
と、
引数1つで文字列と想定。
戻り値も1つで、文字列。

これを利用する、GSL Shell プログラム ( = call_Lua 似非モジュール ):
----- call_Lua_Gen.gsl -----
lua = ffi.load( 'lua51' )
ffi.cdef[[ typedef void L_S;
typedef double lua_Number; typedef int32_t lua_Integer;
L_S* luaL_newstate( void );
int lua_gettop( L_S* L );
int lua_type( L_S* L, int index );
void luaL_openlibs( L_S* L );

int luaL_loadfilex( L_S* L, const char* filename, const char* mode);
int lua_pcall( L_S* L, int nargs, int nresults, int msgh );
void lua_getglobal( L_S* L, const char* name );

void lua_getfield( L_S* L, int i , const char* name );
void lua_pushnumber( L_S* L, lua_Number n );
char* lua_pushstring( L_S* L, const char* s);

int lua_isstring( L_S* L, int index );
int lua_isnumber( L_S* L, int index );
lua_Integer lua_tointeger( L_S* L, int idx );
// char* lua_tostring( L_S* L, int index ); // これは無し?
char* lua_tolstring( L_S* L, int index, size_t* len );
void lua_settop( L_S* L, int m ); // m == -(n) - 1
void lua_close( L_S* L );
]]
charA = |s| ffi.cast( 'char*', s )
voidA = |s| ffi.cast( 'void*', s ); NULL=voidA(0)
function printf( f, s, ... )
f = f or io.stdout
f:write(s:format(...))
end
---------------------------------------
----- Lua5.1 で実行したいコード群
sss=[[ print( 'Lua5.1---' )
print( math.sin(1) )
t=require'time'; print( t.time() )
]]
---------------------------------------

L = lua.luaL_newstate()
lua.luaL_openlibs(L)

z = lua.luaL_loadfilex(L, 'fun_eval.lua', charA(0))
z = lua.lua_pcall(L, 0, 0, 0 ); -- script を1度実行

lua.lua_getfield( L, -10002, 'EVAL' ); -- 呼び出す関数

lua.lua_pushstring(L, sss ); -- 引数:Lua5.1 での実行コード

if (lua.lua_pcall(L, 1, 1, 0) ~= 0) then -- 引数 1 個, 戻り値 1 個
printf( nil, 'cannot exec. %s\n', tostring(L)); ----- 中で、実行
os.exit(0)
end
if( lua.lua_isstring(L, -1)) then
ret = lua.lua_tolstring(L, -1, NULL); -- 戻り値
print( ffi.string(ret) ); -- 'OK'
end
lua.lua_settop(L, -2); -- lua_pop(L,1); 戻り値を pop
lua.lua_close(L)
これで、
取り敢えず、文字列 sss を実行する事ができる。


ここで、
いろいろ試行錯誤していて、・・・・・

このlua51.dllを使うと、
LuaJIT で使えるFFIが使える事が分かった。

つまり、
上記の文字列 sss を、例えば:
ss1 = [[   print('Lua5.1---')
ffi = require'ffi'
ffi.cdef[[ int rand(void);
double sqrt(double);
]]

ss2 = [[
print( ffi.C.rand() ) -- 乱数生成
print( ffi.C.rand() ) -- 乱数生成
print( ffi.C.sqrt(3.0) ) -- 平方根算出
require'lfs'; print( lfs.currentdir() )
t=require'time'; print(t.time())
]]

sss = ss1..']]'..ss2
の様なものにすることも出来た。


本日はここまで。


call_Lua 似非モジュール 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170314
スポンサーサイト
おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク