【Lua × JavaScript】Fengariのメモ
TypeScriptを弄っていたはずが、いつの間にか楽しくてFengariを弄っていた(?)ので……調べながら試したことのメモ。
FengariはJavaScriptで実装されたLuaのVMとのこと。
以下は簡単なHello Worldの例
例: index.html
<html> <head> <title>Hello World</title> <script src="fengari-web.js" type="text/javascript"></script> </head> <body> <script type="application/lua"> -- jsをrequire local js = require "js" -- windowを代入 local window = js.global -- window.document.body.innerHTMLを書き換え window.document.body.innerHTML = "Hello World."; </script> </body> </html>
ブラウザで開くと単純に[Hello World.]と表示されるだけのHTML(笑)
[fengari-web.js]自体は事前にダウンロードしてきて同階層に置くのをお忘れなく。
ちなみにこれもまた公式に書いてある情報で、JavaScriptを使うのと同様にluaファイルを別で作成しscriptタグのsrcで指定するようにすることも可能。
もし本格的にこれを使って開発をすることになったら、変数のデバッグが欲しくなるかと。
ただ、JavaScriptのデバッグとLuaのデバッグの両方が必要になって大変かもしれない。
一応、変数の内容確認に使えそうなのが以下の3つで、それぞれ動きが違うのでまとめておく。
- JavaScriptのwindow.console.log()
- JavaScriptのwindow.console.dir()
- Luaのprint()
先に言っておくと単純な文字列や数値の場合は、これら3つに大きな違いはなかった。
問題になるのはobject(table)の場合だ。
例: sample.html
<html> <head> <title>Sample</title> <script src="fengari-web.js" type="text/javascript"></script> </head> <body> <script type="application/javascript"> window.js_val = {"hoge": "fuga"}; </script> <script type="application/lua"> local js = require "js" local window = js.global -- js_val window.console:log(window.js_val) window.console:dir(window.js_val) print(window.js_val) local lua_val = { hoge = "fuga" } -- lua_valの内容確認 window.console:log(lua_val) window.console:dir(lua_val) print(lua_val) </script> </body> </html>
実行結果は次の通り(consoleの内容で、少し見やすいように加工してある)
実行結果
fengari-web.js:8 {hoge: "fuga"} hoge: "fuga" fengari-web.js:8 Object hoge: "fuga" fengari-web.js:8 [object Object] fengari-web.js:8 ƒ table: 0x23 fengari-web.js:8 ƒ n() fengari-web.js:8 table: 0x23
パッとみた感じ、JavaScript由来のオブジェクトについては[console.log()]か[console.dir()]を使うのが良さそう。
逆にLua由来のオブジェクト(table)は、一発でconsoleに出すことは難しいのかもしれない。
【MATLAB】nchoosekによる[組み合わせ]の利用
今回は以前に記事を書いた記事の、MATLAB版。
MATLABで[組み合わせ]の処理実装するためには[nchoosek]を利用するのが一番スマート。
例: Demo1.m
data = ["A", "B", "C", "D", "E"]; patterns = nchoosek(data, 3); [m, ~] = size(patterns); for i = 1: m pattern = patterns(i, :); disp(mat2str(pattern)); end
上記コードを実行すると以下が出力される。
>> Demo1 ["A" "B" "C"] ["A" "B" "D"] ["A" "B" "E"] ["A" "C" "D"] ["A" "C" "E"] ["A" "D" "E"] ["B" "C" "D"] ["B" "C" "E"] ["B" "D" "E"] ["C" "D" "E"]
つまりは[patterns]には[5C3]の組み合わせが、以下のような行列として格納されていることがわかる。
"A" "B" "C" "A" "B" "D" "A" "B" "E" "A" "C" "D" "A" "C" "E" "A" "D" "E" "B" "C" "D" "B" "C" "E" "B" "D" "E" "C" "D" "E"
さらに[「A, A, A, A, B, C」の中から3つ取り出す際にAの重複を排除する]ような場合には、以下の様に[unique()]を使用すると良い。
例: Demo2.m
data = ["A", "A", "A", "A", "B", "C"]; patterns = nchoosek(unique(data), 3); [m, ~] = size(patterns); for i = 1: m pattern = patterns(i, :); disp(mat2str(pattern)); end
上記コードを実行すると以下が出力される。
>> Demo2 ["A" "B" "C"]
ちなみに[組み合わせ]ではなく[順列]を求めたい場合には以下のようにすれば良い。
例: Demo3.m
data = ["A", "B", "C", "D", "E"]; patterns = []; init_patterns = nchoosek(data, 3); [m, ~] = size(init_patterns); for i = 1: m tmp_pattern = perms(init_patterns(i, :)); [n, ~] = size(tmp_pattern); for j = 1: n pattern = tmp_pattern(j, :); disp(mat2str(pattern)); patterns = [patterns; pattern]; end end
上記コードを実行すると以下が出力される。
>> Demo3 ["C" "B" "A"] ["C" "A" "B"] ["B" "C" "A"] ["B" "A" "C"] ["A" "C" "B"] ["A" "B" "C"] ["D" "B" "A"] ["D" "A" "B"] ["B" "D" "A"] ["B" "A" "D"] ["A" "D" "B"] ["A" "B" "D"] ["E" "B" "A"] ["E" "A" "B"] ["B" "E" "A"] ["B" "A" "E"] ["A" "E" "B"] ["A" "B" "E"] ["D" "C" "A"] ["D" "A" "C"] ["C" "D" "A"] ["C" "A" "D"] ["A" "D" "C"] ["A" "C" "D"] ["E" "C" "A"] ["E" "A" "C"] ["C" "E" "A"] ["C" "A" "E"] ["A" "E" "C"] ["A" "C" "E"] ["E" "D" "A"] ["E" "A" "D"] ["D" "E" "A"] ["D" "A" "E"] ["A" "E" "D"] ["A" "D" "E"] ["D" "C" "B"] ["D" "B" "C"] ["C" "D" "B"] ["C" "B" "D"] ["B" "D" "C"] ["B" "C" "D"] ["E" "C" "B"] ["E" "B" "C"] ["C" "E" "B"] ["C" "B" "E"] ["B" "E" "C"] ["B" "C" "E"] ["E" "D" "B"] ["E" "B" "D"] ["D" "E" "B"] ["D" "B" "E"] ["B" "E" "D"] ["B" "D" "E"] ["E" "D" "C"] ["E" "C" "D"] ["D" "E" "C"] ["D" "C" "E"] ["C" "E" "D"] ["C" "D" "E"]
[patterns]には[5P3]の各通りが格納される。
尚、パフォーマンスが気になる場合には[patterns]を拡張するのではなく、予め計算してサイズを確保しておくことをオススメする。