【Lua】組み込み系言語総合 その6【Squirrel】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2013/03/10(日) 15:10:32.28使われるプログラミング言語についてのスレッドです
まとめ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/
0930デフォルトの名無しさん
2016/05/17(火) 17:54:24.20ID:awF8sDTJタップ処理にかかった実時間とCPU時間が等しい保証が無いという意味。
君が欲しいのは「実時間」だが、os.clockは「CPU時間」だから加減算できない。
身長と体重の値を足すようなもの。
(Luaからデフォルトで使える) 標準Cだけだと1秒より良い精度は無理と言われてる。
http://stackoverflow.com/questions/361363/how-to-measure-time-in-milliseconds-using-ansi-c
| There is no ANSI C function that provides better than 1 second time resolution
autotouch APIに高精度タイマーは用意されてないかな?
Lua から clock_gettime 等を呼ぶモジュールを加えるのも難しいか?
なお、Windowsのclockは(あえて)実時間を返すようだ。誤解が多い原因かもしれない。
https://msdn.microsoft.com/library/4e2ess30.aspx
| The elapsed wall-clock time since the start of the process
| Note that this is not strictly conformant with ISO C99
0931デフォルトの名無しさん
2016/05/17(火) 20:04:41.45ID:aW8j1xwW補足サンキュー
しかしCPU時間返されてもベンチマークぐらいしか使い道ないよね。
でも文句はそれしか用意してない標準Cに言うんだ。Luaは高い移植性のために標準Cから外れる物は極力実装しないんだ
0932デフォルトの名無しさん
2016/05/18(水) 08:00:35.07ID:6L3zAH6bコア毎に記録する機能でも積んでなきゃ、
目安になりそうな計測をして加算し続けるくらいしか現実的な手段ないからね
マルチメディアタイマ動かすスレッドを裏側に置いてポーリングするか
別のコンテキストでタイマのタイムアウト毎にスクリプト起動するとかしかないんじゃないかな
(メインのスレッドと同じコンテキストで実行しちゃダメだよ)
0933デフォルトの名無しさん
2016/05/18(水) 09:46:49.35ID:k2SHVqf6名前に騙されて、古代の課金処理を現代のプログラムで使うからおかしくなるんだよ
0934デフォルトの名無しさん
2016/05/18(水) 15:47:48.90ID:bch1M3Ro皆さんありがとうございます
autotouchのAPIになさそうです
autotouchでclock_gettime使ってみます
0935デフォルトの名無しさん
2016/05/25(水) 01:28:46.05ID:PQF3VaRVあーだこーだ探したり高いライセンスを払うより
1から自分で作ったほうが速い場合も多々ある
0936デフォルトの名無しさん
2016/05/26(木) 10:31:37.40ID:lpov0tDn組み込みを意識してVM自体をなるべくROMにおいやったり
定数になるべくデータを追いやったりしてRAMやスタックの消費量抑えたりみたいな細工をする事無く
素直でわかりやすく、高速なコード書き放題だもんな
0937デフォルトの名無しさん
2016/05/26(木) 10:49:26.89ID:LqK2D4Ix自分で作ったほうが早い場合はありそうだな
0938デフォルトの名無しさん
2016/05/26(木) 18:41:47.35ID:iZpcR2mhなかなかそうはいかないよね
0939デフォルトの名無しさん
2016/05/26(木) 22:46:21.63ID:kkdzC4Pz0940デフォルトの名無しさん
2016/05/27(金) 03:25:00.38ID:fvoGjXwU0941デフォルトの名無しさん
2016/05/31(火) 20:56:31.07ID:J6Jy3eBOgr-sakura2ボードが新たに発売されたんでmrubyやろうと思ったら、ライブラリとかv2なっててどうしようかと。
mruby入りスケッチビルド通ったんで焼いてもだんまりだわ。デバッグする方法あるのかな(汗
0942デフォルトの名無しさん
2016/06/01(水) 22:16:27.31ID:ItE+il1Rgr-sakuraは別の意味の組み込みじゃなかろうか
0943デフォルトの名無しさん
2016/06/07(火) 13:17:30.66ID:Cceun6yBLuaのメンテナンス・ポリシーだと最新版しかバグ修正されないのね
最近見つかった昔からあるバグでも5.3しか修正版が出ない
diff形式で公開されているから自分でどうにかしろってことか
0944デフォルトの名無しさん
2016/06/07(火) 15:13:34.60ID:1jTwDXeQ0945デフォルトの名無しさん
2016/06/11(土) 10:50:09.10ID:8vn3zKAGfunction Hoge
return{
Foo=function end
};
end
みたいなクラスです
0946デフォルトの名無しさん
2016/06/11(土) 10:50:57.07ID:8vn3zKAG0947デフォルトの名無しさん
2016/06/11(土) 17:55:08.38ID:XziS+43Hvar foo = ...
foo["Foo"]();
とかでいけるんじゃない?
0948デフォルトの名無しさん
2016/06/11(土) 18:00:29.69ID:8vn3zKAGキャストしてCall呼び出したらいけました
0949デフォルトの名無しさん
2016/07/16(土) 14:37:12.17ID:ClCwwHutひとまずデバッグ用にバイナリ文字列をHexダンプするコードを書いてみる
Lua5.3.3(UPX圧縮後で250,064 Byte)
path = "C:/Windows/system32/calc.exe"
f = io.open(path, "rb")
f:seek("set", 0)
b = f:read(512)
f:close()
io.write("\"" .. path .. "\" / " .. string.len(b).."Byte Dump...\n")
i = 1
l = ""
repeat
w = string.sub(b, i, i + 15)
for c in string.gmatch(w, ".") do
l = l .. string.format("%02X ", string.unpack("B", c))
end
l = l .. string.rep(" ", 3 * (16 - string.len(w)))
l = l .. " "
l = l .. string.gsub(w, "[^\x20-\x7e]", ".")
l = l .. "\n"
i = i + 16
until string.len(b) + 16 < i
io.write(l)
0950デフォルトの名無しさん
2016/07/16(土) 14:41:48.88ID:ClCwwHut0951デフォルトの名無しさん
2016/07/19(火) 21:09:20.86ID:5Ru68Qwwfunc=function()end;
と
hoge={
func=function()end
};
の違いって何ですか?
0952デフォルトの名無しさん
2016/07/19(火) 22:10:30.90ID:Uci7C8fw上
hogeというモジュールを読み込む
funcというグローバル変数に何もしない関数を代入する
下
funcという何もしない関数をもつテーブルを作成しhogeというグローバル変数に代入する
0953デフォルトの名無しさん
2016/07/19(火) 22:35:55.44ID:5Ru68Qwwfunc=function()end;
hoge={func=func};
をするって事?
0954デフォルトの名無しさん
2016/07/19(火) 22:51:15.91ID:Uci7C8fw最近のものはグローバル環境を汚すのを嫌って勝手に代入せずテーブルを返すのが推奨されているから
module=require(’modname’)
って書く
0955デフォルトの名無しさん
2016/07/19(火) 22:54:48.00ID:5Ru68Qww何となく分かった気がする
ありがとう
0956デフォルトの名無しさん
2016/08/02(火) 15:28:41.79ID:vpqNpIG1local self=BaseClass.new();
self.hoge=0;
return setmetatable( self, { __index = Class } );
でいいんでしょうか?
色々な方法が書いてあってどれをすればいいか分かりません
0957デフォルトの名無しさん
2016/08/02(火) 21:42:21.39ID:rXn2IC8I色々な方法があるから、使うフレームワークが推奨する方式に従うべき
特にそういう縛りがなければ自分で考えてみてもいいが
汎用性が高いのはJavaScriptと同じ方式だとは思う
0958デフォルトの名無しさん
2016/08/02(火) 22:00:37.77ID:qJ2YHFft一つの言語で色々やってるのは珍しいが効率は良い
0959デフォルトの名無しさん
2016/08/03(水) 08:06:53.16ID:8fjgpLNnまぁLuaだと組み込み環境ごとに全く別の言語だと思ったほうが良いんだろうけど
0960デフォルトの名無しさん
2016/08/04(木) 09:23:50.33ID:Mm46IUtm本家に書いてあるやん
0961デフォルトの名無しさん
2016/08/04(木) 20:01:15.52ID:aMt1KCpEお手本を作ってクローンさせる方式だね
一般的なクラスとインスタンス方式にこだわりがなければLuaらしいやり方だ
0962デフォルトの名無しさん
2016/08/05(金) 22:47:51.66ID:K6ts8EaKありがとうございます
もう一つあるんですが、動的に引数を指定したり複数の戻り値を返したりすることは出来ますか?
hoge(1,2,3)と通常は呼び出す物をhoge({1,2,3})と呼び出したり、
return 1,2,3;
を
return {1,2,3}
のように配列を使って動的に指定したいです
0963デフォルトの名無しさん
2016/08/05(金) 23:10:53.81ID:K6ts8EaKすみません
0964デフォルトの名無しさん
2016/08/26(金) 15:28:57.81ID:BDiBxktHの次にlua_pop(L, 1) を入れるのはなぜですか?
0965デフォルトの名無しさん
2016/08/26(金) 17:19:18.70ID:LCNVy+4GluaL_requirefはロードしたモジュールをスタックに残すから
それをスタックから取り除いている
LuaのC APIはスタックを意識する必要がある
マニュアルにある [-0, +1, e] のような箇所で説明されている
0966デフォルトの名無しさん
2016/08/28(日) 07:51:02.13ID:O603KyWmありがとうございます。
スタックから取り除いても大丈夫(モジュールは使える)ということなのでしょうか?
もしそうならスタックに積まれるのはなぜなのですか?
0967デフォルトの名無しさん
2016/08/28(日) 14:07:28.83ID:A/8rNEYuLuaの疑似コードだと
local m = require("module")
m = nil
のような動作だと考えてくれ。
moduleが何かを返すタイプならスタックに積まれた m を使うことになるだろうし
グローバル変数を追加するタイプなら取り除いても(グローバル経由で)使えるだろう。
0968デフォルトの名無しさん
2016/08/29(月) 18:22:57.78ID:9ixLGi86よく分かりました。ありがとうございました。
0969デフォルトの名無しさん
2016/09/08(木) 18:19:09.71ID:GHpvw+VU今まではメモ帳(付属のじゃないよ)だけで一つか複数のファイル開いてシコシコ書いてたんだけど、
数百から千くらいのファイル群のゲームの解析というか関数なんかの検索に、メモ帳では太刀打ちできなくて困ってます
出来たら沢山開けるメモ帳的な簡易的な物が良いんだけど、OSにインスコして、関連付けもしてくれちゃって・・・っていうのはむしろ要らない、アーカイブ展開したらすぐ使えるのがいいです
よろしくお願いします。
0970デフォルトの名無しさん
2016/09/08(木) 18:46:36.03ID:2gFs3OWYOS非依存だからwin以外でも使える
0971デフォルトの名無しさん
2016/09/08(木) 19:45:27.86ID:oP5NpzJh0972デフォルトの名無しさん
2016/09/08(木) 21:07:48.97ID:GHpvw+VU0973デフォルトの名無しさん
2016/09/09(金) 21:43:20.24ID:++lP9HIx0974デフォルトの名無しさん
2016/09/10(土) 00:03:26.44ID:mCfQwN8m0975デフォルトの名無しさん
2016/09/10(土) 01:31:15.83ID:1lwBEIiLFlashAirでPHPを実行できないかなーとか考えた
0976デフォルトの名無しさん
2016/09/10(土) 06:33:19.86ID:URrhv4S00977デフォルトの名無しさん
2016/09/10(土) 09:08:02.15ID:CKZv9HiE0978デフォルトの名無しさん
2016/09/10(土) 10:14:04.84ID:32Nzsdc+0979デフォルトの名無しさん
2016/09/10(土) 13:14:30.12ID:1lwBEIiLそうか、残念
>>978
最新モデルのW-03のみだけどLuaインタプリタを内蔵している
FlashAir Developers - APIガイド - Lua機能
ttps://flashair-developers.com/ja/documents/api/lua/
FlashAirのプログラミングにも使えるしCGIとしても使える
0980デフォルトの名無しさん
2016/09/10(土) 13:27:13.60ID:32Nzsdc+ただのPCに転送できるSDカードと思ってたわ
よくあのサイズで内臓出来たな…技術凄い
0981デフォルトの名無しさん
2016/09/10(土) 13:51:44.59ID:1lwBEIiL興味があるなら>>979のWebサイトのドキュメント→本の中にあるFlashAir Doujinshi 2を読んでみると良いよ
電子工作メイン(FlashAirのプログラミング)だけど裏話の他Luaによるプログラミング例がいくつか載っている
0982デフォルトの名無しさん
2016/09/10(土) 14:08:02.65ID:32Nzsdc+ゲームじゃないからなくてもいいだろうけど
0983デフォルトの名無しさん
2016/09/10(土) 21:52:55.71ID:URrhv4S0変数空間を共有してるから増分はコールスタック程度しかないはずだが
0984デフォルトの名無しさん
2016/09/10(土) 22:08:42.97ID:IwLF9FUl0985デフォルトの名無しさん
2016/09/10(土) 22:55:58.05ID:URrhv4S0メインスレッド = グローバル変数テーブル + コルーチン でできてる
0986デフォルトの名無しさん
2016/09/10(土) 23:32:04.82ID:IwLF9FUl糖衣構文ではなかったのか
何故かコルーチン関係がキーワードじゃなくてメソッドだし
0987デフォルトの名無しさん
2016/09/20(火) 23:56:31.17ID:8JrnwUlq>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
0988デフォルトの名無しさん
2016/09/21(水) 07:08:55.54ID:8q78VamIその書き方だとグローバル変数の x を見にいってる
Luaはselfを省略できないから
{ ..., func1 = function(self) print(self.x) end }
にするか、もしくは { } の外で : を使う
function CLASS:func1() print(self.x) end
ところで次スレも同じタイトルでいいの?
LuaはともかくSquirrelは今や…
0989デフォルトの名無しさん
2016/09/21(水) 18:50:26.73ID:eYdYUvGQ0990987
2016/09/22(木) 03:54:45.83ID:Ru9TIBDmLuaのデフォルトのスコープはグローバルなんか・・・
というかこの統一性がない仕様はすっきりしないなぁ
string.to_number_ulong = function(self) ←これは意図したとおりに使える
〜
end
number.to_binary_ulong = function(self) ←これはnumberが無いと怒られて動かない
〜
end
5.1だとビット演算がないからこのような変換も手間だし
0991デフォルトの名無しさん
2016/09/22(木) 06:26:50.65ID:t8yALPnlその例から「意図」が読み取れないから何とも言えない
統一性がない仕様もなにも、自分で定義している関数に不満を漏らす意味がわからない
>>987 も CLASS = { ... } はあくまで連想配列の定義だから
連想配列要素の定義中に兄弟要素の変数を参照しないのは言語に限らず当たり前だぞ
0992デフォルトの名無しさん
2016/09/22(木) 13:55:49.27ID:62PEa5hXだからビット演算がない
同様に、連想配列とオブジェクトを統一するためオブジェクトを捨てる
でも連想配列とdoubleのどっちかを捨てるのは無理だからそこは統一性がない
0993デフォルトの名無しさん
2016/09/22(木) 14:25:23.06ID:t8yALPnlビット演算は5.3で採用されたし、doubleとintはスクリプトからは意識されない
連想配列と統一するために捨てたオブジェクトとは何のことだ?
連想配列とdoubleの統一性のなさとは何だ?メタテーブルがあり演算子の定義もできるのに
0994デフォルトの名無しさん
2016/09/22(木) 14:41:12.52ID:62PEa5hX意味がわからんから捨てる
0995987
2016/09/22(木) 14:44:50.84ID:Ru9TIBDm判りにくくてスマン。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
リファレンスマニュアルがショボいためにググってばっかりで捗らん・・・
0996デフォルトの名無しさん
2016/09/22(木) 15:27:10.87ID:62PEa5hX昔の言語にはstringの演算子がなかったからstringには関数が必要
numberにはあまり必要なかった
その影響で string.* という関数は色々あるが number.* は一個もない
0997デフォルトの名無しさん
2016/09/22(木) 15:31:44.15ID:t8yALPnlああそういう意味か
"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で賄うことが多かったから仕方ない
ホスト側の作成者の美的センスで適当に改造すべき箇所なんだろうな
0998987
2016/09/22(木) 16:31:47.44ID:Ru9TIBDmありがとう。リファレンスマニュアルにも使用例がないので
試行錯誤してこんな感じになった。まぁ動けばいいか
>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
0999987
2016/09/22(木) 18:13:01.03ID:Ru9TIBDm>メタテーブルがあり演算子の定義もできる
を見て思うところがあったのでリファレンスマニュアルを見たけど__addくらいしか書いていなくて何を定義できるのか判らない
ググってみるとメタテーブルチュートリアル的なのが出てくるけど[]とか[]=とかの定義は出来ないっぽい?
これを定義できると配列みたいな動作をするオブジェクトの使い勝手が良くなるんだけどな
1000デフォルトの名無しさん
2016/09/22(木) 18:24:14.43ID:t8yALPnlhttp://echo.2ch.net/test/read.cgi/tech/1474536226/l50
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
life time: 1292日 3時間 13分 42秒
レス数が1000を超えています。これ以上書き込みはできません。