■ このスレッドは過去ログ倉庫に格納されています
【Lua】組み込み系言語総合 その6【Squirrel】
- 1 :デフォルトの名無しさん:2013/03/10(日) 15:10:32.28 .net
- LuaやSquirrelやAngelScriptなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです
まとめwiki(なにか質問する前に必ずみること!)
http://wikiwiki.jp/lua/
その他の参考URLは>2から
■前スレ
【Lua】組み込み系言語総合 その5【Squirrel】
http://toro.2ch.net/test/read.cgi/tech/1321063450/
■過去スレ
その4 http://hibari.2ch.net/test/read.cgi/tech/1301414458/
その3 http://hibari.2ch.net/test/read.cgi/tech/1272643397/
その2 http://pc12.2ch.net/test/read.cgi/tech/1243210301/
その1 http://pc12.2ch.net/test/read.cgi/tech/1205208141/
プログラミング言語 Lua
その3 http://pc11.2ch.net/test/read.cgi/tech/1160799232/
- 954 :デフォルトの名無しさん:2016/07/19(火) 21:09:20.86 ID:5Ru68Qww.net
- require("hoge");
func=function()end;
と
hoge={
func=function()end
};
の違いって何ですか?
- 955 :デフォルトの名無しさん:2016/07/19(火) 22:10:30.90 ID:Uci7C8fw.net
- 言語が書かれてないけどLuaということにして話を進めると
上
hogeというモジュールを読み込む
funcというグローバル変数に何もしない関数を代入する
下
funcという何もしない関数をもつテーブルを作成しhogeというグローバル変数に代入する
- 956 :デフォルトの名無しさん:2016/07/19(火) 22:35:55.44 ID:5Ru68Qww.net
- つまりモジュールが読み込まれると、
func=function()end;
hoge={func=func};
をするって事?
- 957 :デフォルトの名無しさん:2016/07/19(火) 22:51:15.91 ID:Uci7C8fw.net
- require(’module_name’)としたとき何を行うかはその読み込んだモジュールしだい
最近のものはグローバル環境を汚すのを嫌って勝手に代入せずテーブルを返すのが推奨されているから
module=require(’modname’)
って書く
- 958 :デフォルトの名無しさん:2016/07/19(火) 22:54:48.00 ID:5Ru68Qww.net
- >>957
何となく分かった気がする
ありがとう
- 959 :デフォルトの名無しさん:2016/08/02(火) 15:28:41.79 ID:vpqNpIG1.net
- 継承って
local self=BaseClass.new();
self.hoge=0;
return setmetatable( self, { __index = Class } );
でいいんでしょうか?
色々な方法が書いてあってどれをすればいいか分かりません
- 960 :デフォルトの名無しさん:2016/08/02(火) 21:42:21.39 ID:rXn2IC8I.net
- >>959
色々な方法があるから、使うフレームワークが推奨する方式に従うべき
特にそういう縛りがなければ自分で考えてみてもいいが
汎用性が高いのはJavaScriptと同じ方式だとは思う
- 961 :デフォルトの名無しさん:2016/08/02(火) 22:00:37.77 ID:qJ2YHFft.net
- その色々な方法ごとに新しい言語を作るのが普通
一つの言語で色々やってるのは珍しいが効率は良い
- 962 :デフォルトの名無しさん:2016/08/03(水) 08:06:53.16 ID:8fjgpLNn.net
- 効率は悪いだろう? 開発者間で連携もしづらい
まぁLuaだと組み込み環境ごとに全く別の言語だと思ったほうが良いんだろうけど
- 963 :デフォルトの名無しさん:2016/08/04(木) 09:23:50.33 ID:Mm46IUtm.net
- https://www.lua.org/pil/16.2.html
本家に書いてあるやん
- 964 :デフォルトの名無しさん:2016/08/04(木) 20:01:15.52 ID:aMt1KCpE.net
- >>963
お手本を作ってクローンさせる方式だね
一般的なクラスとインスタンス方式にこだわりがなければLuaらしいやり方だ
- 965 :デフォルトの名無しさん:2016/08/05(金) 22:47:51.66 ID:K6ts8EaK.net
- 継承のやり方は分かりました
ありがとうございます
もう一つあるんですが、動的に引数を指定したり複数の戻り値を返したりすることは出来ますか?
hoge(1,2,3)と通常は呼び出す物をhoge({1,2,3})と呼び出したり、
return 1,2,3;
を
return {1,2,3}
のように配列を使って動的に指定したいです
- 966 :デフォルトの名無しさん:2016/08/05(金) 23:10:53.81 ID:K6ts8EaK.net
- unpackで出来ました
すみません
- 967 :デフォルトの名無しさん:2016/08/26(金) 15:28:57.81 ID:BDiBxktH.net
- luaL_requiref(L, ...)
の次にlua_pop(L, 1) を入れるのはなぜですか?
- 968 :デフォルトの名無しさん:2016/08/26(金) 17:19:18.70 ID:LCNVy+4G.net
- >>967
luaL_requirefはロードしたモジュールをスタックに残すから
それをスタックから取り除いている
LuaのC APIはスタックを意識する必要がある
マニュアルにある [-0, +1, e] のような箇所で説明されている
- 969 :デフォルトの名無しさん:2016/08/28(日) 07:51:02.13 ID:O603KyWm.net
- >>968
ありがとうございます。
スタックから取り除いても大丈夫(モジュールは使える)ということなのでしょうか?
もしそうならスタックに積まれるのはなぜなのですか?
- 970 :デフォルトの名無しさん:2016/08/28(日) 14:07:28.83 ID:A/8rNEYu.net
- >>969
Luaの疑似コードだと
local m = require("module")
m = nil
のような動作だと考えてくれ。
moduleが何かを返すタイプならスタックに積まれた m を使うことになるだろうし
グローバル変数を追加するタイプなら取り除いても(グローバル経由で)使えるだろう。
- 971 :デフォルトの名無しさん:2016/08/29(月) 18:22:57.78 ID:9ixLGi86.net
- >>970
よく分かりました。ありがとうございました。
- 972 :デフォルトの名無しさん:2016/09/08(木) 18:19:09.71 ID:GHpvw+VU.net
- 少しスレタイとは離れるかもしれないんだけど、開発環境について教えて欲しい
今まではメモ帳(付属のじゃないよ)だけで一つか複数のファイル開いてシコシコ書いてたんだけど、
数百から千くらいのファイル群のゲームの解析というか関数なんかの検索に、メモ帳では太刀打ちできなくて困ってます
出来たら沢山開けるメモ帳的な簡易的な物が良いんだけど、OSにインスコして、関連付けもしてくれちゃって・・・っていうのはむしろ要らない、アーカイブ展開したらすぐ使えるのがいいです
よろしくお願いします。
- 973 :デフォルトの名無しさん:2016/09/08(木) 18:46:36.03 ID:2gFs3OWY.net
- VSCodeおすすめ
OS非依存だからwin以外でも使える
- 974 :デフォルトの名無しさん:2016/09/08(木) 19:45:27.86 ID:oP5NpzJh.net
- Atom.io
- 975 :デフォルトの名無しさん:2016/09/08(木) 21:07:48.97 ID:GHpvw+VU.net
- 即レスありがとうございます。試してみます
- 976 :デフォルトの名無しさん:2016/09/09(金) 21:43:20.24 ID:++lP9HIx.net
- Luaで書かれたPHPインタプリタってないかな
- 977 :デフォルトの名無しさん:2016/09/10(土) 00:03:26.44 ID:mCfQwN8m.net
- なんでそんな無駄なことするの
- 978 :デフォルトの名無しさん:2016/09/10(土) 01:31:15.83 ID:1lwBEIiL.net
- >>977
FlashAirでPHPを実行できないかなーとか考えた
- 979 :デフォルトの名無しさん:2016/09/10(土) 06:33:19.86 ID:URrhv4S0.net
- ライブラリの比重が大きな言語に対して構文解釈だけができても嬉しくない
- 980 :デフォルトの名無しさん:2016/09/10(土) 09:08:02.15 ID:CKZv9HiE.net
- あってもFlashAirは内部メモリが小さいから無理っぽい
- 981 :デフォルトの名無しさん:2016/09/10(土) 10:14:04.84 ID:32Nzsdc+.net
- FlashAirってLua動かせるのかよ
- 982 :デフォルトの名無しさん:2016/09/10(土) 13:14:30.12 ID:1lwBEIiL.net
- >>980
そうか、残念
>>981
最新モデルのW-03のみだけどLuaインタプリタを内蔵している
FlashAir Developers - APIガイド - Lua機能
ttps://flashair-developers.com/ja/documents/api/lua/
FlashAirのプログラミングにも使えるしCGIとしても使える
- 983 :デフォルトの名無しさん:2016/09/10(土) 13:27:13.60 ID:32Nzsdc+.net
- >>982
ただのPCに転送できるSDカードと思ってたわ
よくあのサイズで内臓出来たな…技術凄い
- 984 :デフォルトの名無しさん:2016/09/10(土) 13:51:44.59 ID:1lwBEIiL.net
- >>983
興味があるなら>>982のWebサイトのドキュメント→本の中にあるFlashAir Doujinshi 2を読んでみると良いよ
電子工作メイン(FlashAirのプログラミング)だけど裏話の他Luaによるプログラミング例がいくつか載っている
- 985 :デフォルトの名無しさん:2016/09/10(土) 14:08:02.65 ID:32Nzsdc+.net
- コルーチン使えないのか
ゲームじゃないからなくてもいいだろうけど
- 986 :デフォルトの名無しさん:2016/09/10(土) 21:52:55.71 ID:URrhv4S0.net
- Luaのコルーチンってそんなにメモリ喰うイメージないけどな
変数空間を共有してるから増分はコールスタック程度しかないはずだが
- 987 :デフォルトの名無しさん:2016/09/10(土) 22:08:42.97 ID:IwLF9FUl.net
- C#の場合はコンパイル時に普通のクラスになるけどLuaはコルーチンをVMが対応しているん?
- 988 :デフォルトの名無しさん:2016/09/10(土) 22:55:58.05 ID:URrhv4S0.net
- C#とは違うね。Lua VMはコルーチンを動かす処理そのものだから
メインスレッド = グローバル変数テーブル + コルーチン でできてる
- 989 :デフォルトの名無しさん:2016/09/10(土) 23:32:04.82 ID:IwLF9FUl.net
- >>988
糖衣構文ではなかったのか
何故かコルーチン関係がキーワードじゃなくてメソッドだし
- 990 :デフォルトの名無しさん:2016/09/20(火) 23:56:31.17 ID:8JrnwUlq.net
- LuaでOO的なコーディングをする場合にメソッド内でローカル変数って使えないんですかね?
>type test.lua
CLASS = {
new = function()
x = 0
return setmetatable({}, {__index = CLASS})
end,
func1 = function()
print(x)
end
}
obj = CLASS.new()
obj.func1()
この場合のxはインスタンス変数ですよね?
>luajit test.lua
0
- 991 :デフォルトの名無しさん:2016/09/21(水) 07:08:55.54 ID:8q78VamI.net
- >>990
その書き方だとグローバル変数の x を見にいってる
Luaはselfを省略できないから
{ ..., func1 = function(self) print(self.x) end }
にするか、もしくは { } の外で : を使う
function CLASS:func1() print(self.x) end
ところで次スレも同じタイトルでいいの?
LuaはともかくSquirrelは今や…
- 992 :デフォルトの名無しさん:2016/09/21(水) 18:50:26.73 ID:eYdYUvGQ.net
- じゃあmrubyで
- 993 :987:2016/09/22(木) 03:54:45.83 ID:Ru9TIBDm.net
- >>991
Luaのデフォルトのスコープはグローバルなんか・・・
というかこの統一性がない仕様はすっきりしないなぁ
string.to_number_ulong = function(self) ←これは意図したとおりに使える
〜
end
number.to_binary_ulong = function(self) ←これはnumberが無いと怒られて動かない
〜
end
5.1だとビット演算がないからこのような変換も手間だし
- 994 :デフォルトの名無しさん:2016/09/22(木) 06:26:50.65 ID:t8yALPnl.net
- >>993
その例から「意図」が読み取れないから何とも言えない
統一性がない仕様もなにも、自分で定義している関数に不満を漏らす意味がわからない
>>990 も CLASS = { ... } はあくまで連想配列の定義だから
連想配列要素の定義中に兄弟要素の変数を参照しないのは言語に限らず当たり前だぞ
- 995 :デフォルトの名無しさん:2016/09/22(木) 13:55:49.27 ID:62PEa5hX.net
- 5.1はdoubleとintを使い分けるよりintを捨てた方が統一性があると判断したんだな
だからビット演算がない
同様に、連想配列とオブジェクトを統一するためオブジェクトを捨てる
でも連想配列とdoubleのどっちかを捨てるのは無理だからそこは統一性がない
- 996 :デフォルトの名無しさん:2016/09/22(木) 14:25:23.06 ID:t8yALPnl.net
- 意味がわからん
ビット演算は5.3で採用されたし、doubleとintはスクリプトからは意識されない
連想配列と統一するために捨てたオブジェクトとは何のことだ?
連想配列とdoubleの統一性のなさとは何だ?メタテーブルがあり演算子の定義もできるのに
- 997 :デフォルトの名無しさん:2016/09/22(木) 14:41:12.52 ID:62PEa5hX.net
- ほんとオブジェクトって何のことだろうね
意味がわからんから捨てる
- 998 :987:2016/09/22(木) 14:44:50.84 ID:Ru9TIBDm.net
- >>994
判りにくくてスマン。number.to_binary_ulongは定義自体が出来ないです
>type test.lua
string.to_number_ulong = function(self) --←これは定義できる
--(略)4バイトの文字列をunsigned longに変換するコード
end
number.to_binary_ulong = function(self) --←これは定義できない
--(略)unsigned longを4バイトの文字列に変換するコード
end
s = "\226\167\100\53"
print(s:to_number_ulong()) --バイナリ文字列を数字に変換(意図した動作)
n = 895789026
print(n:to_binary_ulong()) --こんな感じで使いたい。数字をバイナリ文字列に変換
>luajit test.lua
luajit: test.lua:4: attempt to index global 'number' (a nil value)
stack traceback:
test02.lua:4: in main chunk
[C]: at 0x004020e0
リファレンスマニュアルがショボいためにググってばっかりで捗らん・・・
- 999 :デフォルトの名無しさん:2016/09/22(木) 15:27:10.87 ID:62PEa5hX.net
- 歴史的に、演算子といえばnumberの演算子しかなかった
昔の言語にはstringの演算子がなかったからstringには関数が必要
numberにはあまり必要なかった
その影響で string.* という関数は色々あるが number.* は一個もない
- 1000 :デフォルトの名無しさん:2016/09/22(木) 15:31:44.15 ID:t8yALPnl.net
- >>998
ああそういう意味か
"string" は文字列型のメタ __index にも登録してあるから、それでいける
| The string library ... also sets a metatable for strings ...
"number" は初期設定では存在しないが、自分で定義して
lua_setmetatable (in C) なり debug.setmetatable (in Lua) で
数値型のメタ __index として登録すれば、やりたかった動作になるだろう
このあたりは伝統的にnumberのメソッドよりも、mathモジュールやstring.formatで賄うことが多かったから仕方ない
ホスト側の作成者の美的センスで適当に改造すべき箇所なんだろうな
- 1001 :987:2016/09/22(木) 16:31:47.44 ID:Ru9TIBDm.net
- >>1000
ありがとう。リファレンスマニュアルにも使用例がないので
試行錯誤してこんな感じになった。まぁ動けばいいか
>type test.lua
number = {}
debug.setmetatable(0, {__index = number})
number.to_binary_ulong = function(self)
--(略)unsigned longを4バイトの文字列に変換するコード
end
n = 1684234849
print(n:to_binary_ulong())
>luajit test.lua
abcd
- 1002 :987:2016/09/22(木) 18:13:01.03 ID:Ru9TIBDm.net
- >>996の
>メタテーブルがあり演算子の定義もできる
を見て思うところがあったのでリファレンスマニュアルを見たけど__addくらいしか書いていなくて何を定義できるのか判らない
ググってみるとメタテーブルチュートリアル的なのが出てくるけど[]とか[]=とかの定義は出来ないっぽい?
これを定義できると配列みたいな動作をするオブジェクトの使い勝手が良くなるんだけどな
- 1003 :デフォルトの名無しさん:2016/09/22(木) 18:24:14.43 ID:t8yALPnl.net
- 新スレ
http://echo.2ch.net/test/read.cgi/tech/1474536226/l50
総レス数 1003
265 KB
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★