トップページtech
991コメント330KB

【Lua】組み込み系言語総合 その2【Squirrel】

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2009/05/25(月) 09:11:41
LuaやSquirrelなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです
まとめwiki(なにか質問する前に必ずみること!)
http://wikiwiki.jp/lua/

その他の参考URLは>2から

■前スレ
【Lua】組み込み系言語総合【Squirrel】
http://pc12.2ch.net/test/read.cgi/tech/1205208141/

■過去スレ
その3 http://pc11.2ch.net/test/read.cgi/tech/1160799232/
その2 http://pc8.2ch.net/test/read.cgi/tech/1063711237/
その1 http://pc5.2ch.net/tech/kako/1034/10341/1034182349.html
0809デフォルトの名無しさん2010/02/03(水) 12:43:27
>>808
>>4
0810デフォルトの名無しさん2010/02/03(水) 12:46:04
Luaがもうちょっとキモくない文法ならいいんだけどなぁ
0811デフォルトの名無しさん2010/02/03(水) 12:49:10
文法だけ変換するプリプロセッサかトランスレータのようなものを作ればいいんじゃないだろうか
0812デフォルトの名無しさん2010/02/03(水) 13:02:55
たった数十kbくらいのサイズで
Cライクな文法が使える超軽量な組み込みないかな
LuaとかPawnも、小さい部類だろうけど不要な物が多すぎる
0813デフォルトの名無しさん2010/02/03(水) 18:35:51
asじゃあかんの
0814デフォルトの名無しさん2010/02/03(水) 21:16:11
Win版でUTF8とUTF16を相互変換するようにLuaを改造したけど需要ないかしら
たとえばSDLとか

ところで、Windows x64向けにビルドしてみたけど
> print(2^63 - (2^63+1))
でなぜか0が返ってくる

> print(2^31 - (2^31+1))
なら1になるけど

ちなみにlua_Integerの実体ptrdiff_tは8バイトになってる
どこがおかしいのかわからん
0815デフォルトの名無しさん2010/02/03(水) 21:57:11
整数も浮動小数点で計算するからだそうだ‥‥
64bit integerに対して64bit doubleじゃ精度足りないっての

パッチがあったからつっこんでみるが、ちゃんと動くか心配だ
08168042010/02/03(水) 21:57:40
>>805->>807
アドバイスありがとう。
luaL_loadbufferやluaL_loadstringを使うという発想は思いつきませんでした。
0817デフォルトの名無しさん2010/02/04(木) 15:53:15
>>811
Euphoria, t3x, moto, JavaなどCトランスレータを実装している言語は探すと色々あるものの、
トランスレート後に吐いたCソースとハンドコードしたCソースとのリンク方法が
文章化されてなかったりするするんだよな。

>>812
小さくはないが...elastiCは?
ttp://www.elasticworld.org/
0818デフォルトの名無しさん2010/02/04(木) 19:12:28
Luaスクリプトってバインダなしで使い物になるレベル?
0819デフォルトの名無しさん2010/02/04(木) 19:41:20
何らかのバインダ及びグルーが無いと、スクリプトの意味が無い気が。
0820デフォルトの名無しさん2010/02/04(木) 21:35:40
mingw ,gcc を前提としてるバインダが多い様な気がして
lua手を出しにくいのです。。。
0821デフォルトの名無しさん2010/02/04(木) 21:52:42
lua51.libとlua5.1.libって何が違うんだろう
0822デフォルトの名無しさん2010/02/04(木) 21:53:06
それは気のせいないし思い込みでは……
0823デフォルトの名無しさん2010/02/04(木) 21:57:42
.so を makefile でつくる、という事例にちょくちょく
遭遇しまうまう・・・orz
0824デフォルトの名無しさん2010/02/04(木) 22:02:22
バインダはLuaではなくバインダという言語である!!
0825デフォルトの名無しさん2010/02/04(木) 22:04:46
$(CC) を $(CL) とか代えて、pkg-config はそのままでも
nmake -f makefile でビルドできるもんなんだろうか・・・
0826デフォルトの名無しさん2010/02/05(金) 00:11:51
pkg-configはシェルスクリプトだからmsysなりcygwinなり要るだろ
0827デフォルトの名無しさん2010/02/05(金) 00:39:23
nmakeには、一から書き直して食わしてる
必要なobjぐらいなら写せるだろ
0828デフォルトの名無しさん2010/02/05(金) 00:52:13
それ全然lua関係ないじゃん

必要なc/cppファイルひろって Makefile 書き直すなり
Visual Studio でプロジェクトファイルつくるなりぐらいやりなされ。
そんな難しいもんじゃない。
0829デフォルトの名無しさん2010/02/05(金) 11:59:44
>>828
こういう問題を回避するためにSquirrelのソースパッケージをCMake対応にして
フォーラムに投げてみたら、いらないって言われた……。
0830デフォルトの名無しさん2010/02/05(金) 18:05:55
オレはCMakeで固まろうとした
0831デフォルトの名無しさん2010/02/06(土) 12:14:44
luaのuserdataとlightuserdataの違いって

userdata
・lua側でアロケート
・lua側でデアロケート(GC)
・Cには参照のみが渡される
・Cからは寿命が分からない

lightuaserdata
・C側でアロケート
・C側でデアロケート
・luaには参照のみが渡される
・luaからは寿命が分からない

これ以外になんか有りますか?
それとluaとCでuserdata、lightuserdataの寿命を同期させる方法は有りますか?
0832デフォルトの名無しさん2010/02/06(土) 12:41:41
meta tableの有無も違ってたかも
0833デフォルトの名無しさん2010/02/06(土) 14:15:34
>>831
これは心の贅肉をそのまま箇条書きにしたみたいで面白いな

考え方としてはとりあえず
lightuserdataは無くても整数値で代用できる、と割り切ってしまうほうが簡単
そうすると、整数とuserdataを比較するのは無意味だとわかる
0834デフォルトの名無しさん2010/02/06(土) 21:32:49
|Д゚)<バインダが面倒な人向けにいいもの置いておきますね
|Д゚)つ[AngelScript]
|ミ サッ  [AngelScript]
0835デフォルトの名無しさん2010/02/06(土) 21:47:45
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ AngelScript!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
0836デフォルトの名無しさん2010/02/06(土) 23:25:21
>>832,833
レスどうもです
メタテーブルの有無は重要ですね
いろいろいじってようやくユーザークラスをLuaに公開できるところまでこぎつけました
しかしlightuserdataは使い道がわからず・・・
0837デフォルトの名無しさん2010/02/07(日) 10:50:27
lightuserdataはCからのポインタの入れ物として使うのが想定されているらしい。
0838デフォルトの名無しさん2010/02/07(日) 14:36:10
lightuserdataは、スクリプトで操作したいクラスのインスタンスとか放り込むんじゃないの?
ゲームとかだとひとつのスクリプトで複数のオブジェクトを制御する必要があるし。
0839デフォルトの名無しさん2010/02/07(日) 15:41:29
C++のオブジェクトとLuaのオブジェクトが混在するのか・・・
C++/CLIならもっとすごいことになるな
0840デフォルトの名無しさん2010/02/07(日) 17:14:33
C++のオブジェクトをスクリプトで操作する感じかな。
例えばスクリプトで

SetSpeed(1,20)

とかいうような関数があった場合、C++側でlightuserdataを取り出し、

//lightuserdataからObjectのポインタを取り出す
Object *lpObject=(Object*)GetLightUserData(L);

//Objectを操作する
lpObject->SetSpeed(x,y);

って感じの処理をするグルー関数を用意する。
0841デフォルトの名無しさん2010/02/07(日) 18:22:00
lightuserdataでC++/Luaのインスタンスを協調させてみようかと頑張ってるんだができないorz
userdataでやれば上手くいくんだけどlightuserdataのほうが軽いらしいし・・・

C++側で
tableを作る
tableにインスタンスへのポインタをlightuserdataで格納
tableに各種メソッドを格納(メソッドはself(第一引数)tableからインスタンスへのポインタを取り出してクラスのメソッドをコールする)

さらにtableを積んで__gcフィールドにデリータを格納
最初のテーブルにメタテーブルとして設定

最初のテーブルを返す

という感じでやってるんだけどLua側で__gcが呼ばれてくれない
mt = getmetatable、mt.__gc(hoge)とすればちゃんとデリータを呼んでくれるのに・・・

こっちがDLL
http://codepad.org/5CuryxGE

こっちがLua
http://codepad.org/BON62sBh
0842デフォルトの名無しさん2010/02/07(日) 18:44:41
userdataとlightuserdataは全く別物。用途が違う。
パソコンでできることがケータイではできないと嘆いているようなもんだぞ?
0843デフォルトの名無しさん2010/02/07(日) 19:23:56
>>841
そういうことができなくなってる分軽いわけなんだが……

0844デフォルトの名無しさん2010/02/07(日) 19:31:07
じゃあlightuserdataは何に使うんだろう
コールバック的な使い方でしょうか
0845デフォルトの名無しさん2010/02/07(日) 19:44:12
だから主にC側で作ったインスタンス(のポインタ)の受け皿だって
0846デフォルトの名無しさん2010/02/07(日) 19:51:50
>>844
てか、マニュアルにもCのポインタそのものだって書いてあるだろう。
Cでよくあるハンドルスタイルやコールバックスタイルの構造を直接扱うためにある。
例えば fopenの帰り値の FILE* を void* にキャストして lightuserdata として持ってそのまま使う。

処理する時には、必ずCの関数をいちいち呼び出すのを前提として、
「LUA側は持ってるだけで何もさわらないデータ構造」として準備されてる。

これの使い方が直感的にわからない人がいるってのが驚きだった^^;
0847デフォルトの名無しさん2010/02/07(日) 20:54:46
わからない人というか、深読みする人もたまにいるな。
ひどくなると「それはただの××だよ」と言われると反論してくる。
「お前はそうやって分かったつもりになってるだけだ」とか。
0848デフォルトの名無しさん2010/02/07(日) 21:05:07
lightuserdataはテーブルのキーとして使う。
自前のオブジェクトのアドレスや、OSから渡されるハンドルをキーにしてテーブルを参照すれば、同じアドレスやハンドルに同じuserdataを対応させることができる。
ちなみに、この時のテーブルはweak tableにしておくといい。

ということを初めて知った時は目から鱗だった。
0849デフォルトの名無しさん2010/02/07(日) 22:40:47
何かLuaって面倒くさいな(´ω`)
0850デフォルトの名無しさん2010/02/07(日) 23:14:16
ひたすら軽量さが売りの言語って感じだなあ。
0851デフォルトの名無しさん2010/02/07(日) 23:22:51
ところで848のテクニック?のサンプルソースとかどっかでダウンロードできないかな?
0852デフォルトの名無しさん2010/02/07(日) 23:50:34
>>841みたいにuserdataの方にクラスのインスタンスのポインタを格納して
Luaから呼ばれるC++側の関数で取り出して使ってるんだけど、>>831
みるとuserdataはLua側でGCかかるの?
0853デフォルトの名無しさん2010/02/08(月) 00:40:38
http://codepad.org/8Z7d8J62

うーんこんな感じですかね?
ポインタをキーにという発想はすごい便利そうな予感がしますね
しかしグルーコード内のエラー処理とかってどうすればいいんだろう
C++例外を投げるべきなのか、関数内でもみ消してlua_errorするべきなのか
0854デフォルトの名無しさん2010/02/08(月) 07:40:28
>>852
「C++側」と「Lua側」をきっちりと分離したいんだな。
組み込み言語は、そういう幻想にうんざりしてる人のためにあるんだと思うけどな。
0855デフォルトの名無しさん2010/02/08(月) 10:48:05
Luaって速度が同じぐらいで、文法が素直な組み込みスクリプトが作られたらあっという間に駆逐されそう
0856デフォルトの名無しさん2010/02/08(月) 11:02:47
>>855
作られてないから駆逐されてない訳で
0857デフォルトの名無しさん2010/02/08(月) 11:04:23
もともとマイナーな分野なのに亜流が既にいくつも出ていてそれができないってことは
実際のところLuaのバランスが優れているってことでしょ
0858デフォルトの名無しさん2010/02/08(月) 12:13:32
罠を避けるのが上手い。
静的型 クラス メタプログラミング 並列処理 遅延評価 参照透明性 ・・・
0859デフォルトの名無しさん2010/02/08(月) 12:58:59
文法重視で速度気にしてない人は squirrel 使ってるし普通に棲み分けになってんじゃね?
0860デフォルトの名無しさん2010/02/08(月) 13:04:33
自分がLua選んだ理由は日本語の資料が一番多かったからだな。
次点の理由はスタティックリンクできたから。
0861デフォルトの名無しさん2010/02/08(月) 19:55:29
文法が嫌いとかいうやつって、
自分の英語ができないのは分法を教えるからって口だろ
0862デフォルトの名無しさん2010/02/08(月) 20:54:28
まぁ855の言うことが真ならSquirrelによってあっという間に駆逐されてるはずだな。
0863デフォルトの名無しさん2010/02/08(月) 20:56:42
>>861
逆だよ。
文法ができないから英語できないんだよ。
0864デフォルトの名無しさん2010/02/08(月) 21:00:44
>>863
>861が何を言ってるのか分かってるの?w
0865デフォルトの名無しさん2010/02/08(月) 21:12:14
俺スクリプトをLuaのVM用のバイトコードにコンパイルすればいいじゃん
0866デフォルトの名無しさん2010/02/08(月) 21:19:01
yieldをライブラリとして提供するのは実装の幅を狭めてると思う
0867デフォルトの名無しさん2010/02/08(月) 23:28:24
>>862
>>347みる限り速度はでLua>>>>Sq
0868デフォルトの名無しさん2010/02/08(月) 23:34:53
はじめて日が浅いけど L とか -1 が乱舞する
C拡張に馴染む日はくるんだろうか俺・・・
0869デフォルトの名無しさん2010/02/08(月) 23:37:30
>>868
俺は2日で拡張できるようになったぞ
0870デフォルトの名無しさん2010/02/09(火) 09:34:09
>>347では速度がLuaより早いにも関わらず日本ではあまり使われていないGameMonkey。
ざっと見た感じは文法も特に変な感じじゃないから、使いやすそうな感じはするんだけどね。

日 本 語 資 料 皆 無 だ け ど な
0871デフォルトの名無しさん2010/02/09(火) 11:26:11
>日本語資料
月並みなことを言うと
因果関係ではなく相関関係ならあるかもしれない
0872デフォルトの名無しさん2010/02/09(火) 11:32:07
Pawnも文法はシンプルに見えるが流行らないのはやっぱり何かが足りないんだろうな
0873デフォルトの名無しさん2010/02/09(火) 14:25:57
足りないというよりはLuaの情報量や実績やユーザ数を
代えられるほどのものではないということだろう
0874デフォルトの名無しさん2010/02/09(火) 16:13:12
Luaってゲーム以外で使われてますか?
0875デフォルトの名無しさん2010/02/09(火) 16:40:55
>>874
SciTEとか
0876デフォルトの名無しさん2010/02/09(火) 17:04:31
apacheとかwiresharkの拡張に地味に使われてたりする
もともとゲーム向けってわけじゃないしね
0877デフォルトの名無しさん2010/02/09(火) 17:50:35
Schemeが以外と流行らなかったな
0878デフォルトの名無しさん2010/02/09(火) 17:56:04
>>874
TextAdept
http://caladbolg.net/luadoc/textadept2/manual/1_Introduction.html
半分以上 Lua で記述され、また Lua で拡張可能なテキストエディタ
iconv で読み書きし内部は UTF-8 なので、日本語も使用可
0879デフォルトの名無しさん2010/02/09(火) 21:54:30
>>874
tokyotyrantでLua知ったよ
0880デフォルトの名無しさん2010/02/10(水) 14:33:21
http://dev.pocoo.org/projects/pygments/browser/pygments/lexer.py
http://www.frykholm.se/files/markdown.lua
http://coderay.rubychan.de/

プロジェクト管理ツール を作ろう
Redmin, Retrospectiva, Trac

基本組み込み用途だよね、とツールを作る用途で
移行する気が起きない理由はこの辺にありそうだとさっき気がつきました・・・
0881デフォルトの名無しさん2010/02/10(水) 17:47:01
lua5.1のDLL版を使ってるんですが、グルーコードの呼び出し規約は__cdeclでいいんでしょうか?
それとも__stdcallにしたほうがいいですか?
0882デフォルトの名無しさん2010/02/10(水) 20:55:07
>>881
たぶん__cdeclだけど仮に間違っていたとしても
name manglingの違いで簡単に見分けられるような気がする
0883デフォルトの名無しさん2010/02/10(水) 20:57:16
DLLを使う側の言語の規約に合わせるんだ
Cでしか使わないのなら目的にもよるがどっちでもいいと思うがな
0884デフォルトの名無しさん2010/02/10(水) 22:45:42
>>882
>>883
thxです
さっきluaのヘッダ見たところ呼び出し規約は書いてなかったので多分C言語デフォルトのcdeclでよさそうですね
0885デフォルトの名無しさん2010/02/11(木) 14:50:36
Programming in Lua携帯するにはしんどいな
PDFで売ってくれりゃいいのに
0886デフォルトの名無しさん2010/02/11(木) 15:59:41
ばらして持ち歩けよ
0887デフォルトの名無しさん2010/02/11(木) 16:49:25
組み込んで歩けよ
0888デフォルトの名無しさん2010/02/11(木) 18:52:41
lua で連想配列形式のテーブルの要素数を調べる方法ある?
配列形式だったら #tbl で、出来るみたいだけど・・・。
0889デフォルトの名無しさん2010/02/11(木) 20:14:39
userdata型に型情報を与えて
BOOL isHoge(lua_State *, index);
の形で使いたいんですが
luaのほうで予め提供されてる方法はありますか?
それとも、自分で独自にマップするものなんでしょうか?
0890デフォルトの名無しさん2010/02/11(木) 20:46:48
>>888
pairsやnextかな
0891デフォルトの名無しさん2010/02/11(木) 21:04:58
nextだとnilが設定されたフィールドでハマるので
pairsを使った方がいいんじゃまいか
0892デフォルトの名無しさん2010/02/11(木) 23:23:44
luabashがすばらしすぎる。

bashにluaインタプリタ機能追加してbashの拡張ができる&
bashが生きている間luaインタプリタも生きているのでlua変数を
保持し続ける。これ重要。

ファイル操作が多いとやっぱりシェルスクリプトが楽だけど
コマンド間の結果の連携を環境変数orファイル書き出しで
実装するのはかったるい時に大活躍な予感。
0893デフォルトの名無しさん2010/02/14(日) 01:40:15
組み込み用途以外でLua使おうなんて思わんな
汎用的に使うには標準ライブラリ貧弱だし
thenとかdoとか書くの面倒だし
0894デフォルトの名無しさん2010/02/14(日) 02:40:47
低レベルな質問で申し訳ないのですが
wxFormBuilderから追加したイベント宣言を定義するのはどうしたらいいのでしょうか?

Generateで書き出した.hファイルにある
virtual void OnButton1( wxCommandEvent& event ){ event.Skip(); }
の{ event.Skip(); }をコメントアウトすることで
出来なくも無いのですが
ヘッダファイルの行頭に
// PLEASE DO "NOT" EDIT THIS FILE!
とありますし後々修正があったときに困りそうです。

// Virtual event handlers, overide them in your derived class
このコメントが鍵のような気もするのですが正直意味が分かりません・・・
0895デフォルトの名無しさん2010/02/14(日) 03:09:57
誤爆ってる、失礼しました
0896デフォルトの名無しさん2010/02/14(日) 11:30:21
   /ヽ /ヽ
  ':' ゙''"  `':,
  ミ   ・ω・ ;,
 :; . っ     ,つ Lua!
  `:;      ,;'
   `( /'"`∪
0897デフォルトの名無しさん2010/02/15(月) 16:13:25
自作型で__gcでC側のリソースを開放してるんだが
__gcをうっかり書き換えてしまわないように
メタテーブルを隠蔽あるいは変更不可にすることはできるだろうか?
0898デフォルトの名無しさん2010/02/15(月) 19:19:53
__gcということはユーザーデータか。ならばスクリプト側からはメタテーブル自体の変更はできない。
さらにメタテーブルに__metatableを追加しておけば隠蔽も可能になり、メタメソッドの変更、追加を防止できる。
ただしこれらはC側やdebugライブラリには効果がないし、制限する手段も(多分)無い。
0899デフォルトの名無しさん2010/02/15(月) 21:52:18
C++でRAIIをうっかり忘れてしまうレベルだ
初期化以外でsetmetatable()を使うのか?
0900デフォルトの名無しさん2010/02/15(月) 22:33:58
>>898
__metatableというのがあったのか
というかユーザデータはもともと変えられないって知らなかったorz
レスthxでした

>>899
metatableをうっかり書き換えるのはクライアントで、クラスじゃない
RAIIをうっかり忘れるのとmetatableをうっかり書き換えるのは別次元の問題
そのクライアントのついうっかりを封印して出来なくしてしまえれば安心して寝れる
0901デフォルトの名無しさん2010/02/15(月) 23:37:24
>>900
なにが別次元だ
ファイルを読んだり書いたりdllをロードしたりする、普通の言語じゃないか
0902デフォルトの名無しさん2010/02/19(金) 02:15:03
(◞≼◉ื≽◟◞౪◟,◞≼◉ื≽◟ )
0903デフォルトの名無しさん2010/02/19(金) 20:31:33
           ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ Lua!!
 彡、   |∪|  /
/ __  ヽノ /
(___)   
0904デフォルトの名無しさん2010/02/21(日) 15:46:38
(´・ω・`)
0905デフォルトの名無しさん2010/02/22(月) 16:32:07
LuaInterface 使ってる?
0906デフォルトの名無しさん2010/02/22(月) 16:55:48
(`・ω・´)
0907デフォルトの名無しさん2010/02/22(月) 17:51:50
ルアのmodule(name)のnameが被ったらどうなるの?
0908デフォルトの名無しさん2010/02/22(月) 20:06:58
name ru houkei
レス数が900を超えています。1000を超えると表示できなくなるよ。