call_Lua52 似非モジュール(基本Lua呼び出し)

2017-04-21 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
以前(2017-04-14)の記事「call_Lua 似非モジュール」では、
Lua インストール場所にあるlua53.dllを使って、
基本Luaの呼び出しを、ほぼ出来たが最後の最後でアボートした。

それで、
GSL Shell インストール場所にあるlua51.dllを使って、
学習した結果:
前々回(2017-04-17) の記事:
call_Lua 似非モジュール:Lua51 汎用・決定版」の如く、
これは全く正常に出来た。

だが、
この時呼び出したのはLuaJITでした。
そもそもは、基本Luaを呼び出したかった。

そこで、
改めて Lua サイト の、
downloadページに行き
右側中央あたりにある
  Binaries
  If you don't have the time or the inclination to compile Lua yourself,
   get a binary or try the live demo.・・・
リンクをクリックした。

この Lua Binaries
ページの一番下( Notes to ・・・ の上 )
  ・Windows
   See [LuaForge Lua Binaries project] for the most recent versions
    for Windows.
リンク先
の中から、
  [31/Mar/2014]
    ・Lua 5.2.3 - Release 1
     Same configuration as the previous release.
を選んで飛んだ。

そこで、
  「Windows Libraries」→「Dynamic」

つまり、
  「LuaBinaries

の一番上:
  「lua-5.2.3_Win32_dll14_lib.zip」 2015-08-29 付  115.8 kB

をダウンロードした。

この中にある「lua52.dll」 2015-08-29 付 200KB
1つあると良さそう。

だが、この中には、
単独実行したい場合に欲しい「lua.exe」が無い!


そこで、「lua-5.2.3_Win32_bin.zip」と検索してみたら、
真っ先に、「Lua Binaries Download
が見つかる。

この中には lua-5.2.3 は無くて、lua-5.2.4 のみ。

  「lua-5.2.4_Win32_bin.zip」 Windows x86 Executables

を選んでダウンロードした。 267KB

この ZIP の中に、
  「lua52.exe」「lua52.dll」等がある。
   全て 2015-12-14 付

この2つがあれば、基本Lua( Ver. 5.2 ) が使える。


そこで、
call_Lua 似非モジュール:Lua51 汎用・決定版
の「call_Lua51_Gen.gsl」を書き直してみた。


Lua51(JIT)  → Lua52(基本)
----------------------------
lua_pcall  → lua_pcallk
lua_getfield → lua_getglobal

以上の2つの関数を変更して完成した:
----- call_Lua52_Gen.gsl -----
ffi=require'ffi'
---------------------- init_After --------------
F=io.open(arg[0]); w=F:read('*a'); F:close(); fnd=string.find
m='--ini'; _,k=fnd(w,m..'s',1,true); j=fnd(w,m..'e',k,true)
assert(load( string.sub(w,k+2,j-1) ))()
----------- 以下部分が本体 ---------------------
----- 以下 Lua5.2 で実行したいコード群
ST=[[ print('Lua5.2---')
print( 2+5 )
print( os.time() )
SV='ok!'
print( _VERSION)
]]
---------------------- インタフェースデータ
IT=ffi.new('int32_t[6]',1,2,3,4,5,0)
----------------------------

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

z = lua.luaL_loadfilex(L, 'Lua52_Gen.lua', 'bt' )
z = lua.lua_pcallk(L, 0, 0, 0, 0, NULL );

lua.lua_getglobal(L, 'Exec' ); -- 呼び出す関数

lua.lua_pushinteger( L, Int32(voidA(IT)) ) -- 第1引数:lua_Integer

lua.lua_pushstring( L, ST ); -- 第2引数:Lua5.2 での実行文

if (lua.lua_pcallk(L, 2, 1, 0, 0, NULL) ~= 0) then -- 引数 2 個, 戻り値 1 個
printf( nil, 'cannot exec. %s\n', tostring(L)); ----- 中で、実行
os.exit(0)
end
if( lua.lua_isstring(L, -1)) then
SV = lua.lua_tolstring(L, -1, voidA(0)); -- 戻り値
print( ffi.string(SV) ); -- 'OK'~
end
lua.lua_settop(L, -2); -- lua_pop(L,1); 戻り値を pop
lua.lua_close(L)

print( IT[0] )

---------- 以下初期化部分
os.exit(0) ----- これ必須 次の行の1行下の行頭から 初期化部分
--inis
lua = ffi.load( 'lua52' )
ffi.cdef[[ typedef void L_S;
typedef double lua_Number; typedef int32_t lua_Integer;
L_S* luaL_newstate( void );
void luaL_openlibs( L_S* L );

int luaL_loadfilex( L_S* L, const char* filename, const char* mode);
int lua_pcallk( L_S* L, int nargs, int nresults, int errfunc, int ctx, void* k );

void lua_getglobal( L_S* L, const char* name );
void lua_pushinteger(L_S* L, lua_Integer n);
char* lua_pushstring( L_S* L, const char* s);

int lua_isstring( 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 );
]]
Int32 = |s| ffi.cast( 'int32_t', s )
voidA = |s| ffi.cast( 'void*', s )
function printf( f, s, ... )
f = f or io.stdout
f:write(s:format(...))
end
--inie この行の1行上の行末まで



それで、呼び出す Lua52_Gen.lua は:
----- Lua52_Gen.lua -----
function Exec( IT_, ST_ )
IT=IT_; SV='OK'
assert( load( ST_ ) )()
return SV
end
でしょうか。


これで、基本Luaの呼び出しも出来た。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170317
スポンサーサイト
おきてがみ/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
ブックマーク