【Lua】組み込み系言語総合 その4【Squirrel】
乙
スレ立て乙
前スレに、コルーチンの呼び出しは自分でやらないとダメって書いてあったけど
AngelScriptのcreateCoRoutineって、戻り値ないよね
どうやって実行タイミング合わせるの?
7 :
デフォルトの名無しさん:2011/04/02(土) 23:18:22.11
AddOnのContextMgrを使ってる場合の事かな?
あれでコルーチンする場合は、呼び出し元のスクリプトが終了した後にスクリプト内で呼び出された関数を別Contextで呼び出すってやってたはずなので、
元スクリプトの処理終了後に内部で呼び出した関数を実行する感じになってたはず。
イメージ的には、元スクリプトを呼び出すと、同時にコルーチンの分も処理するって感じ?
Luaとかのコルーチンとはちょっと違うかな。
Luaで
A = {X = 10}
B = {X = A.X + 10}
というテーブルが二つあって
A.X = A.X + 1とやれば
B.Xもポインタというか遅延評価みたいな形で
勝手に1増えるようにはできないでしょうか?
>>8 A = {X = 10}
B = {}
setmetatable(B,{
__index = function(t,k)
if k=="X" then return A.X+10 end
end,
__newindex = function(t,k,v)
rawset(t,k,v)
if k=="X" then A.X = t[k] - 10 end
end})
print(A.X,B.X) -- 10 20
A.X = A.X + 1
print(A.X,B.X) -- 11 21
B.X = B.X + 1
print(A.X,B.X) -- 12 22
10 :
8:2011/04/04(月) 21:02:21.75
>>9 ありがとうございます。
CとかRubyとかオブジェクト指向も関数型も色々な言語触ったけど、
このメタテーブルっていうやつは難しいですね…
サイト見るとメソッドみたなものって書いてるけど使い勝手が違う感じですし。
関数の : と . の呼び出しの違いもなかなか理解できないし、
簡単な言語だと思ってたけど意外と難しいLua…orz
Luaを作った人は宣言的な言語が嫌いなんだと思う。
だから、宣言が好きな人には難しい。
親クラスから派生し、
小クラスの関数内から
親クラスの同名関数を呼ぶには
どうしたらいいでしょうか?
C++でいう、仮想関数内から、
親の関数を呼びたい感じです。
squirrel の話なら 単純に親クラス名::メソッド名() でOK。コンテキストが bindenv() されてないメソッドはそのまま this で動作する
>>12 言語が何かわからないとどうしようもないだが。
ここはLua専用スレじゃないからね。
しかし、かのアイマス2もLua採用してたのかー。
これはこれからもLua全盛が続きそうだなー。
lua にはクラスは無いので問題が意味をなさないよ。疑似クラスとして使ってるならどういった構造で記述してるか書かないと誰も答えられない
お勉強でゲームプログラミングやってんだけどCとLuaのバランスがわからん
Luaのほうが大分大きくなる(というかこれからなりそうな)んだけど普通こんなモンなのかな
描画処理とかサウンド処理とかの基本機能>C
ゲームのロジックとか>とりあえずLuaで書いて作業。パフォーマンスが気になるところは仕様FIXしてから機能をCに置き換えていく
ってやりかたにおちつく人が多いんじゃないかな
19 :
6:2011/04/06(水) 22:37:54.89
>>7 やっぱり良く分からない・・・
作成したコルーチンが実行されるのは、作成元のスクリプトの呼び出しが終わって、
次にContextMgrのExecuteScriptsが呼ばれたときみたい
キャラクターごとにコルーチンを1個作ってアニメーションさせようと思ったんだけど、
こんな使い方はできない?
20 :
デフォルトの名無しさん:2011/04/07(木) 01:03:38.89
Luaで配列の長さを求める # 演算子を使おうとすると
unexpected symbol near `#'
と怒られてしまいます。
もしかしてバージョンが古いのでしょうか?
Lua 5.0.3です。
#演算子は5.1からだった気がする
なぜ長さで#なのだろう
>>21,22
ありがとう、ありがとう、普通に#使ってる例が多かったのでまさかと思って
しまいました。
さて、5.1入れるかな。。。
>>23 the number of ってことじゃね?
シェルスクリプトとかでも使ってるし
Lua5.1以降でMBC対応したのってありませんよね?
>キャラクターごとにコルーチンを1個作ってアニメーションさせようと思ったんだけど、
>こんな使い方はできない?
できるよ。
ただ、AngelScriptのサンプルのCoroutineだとちょっと面倒かも。
あれはコルーチンというよりスレッドに近いし。
Luaみたいにコルーチンオブジェクトがあって、そいつをメソッド呼び出しとかできると楽なんだけどね。
Coroutine c;
c.SetFunc(〜);
…
c.Execute();
って感じで、一時停止したコルーチンの続きを実行させるときにメソッド呼び出すようにすれば楽。
∧_∧ / ̄ ̄ ̄ ̄
( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
>>28 うーむ
じゃあ、Luaみたいな使い方が出来るようにアドオンを改造してみるかな
回答ありがとう
LuaでGifファイルの編集がしたいのでバイナリで読み込んで処理したいのすが
io.openのモードの後ろにbを付ければバイナリで開けることはわかったんですが、
戻り値が文字列なのでどうすれば『先頭の何ビットを取る』などのバイナリ操作ができるのかがわかりません。
解説しているサイトが見つからないのでそういったバイナリ操作がまとめられたサイトなどがあれば教えて欲しいです。
>>32 説明不足ですみません…。それも見たのでが配布ソフトのスクリプト言語で
Luaを使っているので、Cで書かれたライブラリは読み込めない状態です…。
バイナリ計算のand,or,notなどは自作できましたので、できなくて困っているのは
『文字列の何ビット目から何ビット目までを整数(ビット列)で切り出す』という操作です。
>>33 一旦テーブルにつめちゃったほうが扱いやすいんじゃないの?
function Hoge(fname)
local t = {}
local f = io.open(fname,"rb")
if not f then return nil end
local data = f:read("*a")
for b in string.gmatch(data,".") do
table.insert(t,string.byte(b))
end
f:close()
return t
end
t = Hoge("hoge.bin")
>>34 文字コードを取り出すのはstring.byteでしたか。
これに気づいていませんでした。ありがとうございます。
ウラシマで申し訳ないが、そういやGIFのライセンス問題って決着ついたんだっけ?
あの特許はもう期限切れのはず
luaでディレクトリのファイル一覧を取得したいのですが、
os.execute("dir") > Dir.txt
でプロンプトの内容をテキストファイルに保存してファイルを開く方法しか思いつきませんでした。
直接プログラムで読み込む方法はないでしょうか?
プログラムで読みこむライブラリを C でつくって組み込めば良いだけでは
無い機能はさっくり作るって発想ができない人は lua は不幸になるだけなので使わないほうがいいですよ
42 :
39:2011/04/14(木) 15:08:49.74
33ですよ。スレタイからしてC開発者限定で場違いですねサーセン。
>>40 その不幸になる言語でスクリプト組まざるおえないユーザーですみません。
自分が不幸になるのは完全にluaのせいだといわんばかりだなw
>>40 はちょっと頭の切り替えしたほうがいいんじゃない?
くらいのことを言ってると思うんだけど
その配布ソフトとやらがC実装ライブラリのインポートを任意で禁止してるならご愁傷様としか...
本当にrequireやpackage.loadlibに該当するAPIを用意してないのか怪しいもんだけどねえ
ROのホムンクルスAIとか?
>>43 Cが使えない環境って言うんだから
しょうがないさ。
>>33 組み込まれた物を使う側じゃなくて、
組み込みを用意して使う側がおおいから
名前に、33付けてた方がイイかもね。
その配布ソフトってなんなんだろう。実は拡張の口がある、とかあったりしないかね
本気で助けが必要なら某ソフトとかかかないで、ちゃんと名前出すべきなのかもねぇ
Linuxと同じ
カーネルしか作らない有能な怠け者は反感を買う
ファイルの一覧をあらかじめテキストファイルにでも書いておくしかないねぇ。
一般のツールで拡張の口が閉じられてるってのはちょっと考えにくいんだよなぁ。そんな腐ったツールは窓から投げ捨てろ
内製ツールなら、こんなところで聞くよりも組み込んだプログラマにまず文句を言いに言ったほうが早い
あとはゲームとかの類での制限つき環境……だけどその状況でファイル一覧とったり、GIFパースしたりをする理由が謎
WindowsならDLLインジェクションとかで
横取りすればいけるんじゃね
ウィルス扱いされるかもしらんけど
>>52 ウィルスと勘違いする対策ソフトはいくつかあるみたい。
DirectInputの初期化とかでも「ウィルスだ!」とか勘違いするし。
lua_Stateをクラスのメンバにし、staticメンバ関数をlua_registerで登録しています。
この関数にthisを渡したい場合、どのように書くのが定石ですか?
lua_setuserdataとか?
>>54 それだけの情報だと状況次第としか言いようがないな
AngelScript、デフォルト引数が実装されるのか
デフォルト引数ってなんか使い道あるの?
∧_∧ / ̄ ̄ ̄ ̄
( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
>>59 普段はほとんど変更しないけど、時々異なるフラグを設定するような関数とかに使うと便利、ってぐらいじゃないかね。
必須ってわけじゃないけど。
>>59 C++にだってデフォルト引数はあるだろ。
改めて質問するようなことなのかねえ。
C++の場合はデフォルト引数よりもオーバーロードの方がお勧め。
本当はより汎用的なパターンマッチングが良いんだけど、C++だと面倒だからなあ。
関数をラップすればいいだけだから要らないと思ったんだよ
デフォルト引数は使う必要がない人も多いかと。
DirectXとか使ってると、特殊な場合以外はフラグはデフォでOKなのが多いから便利だよ。
66 :
デフォルトの名無しさん:2011/04/24(日) 20:59:44.12
Tclと比べたメリット・デメリットは何ですか?
組み入れではなく単体で使うならGUIの構築が楽なTclに軍配があがりそうですが、
それ以外にはどんなことがありますでしょうか?
>>67 失礼しました。
主語はLuaです。
Luaスレと勘違いしてたんです。
>>68 オレ自身はLuaユーザーじゃないので大雑把な話しかできないけど、
C関数をスクリプト中で使いやすいのはどちらも同じ。
Tclは原則文字列ベースでしか処理できないけど
Luaは数値、文字列、リスト、テーブルが使える。
Tclはスクリプトエンジンでもかなり遅いほうだけど、
LuaはブラウザのJavascriptに迫る速度。
Tclは言語構文としてはオブジェクト指向対応で
止まってるようなものだけど、
LuaはJIT対応やコルーチン対応など、
流行の技術もある程度押さえられている。
こんなところかな。
>>66 Tclはウィジェット形式のアプリには向くがゲームには向かない。GTKとかWindowsAPI(DirectX不使用)とかでゲームを作ってるのと同じ。
あと、メインがどっちかっていう問題もあるな。組み込みスクリプトは簡単に組み込める。Tclを組み込みスクリプトとして使えるようにすれば物好きが使うんでないかな
tcl は最初から組み込み用だべ
半導体関係のツールまわりでは事実上の標準
組み込みはTclも簡単にできる
言語として構文の拡張性が高いのもTcl
構文の拡張性が高けりゃ良いってもんじゃないと教えてくれるのもTcl
74 :
デフォルトの名無しさん:2011/04/25(月) 22:05:57.35
現在では、Tclがその本来の使い方から離れて、組み込み言語ではなく
Tkとセットで独立した汎用言語として利用されることが普通になっています。
将来的にはそれと同じことがLuaにも起こらないのでしょうか?
Lua始めようと思ってます
blue = Color.new(0, 0, 255)
screen:print(200, 130, "Hello World!", blue)
screen.flip()
while true do
screen.waitVblankStart()
end
がPSPで動作しますが
while true do
screen.waitVblankStart()
の部分は何を表していますか?
言語と何ら関係ない組み込み先の話だからそっちのスレ行け
みんなLuaのバインダは何を使ってる?それとも使ってない?
コンセプトさんとバインダさんは都市伝説だよね
>>74 むしろ tk とセットに使うのは tcl 以外の言語で
純粋な tcl 用途以外は壊滅気味じゃね?
>>79 EDAでは普通に使われてるけど。
tkも含めて。
小物ツール作るだけなら異常に生産性高いから
もう少し見直されても良い気がするんだがなぁ。
81 :
デフォルトの名無しさん:2011/04/26(火) 10:30:17.19
proc megaaa {} {
.l configure -text {目があぁぁぁ!}
}
pack [label .l -text {Tclは滅びん。何度でも蘇るさ。}]
pack [button .b -text {バルス} -command megaaa}
>>81 最後の閉じ括弧が}じゃなくて]でないの?
じゃないと動かん。
83 :
デフォルトの名無しさん:2011/04/26(火) 22:51:02.91
>>80 C++で開発を依頼したら、とんでもなく高額の見積りを出されたことがある。
理由を尋ねたら、優秀なC++プログラマは少ないうえ、開発にもそれなりの期間を要するのでその程度になるとのこと。
あきれて物も言えなかった。
それで、仕方なくTcl/Tkで内製したよ。
簡易言語でチャチャッと開発・・っていうのは良くないという意見もあるけど、
昨今のphpの勢いなどを見ると、コストダウンのためならTcl/Tk的な安易言語の積極活用もありだと思う。
何を依頼したのかにもよるとは思うけど、GUI伴うアプリだとどうしてもかなり高くなると思われ > C++
C++でGUIは無いわな
見積もりは正しい
小物ツールにC++はコンビニにレース用の車で行くような印象
>優秀なC++プログラマは少ないうえ、開発にもそれなりの期間を要するのでその程度になるとのこと。
間違ったこと言ってないと思うが、C++を指定したのが間違ってるんじゃ。
言語指定ということはソースさせくれれば後は用無しだよってことを意味する。
高くせざるを得ない。
テーブル同士の連結はどのように書けばいいのでしょうか?
連結とは例えば、
t1 = {"aaa", "bbb"}
t2 = {"ccc", "ddd", "eee"} から
{"aaa", "bbb", "ccc", "ddd", "eee"} を作る場合です。
coronaってフレームワークでLua使ってるんだけど、スマホ固有の話もここでいいのかな、板違いかな?
>>90 t1 = {"aaa", "bbb"}
t2 = {"ccc", "ddd", "eee"}
t3 = {unpack(t1)} --shallow copy
table.foreach(t2, function(k,v) table.insert(t3, v) end)
ひたちなか市のルネサステクノロジは震災の影響により大幅に減産か・・・
当座は少々高くてもARMを使ってしのぐしかないのか
luabind使ったらビルド時間が長くなった。
どのバインダも一長一短だな
luaJITさんが、 ARM(ARMv5+, ARM9E+, soft-float)にやってきた
Luaでエラーが発生したり、
coroutine.yield したりしてスクリプトが中断状態にあるときに、
その時点で実行中のスクリプトファイル名(または関数名)と行番号
を得るにはどうすればいいんですか?
>>92 返信遅くなって申し訳ないです。
参考になりました。ありがとうございました。
>>96 露骨にAndroidを狙ってくる・・・いやらしい・・・
ん?スマフォはARMv5TEとv7か
LuaJITのCPU移植は、スポンサー(=商業的に有益な会社)がいたらやるスタンスなので、
今回も、スマートフォン的に中途半端なので、組み込み目的だと思う。
QUALCOMM Inc. has sponsored an ARM port of LuaJIT 2.0 in January 2011.
http://luajit.org/sponsors.html
汎用性の全くないPPC e500v2への移植と違って、今回は、Androidでも動くから有難いけどね。
AngelScriptで、スクリプト側で #define が使えるようにしたいんだけど、
手軽に組み込めるCプリプロセッサある?
それともScriptBuilderアドオンを改造するほうが楽?
boost使っていい環境なら、boost::wave使うのもいいかも。
#include使った時にエラーの場所がきちっと出せないって難点があるけど。
LuaとC/C++の連携ってbindツール使うのが一般的なのですか
スタックガリガリやるとか自分でツールつくっちゃうとかでも行けちゃうような気がするのですが
初心者の僕にアドバイスください
車輪の再発明でググってください
手動で2〜3個クラス登録してみればなぜツールが必要かは理解できるかと思います。
あとは自分で作るか、誰か作ったのを使うか、の話でしかないです
どうぞどうぞ
JavaならクラスとGCがあるのに、なぜクラスのないLuaとGCのないC/C++を使うのか
理解できないと思う。
少なくとも再利用という観点では絶対に理解できない。
Javaみたいなリッチな環境が必要なものはお呼びでないのでお引き取り下さい
クラスがあれば再利用性が高いとか未だに信じてるひとは
お呼びでないのでお引き取りください
AngelScript|Д`)ジー
Javaなんて一番中途半端でいらない子じゃないか
確か世界で一番使われているプログラミング言語がJavaだったはず。
2位3位がC、C++だった。
そりゃ一山いくらのIT土方専用言語だし・・・
バインダって細かい所に手が届かなくてもどかしくなりませんか?
「確か世界で一番使われているプログラミング言語がJavaだったはず。
2位3位がC、C++だった。」
キリッ
なんで煽ってるのかわからん。
煽ってるんじゃなくて、大雑把な事しか喋れないのだ
例えば、Cは別としてC++はJavaに似てるよね、みたいな細かい話になったら困るわけだ
>>119 ソースが公開されてないバインダなんてないんだぜ
>>119 手書きと似ても似つかないようなのは駄目だよな
CGIみたいに、手書きに近い手続きで出力すればいいかもしれない
VBAからLua使えますか?
DynaWrapでDLLを呼び出す方法
var Lua = new ActiveXObject("DynamicWrapper");
Lua.Register("lua5.1.dll", "luaL_newstate", "f=s", "r=h");
Lua.Register("lua5.1.dll", "lua_close", "f=s", "i=h");
Lua.Register("lua5.1.dll", "luaL_openlibs", "f=s", "i=h");
Lua.Register("lua5.1.dll", "luaL_loadstring", "f=s", "i=hs", "r=l");
Lua.Register("lua5.1.dll", "lua_pcall", "f=s", "i=hlll", "r=l");
var L = Lua.luaL_newstate();
Lua.luaL_openlibs(L);
Lua.luaL_loadstring(L,
"f=io.open('out.txt','w')" + "\n" +
"f:write('Hello World!')" + "\n" +
"f:close()" + "\n");
Lua.lua_pcall(L,0,-1,0);
Lua.lua_close(L);
あとはCOMで包んであげる方法があるね
LuaとSquirrelどっちが良いんだよ?
実行速度と普及度はLua
言語仕様はSquirrel
だれか Lua VM で動く squirrel つくってくれ
130 :
デフォルトの名無しさん:2011/05/12(木) 09:49:02.13
Javascript(V8)でRubyを実装した
ColdRubyなんて処理系があるそうな。
LuaJIT 2.0.0-beta7 has been released
キタ━━━━(゚∀゚)━━━━ッ!!
って思ったらコンパイル通せねぇ('A`)
なんでLuaJIT2はこんなに速いんだ?
LuaJIT1から比較しても圧倒的じゃないか
これで文法にへんな癖が無ければいうことないんだが…
スクリプトななくてもGCCコンパイラをアプリに組み込んだ方が速い動的コードを生成出来るんじゃないですか?
したければどうぞ。誰も止めたりはしないよ!
GPLに感染するんじゃね?
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua JIT2!!
彡、 |∪| /
/ __ ヽノ /
(___)
弟がGPLに感染してしまった
何とかして救ってやりたい
救えないから諦めろ
AngelScriptJIT|Д`)ジー
jitよりjetのほうがかっこいいし速そう
java のJETは、商用AOTですた。
AngelScriptが地味にバージョンアップしてた
LuaでサクっとGUIる為のフレームってありましたっけ?
質問です。どなたかお答えいただけると助かります。
Lua側からC言語の関数を呼んでいるときに、
関数内でブレークポイント貼ると、
パソコンがフリーズすることあります。
(luaL_newstate() 〜 lua_close()の間)
どこか想定されるミスはありますでしょうか…。
特に他特殊なことはしてないですが、
スレッド作って回しています。
(Windows7でVisualStudio2005使用です←だからかな…?)
>>146 直接関係があるか分からんが、
デバッグ実行を開始するとフリーズする
のかと思えるくらいDLL読み込みで待たされることはよくあるな。
>>147 ぐーぬぬ。
なんかもう完全にフリーズしてしまうんですよね…。
2010とか試してみますわ〜
2010Express試したけどステップオーバーしてるとやっぱりフリーズ。
まいりました…
Lua使わなくてもスレッド2つ以上動かしながらデバッグしてると
結構な頻度でフリーズしたよ
>>150 マジっすか…。
もうしょうがないんですかね〜。
「詳細なテキストサービス」をオフにすると改善する可能性がある。
っていう情報を得たので試してみたんですけど、結果は同じでした。
Lua関係ないとしたらスレチですね。
調べてみます…。
ありがとうございました。
luaで文字列の状態テーブルがあって、それをテーブルに直すのに最も早い方法は?
s="{1,2,3}"
t= {1,2,3}
sからtに変換する感じで
>>153 s="{1,2,3}"
t={}
asert(loadstring("t="..s))()
typoった
> asert(loadstring("t="..s))()
assert(loadstring("t="..s))()
スコープとか考えると
t = loadstring('return '..s)()
の方が個人的には好みかな
assertはお好みで
Luaで配列をループ処理させるときに、
tbl = { 1, 2, 3}
for i, v in tbl do
doSomeThing(v)
end
みたいなfor文を書いて、使いもしないインデックス'i'を書くことが非常に美しくないと感じているのだが、貴兄はどのように処理しているのだろうか?
for _, v in ... do とかで捨てる
使わないダミー変数なんてよくある話でさ
luaの配列って
x = {}
x[100000]=0
x[100000]=nil
ってしたら今後xがなくなるまでずっとメモリ上のサイズは100000要素分のまま?
>>158 その書き方がインデクスを使わないことを明示していて良さそうですね。
くだらねぇー
いちいちくだらねえとか書くなよと思って念のために読み返したら確かにくだらなかった
お前らの書き込みの方が下らない
なんというブーメラン
luaってまともなリファレンス無いよね
なんかどのドキュメントも筆者の書くのだりぃって気持ちが伝わってくる
>>166 具体的にどういった部分がまともではないのかを提起しないと話にならん
VC2008でC++を使っています。
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"}
でLuaのヘッダのインクルードまでは動作しましたが
lua_State* L;でLuaステートの作成を行ってから
lua_open()やlua_newstate()等どのLua関数を呼び出しても
「1>○○○.obj : error LNK2001: 外部シンボル "_luaL_newstate" は未解決です。」
のエラーが表示されます。
何を行えば解決するでしょうか
libファイルをリンクしましょう
解決しました、ありがとうございます
ものすごくテンションあがってきました
lua_pushstringなどで内部でメモリ確保に失敗した場合にできる悪あがきはありますか?
メモリを増設する
>>172 スタックが足りなくなる可能性があるならlua_checkstackで確認
メモリが足りなくなる可能性があるならlua_newstateでアロケータ指定
メモリが足りなくなってるなら、自前のアロケータ使ってるならそいつに追加メモリを
割り当てられないか検討
もしデフォルトのmallocなら割と詰んでる。キャッシュ処理とか実装してるなら掃除するとか
luaでprintの出力先変えるのってどうするのが正しいの?
print = myprint
luaとc++でオブジェクトを共有したいときはどうすればいいんだ?
ルアのガベコレとCPPの参照カウントで二重管理になってもったいない気がするんだが……
今はCPPの参照カウントをルアのガベコレでデクリメントさせてるけど
C++側で管理するならluaにポインタだけ渡すとか。
逆もできる。
あー
>CPPの参照カウントをルアのガベコレでデクリメントさせてる
ならほぼ最適解じゃない?
>>179 Cで管理してluaにポインタだけ渡してたら型チェックめんどくさくね?
luaL_checkudataが使えないと自分で型チェック書かないといけない
Lua の assert を全無視するような(リリース版コンパイルみたいな)
オプションってある?
int main(void) {
lua_State *L = lua_open();
#ifdef NDEBUG
if(luaL_loadstring(L, "assert = function(...) return ... end") || lua_pcall(L, 0, 0, 0))
{
puts("err"); return 1;
}
#endif
//いつもの処理
lua_close(L);
return 0;
}
Cに合わせてデバッグ切り替えるならこんな感じかな
なるほど、上書きしてしまうのか。
assert("ほげほげ")
コンパイル済みソースに "ほげほげ" の部分が現れないようにしたかったんだけど、
プリプロセッサでもつくらないと無理ぽいね
#define assert(x) true
みたいなのが一発でできればいいのに...
AngelScript|Д`)ジー
AngelScript|Д`)つboost::wave
AngelScript|`) boost::wave
>>184 assert(...)
assert(...)()
a,b,..=assert(...)
用法マチマチだから厳しいと思うよ
lightuserdataの型を調べるにはどうすれば?
そういう関数を自分でつくる
lighuserdata はよーするに lua はいっさい関与しませんよ、ってデータなので、
その管理の全責任は作った人にある
struct MyData {
int type;
void *ptr;
};
てのをつくって、必ずこれを渡すようにすれば。
MyData data;
data.type = MyObject;
data.ptr = (void *)myObject;
lua_pushlightuserdata(ls, &data);
MyData *arg = (MyData*)lua_tolightuserdata(ls, -1);
switch (arg->type) {
case ...
};
グローバルか、Luaレジストリに型定数をおいておけばいい
LuaとC++一緒に使ってるとプログラミングの仕方に迷うわぁ。
Luaのほうにオブジェクト指向を意識してインスタンスのsetter/getterメソッド作ってるのがなんか馬鹿らしい。
Luaで例外ってどうやって使うのか
インクルードヘッダみろって言われて見てもよくわからないし
>>191 setgetのないクラス設計にすればいいよ
AngelScript|Д`)ノ<OOPと聞いて飛んできました
自分はluabindで
.property("x", &A::GetX, &A::SetX)
ってやって、C++からはget/setで、Luaからはpublic変数みたいにして
アクセスしちゃう感じで統一してる
メソッドを作るのが馬鹿らしいっていうのは
(多重)継承しないでコンポジションをするのが馬鹿らしいっていうのと同じに見える
だからたぶん(多重)継承の問題と同じ結論になる
(´\r-、 ┼ + /`/`) +
┼ (\. \! * // ,/) *
+ * (ヽ、 \ + * / /) +
⊂ニ ) * + ( ニ⊃
* + ⊂、 ( ∩___∩ ノ ⊃ + *
(/(/ ヽ | ノ ヽ / 、)ヽ) ┼
+ (/ ∨ ● ●レ /⌒) 、)ヽ)
* (/' | ( _●_) ミ' /、)、)´ +
+ (/'ヽ 彡、 |∪| ノ / AngelScript!!
+ / __ヽノ / * +
┼ (___) / +
最初からC++に最適化されたLuaのような言語が在ればなぁ・・・
メタテーブル使いまくるからswitch文とかパターンマッチ欲しいなぁ。
Rubyみたメソッド名に?使えると戻り値が真偽ってわかりやすいんだが。
とここで言ってもなんの意味もない!
AngelScript|Д`)ジー
スクリプト言語による効率的ゲーム開発のclass.luaで
attempt to index local 'self' (a number value)エラーが出るんだけど。。。
何が原因かわからん、、、
>>201 t:func(...) と t.func(...) の違いが分かってないんじゃない?
>>202 ありがとうございます。
なんかしらないけど動きました。。。失礼しました。
ここをなんか知らないけどで済ませると死ぬよ
>>204 ありがとうございます。もっと基礎を勉強します。
しかし読みにくいソースだなぁ。。。こんなもんなのかな
AngelScript|Д`)ジー
t:func()とt.func()の違いはC++分かってれば分かると思うぞ
C++が暗黙的にやってくれてるのをLuaはやってくれないだけで
どっちもthis(luaはself)を関数に渡してクラスという仕組みをやってる
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
(´\r-、 ┼ + /`/`) +
┼ (\. \! * // ,/) *
+ * (ヽ、 \ + * / /) +
⊂ニ ) * + ( ニ⊃
* + ⊂、 ( ∩___∩ ノ ⊃ + *
(/(/ ヽ | ノ ヽ / 、)ヽ) ┼
+ (/ ∨ ● ●レ /⌒) 、)ヽ)
* (/' | ( _●_) ミ' /、)、)´ +
+ (/'ヽ 彡、 |∪| ノ / AngelScript!!
+ / __ヽノ / * +
┼ (___) / +
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
すみません、luaスクリプトからc++のシングルトンクラスのメンバをコールしたいときはどうすれば良いですか?
Hoge::GetInstance()->load()こんなのを呼びたいです。
グローバル関数でラップして公開すればよいですか?
あ、すみませんなんでもないです。。。スレ汚してしまい申しわけございません
組み込み用途について書いてないのか
3.0には対応してるの?
すみません、Lua初心者なのですが、cからスクリプト関数を実行したくて、loadfileしたあと、getglobalしてpcallするとpcallでエラーになる。
loadfileしたあとにpcallしてからgetglobalしてpcallすると大丈夫。
なんでpcallを2回呼ぶ必要があるの?
引数の数とかちゃんと指定した?
>>217 loadfileしただけじゃLuaに書いた関数が
その名前でgetglobalできるわけじゃねーよ
function hoge() ... end
はhogeという大域変数に関数オブジェクトを突っ込むと解釈されるので
まずはこのコードをloadするだけじゃなくてpcallで実行する必要がある
220 :
デフォルトの名無しさん:2011/06/10(金) 22:26:02.75
トン。
でもhoge()は例えば引数が2個なんだけど、1回目のpcallの時は引数0個で
で呼んでいいみたい(それか、引数0個で呼ばないとだめなのかも)。
それはいいのかな?
222 :
デフォルトの名無しさん:2011/06/10(金) 23:10:58.54
このリファレンスはもちろん真っ先に読んでたんだけど、
pcallを2回呼ぶ解説とかは見つけられなかった。
どの辺りを読んだらいいか教えて欲しいです。
225 :
デフォルトの名無しさん:2011/06/10(金) 23:44:33.71
いや、リファレンス読むことを薦められたので、
>>219の書いていることが
どこかで説明されてるのかなと思って。
>>223によると、1回目のpcallでチャンクをコンパイルしてるってことなのかな?
しかしloadfile後に必ず1回目のpcallが必要なんだったら、loadfileの中で
やってくれればいいのに。
226 :
デフォルトの名無しさん:2011/06/11(土) 00:08:04.84
dofile使えばいいじゃん
>>225 無名関数ってものが分かってないでしょ?
>>215 対象読者
Squrrelに興味のある方(初心者、または初心者に教える方)。組み込み言語に興味のある方。
>>216 現在β版であり、正式公開版では対応しているといいなあ〜
lua_topointerで関数を取得できても
呼び出したりすることは出来ないのですか?
ドキュメントにこれはデバッグ用の情報専用ですと書かれてる
むしろなんでそういうことができるのかもと思ったのかに興味があるw
>>230 いや、関数型を受け取りたいなと思いまして
>>229 >>231 出来るよ。
int call_lua_function(lua_State *L) {
if( lua_gettop(L)>=1 && lua_type(L,-1) == LUA_TFUNCTION ) {
lua_pcall(L, 0, LUA_MULTRET, 0);
}
return 0;
}
int call_c_function(lua_State *L) {
void (*pCFunction)();
if( lua_gettop(L)>=1 && lua_type(L,-1) == LUA_TLIGHTUSERDATA ) {
pCFunction = (void(*)()) lua_topointer(L,-1);
pCFunction();
}
return 0;
}
void HelloWorld() { printf("Hello C Function!\n"); }
int get_c_function(lua_State *L) {
lua_pushlightuserdata(L, (void*)&HelloWorld);
return 1;
}
-- test.lua
call_lua_function( function() print("Hello Lua Function") end )
call_c_function(get_c_function())
ちょっと興味を持って見てるんだけど、呼び出しとか引数渡しとかすんげーめんどくさいね。
普通に引数で呼び出すにはラップ関数書かないといけないのかな。
UWSCみたいなスクリプトの関数を呼び出す方法とかもちょっとまだ分からないし。
AngelScript|Д`)ジー
あー、でもC++側からスクリプトの関数呼び出す時はそんなに手間変わらんか。
Easy things should be easy and hard things should be possible
という言葉があるが
可能であることの評価が低すぎる
効率が良いことしか評価されなくなってるのかな
>>233 luabindというものがあってだな・・・
lua_State *L = luaL_newstate();
luaL_openlibs(L);
open(L);
{
luaL_dostring(L,"function func1() print('hello') end" "\n");
call_function<void>(L, "func1");
luaL_dostring(L,"function func2(a,b) return a + b end" "\n");
int a = 10, b = 20;
cout << "a + b = " << call_function<int>(L, "func2", a, b) << endl;
luaL_dostring(L,"function func3() return {1,2,3,['X']='XXX'} end" "\n");
object tbl = call_function<object>(L, "func3");
for( luabind::iterator i(tbl),end; i!=end; ++i ) {
cout << i.key() << " is " << *i << endl;
}
luaL_dostring(L, "function dump_table(t) for k,v in pairs(t) do print(k .. ' is ' .. v) end end" "\n");
call_function<void>(L, "dump_table", tbl);
}
lua_close(L);
>>232 ありがとうございます
luaの関数を取っておいて後でpushfunctionみたいなことってできますでしょうか
273です
topointerで取得したアドレスをlua_pushlightuserdataでスタックに積んで
LUA_TFUNCTIONに書き換えれば呼べたけど、たぶんまずいんだろうな
それはスタックから消えてたらおだぶつやね
lua の場合はそういうときは関数をレジストリになげこんでおいて、
C側ではそれのキーを保持しておくのが定石
ただし、整数値のキーは lua が内部的に使っていて衝突の可能性が
あるので、普通は C側のポインタ値を lightuserdata としてキーにする。
静的変数のポインタか、lua の値を C側でとっておくための動的オブジェクトの
ポインタとかをキーにするのが一般的やね。
>>239 LUA_REGISTRYINDEXですね!ありがとうございました
Luaでクラスのインスタンスが連想テーブルだから変数名をtableってしたら
結構作ってから標準のtable関数が消えてることに気づいた…
なんでLuaの関数こんな簡単に死んでしまうん?…orz
標準識別子の書き換えはLuaの便利なところでもありアホなところでもあるな
pythonでも起こる、というか動的言語だとよくある
関数が変数に突っ込める以上仕方ないのかもしれん
いや、予約語とすればいい
だけど、自由を制限しないためにチェックしてないんだろう。
高級言語なのに単項、二項計算とかテーブル操作とかの演算子が少ないのがなぁ。
リスト操作をもっと簡単にしたいんだけど、metatableを全てのテーブルに強制的に束縛させる方法とかないかな?
それつきつめていくとだいたい squirrel になるよw
Luaからシェア奪えそうな組み込みスクリプト出てこないかな
実績が大事よ
目次みるとマニュアル以上のことがかかれてるように見えない件
マニュアル読めない人向けなんだろ
ページサンプルに「公式ドキュメントの翻訳ベースでわかりやすくした内容です」って書いてある
3.0非対応だし、確かに安いけど、ぶっちゃけいま買う理由はないんでないの
>>247 LuaもSquirrelも数千行の短いプログラムでできてんだろ?
なら俺達でも作れるんじゃね?
採用実績と速度を超えるのが至難
このレベルか・・・
256 :
見習い中:2011/06/13(月) 12:15:07.57
Luaの注意点
数値はDouble型。型指定は基本的にできない。ポインタ型を32ビット変数として使う方法がある。
Doubleのせいで計算速度が遅くなるだけでなく、キャストで化けることあり。
SciTEの読みはサイト(らしい)。ゼロの使い魔か?
エラーの際のlua_atpanicにはお世話になりそう。
日本語未対応。対応バージョンもなくもない。
C言語と相互運用が可能だが、なんかしょっぱなからめんどくさい。
Lua側はシンプルなので、間違ってはいないのかも。
squirrel との比較
クラスがなく、冗長な記述になる。
C++との親和性が低い
continue がない。やっぱり必要?
ビット演算 が弱い。あれ?ライブラリは・・
>>214 > Squirrelの前にはLuaとかもあって、海外とかだとわりと積極的に使われていたのではないでしょうか。
> 汎用的なものと組み込み言語というのはメジャーになってきた、というような雰囲気ですね。
>
> Squirrelの場合、クラスベースの考え方が通用する分、僕はやさしいなと感じます。
> Luaとかはわりとかけ離れているというか、かけ離れているとまでは言わないですが、単純に見た目としての問題って言うんですかね、
> ある程度プログラミングのたしなみのある人が見えればやってることは理解できるんですけども、
> ほんとにSquirrelの方が分かりやすいなっていう感じがします。
> PythonやRubyも文法とか文化が違う感じが若干しますね。
なるほど
∧_∧ / ̄ ̄ ̄ ̄
( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
最低でもCの組み込み型位は標準対応してほしいよね
グルーコード作りたいだけなのにtolua++とか覚えて時間とられるのは本末転倒だな・・・
>>256 >数値はDouble型。型指定は基本的にできない。ポインタ型を32ビット変数として使う方法がある。
数値型はdouble以外にも割り当てられなかったっけ?
>Doubleのせいで計算速度が遅くなるだけでなく
そもそも計算速度が問題になるほど大量の四則演算を行う処理を
luaで書くの?そういう所はアルゴリズムを固定小数点化やSSEで
対応等するべきであってスクリプト言語でどうこうする所じゃないような。
今時Doubleなんて、x86ならバカっ速いぞ。
下手にテーブル引いてキャッシュミスしてもたもたするより速い。
っていうか整数持ってるSquirrelさんより速いしなあ
つーかIEEE754っていって?ってやつは浮動小数禁止
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
AngelScript|Д`)ノ<きたわよ
(´\r-、 ┼ + /`/`) +
┼ (\. \! * // ,/) *
+ * (ヽ、 \ + * / /) +
⊂ニ ) * + ( ニ⊃
* + ⊂、 ( ∩___∩ ノ ⊃ + *
(/(/ ヽ | ノ ヽ / 、)ヽ) ┼
+ (/ ∨ ● ●レ /⌒) 、)ヽ)
* (/' | ( _●_) ミ' /、)、)´ +
+ (/'ヽ 彡、 |∪| ノ / AngelScript!!
+ / __ヽノ / * +
┼ (___) / +
270 :
見習い中:2011/06/15(水) 10:38:14.65
普段UWSC使ってるんだけどバイナリデータが弱かったからつなぎ言語もかねて探してたんです。
だから日本語扱えないのと整数値型がそろってないのはかなり痛い。
Luaも日本語化パッチがあったりするけど・・・
ビット演算があったりするけど・・・
セットアップがめんどくさいと配布がしにくいし
squirrel もいいなと思ったけどC++解説サイト見たら「なんか出来そうだな」と思ってみたり。
そうするとAngelScriptってC++にかなり近いから無駄にならないかも?
AngelScriptってGNUでソース配布?まさかプロジェクト全部に感染?
squirrel で日本語
ttp://monsho.blog63.fc2.com/blog-entry-49.html squirrel はASCIIなので、日本語対応はUNICODE宣言が必要。
#define _UNICODE
それだけではwprintf() や vwprintf() で文字化けするので、ロケールを指定する。2007/05/19(土)
setlocale( LC_ALL, "Japanese" ); // 日本語にする
setlocale( LC_ALL, "" ); // 環境に合わせる
@__john_ 悟
Luaはダメだ。 AngelScriptを試してみよう… これでダメだったら、機能を絞るしかないわな…
4月30日 webから
@__john_ 悟
AngelScriptではとりあえず実装可能っぽいけど… 呼び出しコストとかどうなんだろ? GC処理がLuaより管理しやすい分早いかな?
試すしかないかなぁ… はぁ… 資料少ないなぁ。
5月1日 webから
AS1.7.0以降はzlib互換ライセンスにchange!したyow
/ヽ /ヽ
':' ゙''" `':,
ミ ・ω・ ;,
:; . っ Lua!, つ
`:; ,;'
`( /'"`∪
AngelScriptはデフォでASCII、UTF8に対応。
有志のShiftJIS版も一応ある。
ただし、UTF16には対応してないので注意。
Luaのメタテーブルの__callが微妙だなぁ…。
第一引数がテーブル自身で第二引数以降が呼び出しの時の引数だけど、
テーブル(引数)だけじゃなくてテーブル.メソッド(引数)で呼び出したときにも使えるようにならないものか…。
メソッドまでメタテーブル指定するのは面倒くさい。
__indexに関数入れて仕事を振ればいいだけのように読めるけど
まぁそれでいいんだけど__callの使い方が(テーブル,メソッド名,引数1...n)
だと勘違いしてプログラミングしてたからメソッド名が無いって気づいてげんなりして
メソッド名なかったから、使い道あるのかなこれと思って。
__callはほぼユーザーデータ用と割り切った方がいいんじゃない?
関数がファーストクラスでクロージャやコルーチンがあるLuaの範囲じゃ
確かに使いどころが思いつかない
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
__callはC++でいうところの()演算子だと思ってる。
Lua、自由度が高いからいろいろやろうと思うけど、ちょっと進めて後戻りばかりだなぁ…。
他の言語みたいにこういう関数や記法でやれって堅苦しく決まってる奴は面倒くさくてもしぶしぶ従うけど、
標準モジュールが何もないLuaだとテーブル操作も関数にしようか、メタテーブルにしようか、
変数名はどうしようか、クラスは使うか使わないかとかそんなことばかり考えて
修正ばかりで全然先進まない…orz
自分の開発設計技術が無さ過ぎるのが問題っていうのはわかってるけど。
オブジェクト指向 = GCを使うがクロージャを使わない、
と考えると結局どう見てもユーザーデータ用としか思えない
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
Luaみたいにオブジェクトの要素のpublic,private指定ができないと不安になる
継承されて整合性が破壊されないかとかメソッドをnilにされたらどうしようとか気になってしょうがない
そもそもLuaは重厚長大なライブラリを作るための言語じゃないんじゃね。
そういうもの作るんならprivateも必要になるんだろうけど。
その上に乗っかりそれの動作をカスタマイズ(設定orコールバックで)
するための言語だと思う。
lua_Stateってシングルトン的に使うもんなの?
複数作れば同時に動かせたとおもったけど
難しそうでスルーしてたけど環境ってめがっさ便利っぽいな
オブジェクトのメンバ関数のようにLuaコードを呼びたい時とかに重宝しそう
そう、知れば知るほど味があるのがLua。
その他のは・・・・
自分の得意な言語に似せようとするだけのオナニー型といわざるをえない。
Lua、混乱させられる機能ばかりだから、
単一代入の組み込み言語が欲しくなってきた。
そのほうがデバッグもしやすいし。
こうしてまたひとつひとつ
泡沫のようにオナニー言語が生まれては消えてゆくのであった
ああ無常・・・
でも宣言されてない変数はnilを返すってねぇー。
リテラルがあっちゃデバッグしづらくてしょうがねぇよ。普通エラーでしょ。
Luaはそれをエラーに出来るできるのがいいところだよね
機能拡張は他のとこで作業するときに困るけど、機能制限の方向なら悩むことなくさくさくやってしまえばいいよね
strict.lua
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
LuaSJIS対応版以外の本家のって、リテラルでSJIS使えませんよね?
いちいちWideCharToMultiByteをラップしたのを経由してユーザー変数に入るとか
しないといけないのはメンドイ。
あ
[[文字列]]
と書けばSJISリテラルも使えるのか。
ごめん
スタックの指定した位置にあるオブジェクトが
getfieldでアクセスできる要素がnilを含めて存在するオブジェクト
であるかどうかを調べるスマートな方法はある?
再帰的にテーブルかどうか、__indexを持ってるかどうかを繰り返し調べるしかないかな
用途を書いた方が良いかも
その方がスマートな解答がでそう
Lua、テーブルがしょぼ過ぎるから拡張したくてオブジェクトにして色々な操作メソッドつけ足したら
メソッド作らないとipairsとかでテーブルの中身が呼び出されないことに気がついた。
何この使えん言語。
Luaは必要最低限のグルー関数を用意して、あとはなるべくスクリプト内で完結させるような用途に向いてると思う。
>>296 ありがとう。
古いバージョン使ってるから、そういうのあるの知らなかった。
∧_∧ / ̄ ̄ ̄ ̄
( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
lua_State *p1 = lua_open();
lua_State *p2 = lua_open();
p1のスタックからテーブルを取り出してp2のスタックに積むにはどうすれば?
数値や文字列は一回Cを経由すればできるんだけどテーブルは…
>>307 フィールドが数値型や文字列型なら列挙していけば良いだろうけど
関数型あたりは無理だよね
そもそもlua_Stateを分離する必要があるのかってところから見直した方が良いんじゃない?
スクリプト毎にサンドボックス作りたいってだけならそれぞれ独自の環境を割り当てて
共有したいLuaオブジェクトはグローバル環境やレジストリに押し込めるってので過不足ないと思うけど
>>307 数値や文字列でもLuaの値はメタテーブルを持てるので
Lua側のデータを共有したいなら
lua_State *p = lua_open();
lua_State *p1 = lua_newthread(p);
lua_State *p2 = lua_newthread(p);
でやるしかないよ
なぜポインタを共有するんですか
コピーコンストラクタのようなものは何か根本的に駄目なんですか
lua_Stateをひとつ、lua_newthread()を複数で最初に設計して
loadstring()がグローバル変数見に行くんで詰んだ経験ががが。
結局のところシングルトンでおkってことね
lua_State(threadは除く)を複数使うなんて、スクリプトの並列処理が必要で
かつスクリプト間でLuaオブジェクトのやり取りが必要無いって状況くらしか思いつかないな
相互に参照したいオブジェクトだけホストに管理させてMutexで保護すればいんじゃないの
>>313 ゲーム作る時に、敵1匹ごとに仮想マシン1個って感じでやるときかなぁ…
Luaだとそういう場合どうするんだろう。
ねえよww
ボードゲームみたいなのでAIごとにスクリプト使う場合とかあるだろ
マルチスレッドに対応させるとかか。具体的に方法思いつかんけど
>315
さすがにオーバーキル過ぎるだろ。
ロボットの並列制御やってるんじゃないんだから。
>>312 なんか違和感がある
lua_Stateは複数作れるからシングルトンじゃないと思うけど
どういう意味でシングルトンと言ってるの?
>>311 使い方間違ってるんじゃない?
lua_newthreadはコルーチンなので
問題の起きようがないと思うのだが。
>>315 いくつかの動的確保とopenlibsやゲームAPIなどの各種初期化、解放時にはガベコレ
生成破棄が多いゲームでオブジェクトと1対1はどうかとおもう
lua_Stateは共有して環境テーブルをオブジェクトにもたせるのがいいと思うよ
敵=すぐ死ぬMOBみたいに決め付けてないかい
4人格闘ゲーのCPUとかかもよ
ところでDLLじゃなくてEXEからモジュールを提供したい場合ってどうするの?
loadedとかいろいろあるけど全部自前でやらんとだめなのかな
DLLでやれ
異論は認めるが自前の意見がないなら異論もなにもない
>>324 hogeというモジュールなら
LUALIB_API int luaopen_hoge(luaState *L) {...}
という形で提供するのがお約束なので
単純にluaopen_hoge(L);すればいいよ
プリプロセスでLUALIB_APIがどのように置き換わるかは
ご自分で確認しましょう
>>324 >require calls the loader with a single argument, modname.
とあるから
lua_pushcfunction lua_pushstring lua_pcallするべき
そのほうが行儀いいね
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
Yコンビネーションって何者なんですか?
Yコンビネータ?
このスレより関数型言語スレの話題だと思うけど、
fact(x) = ... fact(x - 1) ...
みたいな感じで、再帰がある関数は、自分自身の定義の中に自分自身を使うわけだよね?
で、数学的に厳密な「定義」が必要な場合とか、循環定義は困るので、
fact_norec(f)(x) = ... f(x - 1) ...
みたいにして、
Y(fun) = fun(Y(fun))
(↑この定義ではここで循環定義を使っちゃってるけど、λ計算という理論では
循環定義のないものを定義できる。)
という「Yコンビネータ」を使って、
fact(x) = Y(fact_norec)
みたいに定義できる、という仕掛け。
循環なんて難しい言葉を使わなくても
まだ無いものは使えない、既に有るものは使える、でいいんだが
数学厨は (宗教的な理由で) 時間の概念を認めないんだよね
時間も(半)順序の一種。
認めるも認めないも無いだろ。
>>331 どうもありがとう
なんだかよくわからなかった
>>333 には偏見のために何かよく分からないものが見えているようなのだが、
何がどう見えているのかよく分からない。
そういやLuaのスクリプト内のローカル変数とかってどこに保存されてる?
宣言された関数の専用スロット
Luaでクラスの継承で
Object1にindex,newindex,addなど複数のメタテーブルをセットして
Object2はObject1を継承してさらに複数のメタテーブルをセットしたいのですが、
setmetatableやオブジェクトをオーバーライドなど色々やってみましたが、
Object2はセットしたメタテーブルしか呼び出せません。
どうすればObject1も継承できるでしょうか?
new_hoge = function(base)
local b_ = base
local t_ = {}
setmetatable(t_ , { __index = base } )
local o_ = {}
setmetatable(o_, { __index = setmetatable() } )
変なとこで送信しちゃった
例えば__indexだけだったら↓みたいな感じでいいとおもう
new_hoge = function(base)
local o_ = {}
setmetatable(o_, { __index = setmetatable({ }, { __index = base }) } )
return o_
end
>>339 メタテーブルを入れ子にすればいいだけじゃない?
mt = { oldmt = getmetatable(Object1) or {} }
for k,_ in pairs(mt.oldmt) do
mt[k] = mt.oldmt[k]
end
setmetatable(Object1,mt)
破棄するなら
mt.__index = function(self,k) ... end
super呼ぶなら
mt.index = function(self,k)
...
return mt.oldmt.__index and mt.oldmt.__index(self,k) or nil
end
とかで適当に上書き
__metatable = falseの入ってるクラスを継承するにはどうすれば
>>343 debug.getmetatableやC関数を介せばいけるけど普通はやらない
>>341-342 テーブルの値にメタテーブルを指定すればいいんですね。
メタテーブルのことあまり理解していませんでした。
ありがとうございます。
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
create = function()
local x = 0
local get = function()
return x
end
local inc = function()
x = x + 1
end
return { get = get, inc = inc }
end
obj = create()
obj.inc()
print(obj.get())
こういうふうに書いたほうが安全でよくね?
なんでみんな本やWebで推奨されてる方法を使うのか解らない
安全に拘るならそもそもスクリプトを使うべきじゃないってことなんじゃないかな
>>347 それだと、インスタンスごとに関数を作ることになる
そもそも結論を急ぐ必要がないから
どの方法が普及するかは自然の成り行きに任せればいいんじゃないの
AngelScript|Д`)ノ<グローバルプロパティ?が何か面白いぞ
_this.Hoge();
とかできる
ASは3倍早くなってから出直してきてください
ぼくのASSも3倍出るのがはやくなりたいです><
∧_∧ / ̄ ̄ ̄ ̄
( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
死ね下らんAA貼るカス。
Lua 5.2.0 (beta-rc3)
いつのまにかgoto文が追加されてた
gotoなんて要らんがな
continue文を追加してちやほやされるよりも賢い
goto文とか誰得…
と思ったけどコルーチンを並列化せずに使えるようになるのかな?
面倒くさい宣言書かなくて良くなるなら便利なんだが。
C++のコードをそのまま使えるスクリプトがあったら便利だと思う
調整ビルドではスクリプト、リリースビルドではコンパイルしてくれるの
ふつうにDLLでいい気がするけど。
コンパイルが時間食うから開発中はなるべくしたくないって話じゃね?
C++インタプリタとしては、CINTってのが有名だけど俺は使ったことはない
メタテーブルっていらなくね?メソッドで十分じゃん。
DLLレベルなら動作チェックに比べれば時間なんてほとんど食わないだろ
index,newindex,metatable,gc
よく考えるとこれ以外使ったこと無いわ
動的型はただでさえバグリやすいのにオペレーターまで用意したら訳が分からなくなる
いちいちDLL作ってられるかよ
その感覚がわからん。F5かmakeかするだけだろ。
シンタックスチェックもするしむしろビルドしたほうが安心じゃん。
DLLだと修正してリロードすんのがめんどくさいとおもう
一回アンロードしないといけないじゃん
完全にコールバックな関数だけならいいかもしれんけど
データの引き継ぎとかが起こるとめんどくさくなる
AngelScript|Д`)ジー
Boo....
Lazarusでいいやん
Luaでメタテーブルを参照して値がなければ
メタテーブルに束縛したメタテーブルを参照するってできない?
table = {}
Ex1 = Extend1.new()
Ex2 = Extend2.new()
setmetatable(table,
setmetatable(
{__index = Ex1},{__index = Ex2}))
こんな感じでやってもうまくいかないんだが。
t = setmetatable( { } , { __index = setmetatable( { EX1 } , { __index = { EX2 } } ) )
>>374 レスサンクス。ごめん書き方間違えた…。
tableの中にインスタンスが入ってた場合どうすればいいかな?
obj = {X = 1}
t = setmetatable( obj , { __index = setmetatable( { EX1 } , { __index = { EX2 } } ) )
って感じになってた場合、Ex2のメソッドが実行されたとき、
Ex2の第一引数がEx1になってしまってobjの値を参照できないんだが。
t = setmetatable( obj , { __index = function( _ , k ) return EX1[k] or EX2[k] end } )
>>375 EX2={X=3,ex2=function(self) print("EX2:" .. self.X) end}
EX1={X=2,ex1=function(self) print("EX1:" .. self.X) end}
obj={X=1,obj=function(self) print("obj:" .. self.X) end}
setmetatable(obj , { __index = setmetatable( EX1, { __index=EX2 } ) } )
obj:obj() --> obj:1
obj:ex1() --> obj:1
obj:ex2() --> obj:1
EX2={X=3,ex2=function(self) print("EX2:" .. self.X) end}
EX1={X=2,ex1=function(self) print("EX1:" .. self.X) end}
obj={obj=function(self) print("obj:" .. self.X) end}
setmetatable(obj , { __index = setmetatable( EX1, { __index=EX2 } ) } )
obj:obj() --> obj:2
obj:ex1() --> obj:2
obj:ex2() --> obj:2
特に問題ないようだけど?
測ればわかる
bit、pairs系のmt、公開APIでのdtor、gotoなど
色々更新されてるね
空文が地味に嬉しい
>dtor
RAII/Disposeキタコレと思ったら、tableにメタメソッド
__gcがつかえますよか・・。残念。
metatableはなんか初めて触れると素敵感あふれるけどぶっちゃけ多用するのは害悪だと思う
metaって名前がかっこよすぎるな
もっと恥ずかしい名前にするべきだった
必死だなテーブル
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
>>382 いちおう言っとくけどその変数がブーリアンの場合はorだけじゃできないよ
lua_tointeger()だとtrueが0になる仕様をどうにかしてほしい...
メタテーブルってテーブルを形そのままに拡張できるのがうれしいけど、
もともとリストとかセットとか操作演算子とか用意しといてくれよ。
重複排除がしにくくてしゃーない。
重複排除とか
どこの一神教だよ
Cに組み込むのってどんなメリットが有るの?
コンパイルだりーときとか、リリース後に拡張したい時とか
>>388 ∨∨∨∨∨∨∨∨∨∨
「「「「「「「「「「「 lua_tointeger()だとtrueが0になる仕様をどうにかしてほしい... 」」」」」」」」」」」(キリ!!!ッッ!!!
∧∧∧∧∧∧∧∧∧(キリッッ!キリッッ!!!きリッッッッ!キリッッ!!!!きリッッ!!!
きも
ゲ製から誘導されてきた。
できるだけ単純に書けて、単純な出力をするスクリプト言語を作った。
定義ファイル代わり+シーケンスも多少は書けるってとこ。
興味があったらどうぞ。
ttp://kushi.lv9.org/teco/index.html 元々は2Dゲームのエフェクトアニメ記述用で、スプライトの設定とか、アニメパターンの制御に使ってたもの。
多少は汎用性が欲しいなと思ってたらこんな感じになった。
>>395 実体はアセンブラに組み込むP-codeに近いですか?よく知らないですけど。
VMのソース付きだからコンパイル言語で使うには自由がききそうですね。
「データは作ってやるからあとはてめーでやれ」
>>395 何処から本体DL出来るのかと探し回った挙句
ソースからやっとURL見つけた
なんでこんなところにと思ったが
どうやらIEなら普通に表示されてるようだ
Luaでクラス作りで質問です。
obj.keyでインスタンスの値を返してobj.key(Arg)でメソッドを実行するという風にしたいのですが、
setmetatable({key1 = function(Arg) … end, -- メソッド
key2 = function(Arg) … end,
…… ……},
{__index = function(self,key) -- インスタンス
if key == key1 then
……
return result
elseif key == key2 then
……
return result
…………
end})
今は上のようにメソッドのテーブルにメタテーブルでインスタンスを返す関数をくっつけて実装しているのですが、
メタテーブルをなくしてメソッドとインスタンスを一つのテーブルにまとめて
すっきりさせたいと思ったのですがそういうことはできないでしょうか?
obj.keyで帰ってきた関数を()で評価するところを、obj.keyで関数を評価して値を返すところまでやりたいということです。
メタテーブルなしだと無理じゃねーかな
つーかそんなコストかけて分かりにくくするなんてことしないほうがいい
スクリプトは簡潔に小さくが基本
>>399 get_a(){return a++;}
みたいのか
嫌過ぎるw
>>400-401 get()ってメソッド書くより直接インスタンス受け取ったほうが
使う側でわかりやすいと思ったんですが、やっぱり複雑すぎますね。
やめておきます。
403 :
395:2011/07/09(土) 02:10:52.48
レスありがとう。
>>396 P-code って初めて聞いたけど、似たようなものだと思うよ。独自のVM用命令って意味で。
出力バイナリを簡単に、詳細を明確にしておけば、いじりやすいかと思った。
コンパイラのソースも公開予定だけど、これはもうちょい先になる。プライベートな事情で。
>>398 HTMLのチェックしたらひどいことになってたわ。
修正しておいた。報告ありがとう。
∧_∧ / ̄ ̄ ̄ ̄
( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
405 :
デフォルトの名無しさん:2011/07/09(土) 10:35:52.59
日本製は歓迎したいところだけど、使うとなるとちゃんと何年も継続してくれるかが不安だ。
407 :
399:2011/07/09(土) 17:48:58.34
すみません。まだちょっと諦めきれないところがあるので
メタテーブルの設定をする関数を作ろうと思っているのですが、
setmetatable({},{__index = setmetatable({},{__index = setmetatable({} …
とメタテーブルの__indexの値がテーブルなら、さらにメタテーブルを付けて入れ子にできますが、
setmetatable({},{__index = function …
と__indexの値を関数にした場合はそのメタテーブルにさらにメタテーブルを付けたりして
入れ子にすることはできないのでしょうか?
local mt = getmetatable(t) or {}
setmetatable(t, {
__index = function(self,k)
return mt.__index and mt.__index(self,k) or nil
end})
__index以外の要素もあったらめんどくさいよね、それって
>>387 local truthy_false = {}
function truthy(x) return x==false and truthy_false or x end
function falsy(x) if x==truthy_false then return false else return x end end
return falsy( truthy(EX1[k]) or EX2[k] )
411 :
407:2011/07/09(土) 23:10:07.52
>>408 ありがとうございます。
論理演算で関数つなげれるって便利ですね。
>>409 基底に垂れ流すだけなら
inherit_mt[k] = base_mt[k]
で参照してあげるだけなので
rideして何をするか次第じゃないかな
クラスとか継承に向いてないよねLuaって
プロトタイプベースの継承は、苦手ですか?
クラスベースの継承を使いたいなら、クロージャでクラス実装したライブラリ探すとか?
416 :
395:2011/07/10(日) 02:17:52.79
>>406 それを保証するのは難しいね。好きで続けられる分にはいいんだけど。
もし飽きたら重荷を背負い続けることになるし、放棄したら無責任と思われそう。
俺自身がこれを使い続けるのが、動機的にもモチベ的にも一番いい手だろうなぁ。
ちょいと調べてみたが、LuaもPythonも意外と歴史があるんだね。
Lua 18歳
Python 20歳
Squirrel 8歳
>>415 javascriptみたいで簡単じゃん
そもそもプロトタイプベースの継承が、継承には適してないし
ルアにはメタテーブルの問題があるからよけいに継承しにくい
そして厄介なことにクラスの実現方法が何パターンもある
結局のところ基底クラスをソースコードレベルでよく読んで
それから派生クラスのファクトリを書かなければならない
カプセル化や抽象化の概念に喧嘩売ってる
継承に向いてる言語だなんて考えるほうがオカシイ
>>419 クラスの実現方法が何パターンもあるのは事実であって意見ではない
意見を喧嘩させることはできるが事実は喧嘩しない
おまえは5分以内で分からないとキレるのか
jsと同じルールに落ち着くんじゃね?
AngelScript|Д`)<何か面倒くさい事になってるなオイ
Luaは.と:の違いが視覚的に分かりにくい時点でもうね
チェック機構は組めるけど
そんなところで型チェックとか本末転倒だろ?
要するにだな
もっと開発が活発になるようSquirrel使って下さいお願いします
> 視覚的に分かりにくい
それはフォントやエディタの色分けに問題があるってだけでLuaと関係なくね?
直感的って言ったほうが正しいんじゃね
delphiの := を思い出した。
慣れればどーってこと無いさ。
フォントやエディタの色分けで.と:の区別がついたところで
どちらを使うのが正しいのかは見ただけでは分からない
コーディング規約で縛るとかで対策してる?
create = function()
local x = 0
local set = function(a) x = a end
local get = function() return x end
return { set = set, get = get }
end
local obj = create()
obj.set(10)
print(obj.get())
これで統一するのが一番分かりやすいし安全
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
AngelScript|Д`)<型チェック?任せておけ
AngelScriptは早くJIT動くようにしてよね
スクリプトがアップデートされる度に本体のソフトが完成しない ことに。
Luaにしとけばよかった。
それ何てd言語?
Luaって速度で負けたらあっという間に廃れそう
速度以外だとポータブルなところがメリットかなぁ。
Pythonあたりを組み込むよりかなり手間が少ない。
PythonがLuaに速度で勝てる要素なんて今後も皆無だよ
用途に応じてベストの物を使うのがおりこうさんだ
もうLuaでの資産ができちゃってるから、気軽に移行できない。
441 :
デフォルトの名無しさん:2011/07/13(水) 08:31:14.48
Squirrel 久々使ってみようと思ったらバージョンが 3 になってたのでwktkしたのに、
バインド系(sqbind, SqPlus, Squadd, Sqrqt)が軒並み更新とまってるじゃん…
そんなに人気ないの?
つーか今注目のバインダってないのん?age
∧_∧ / ̄ ̄ ̄ ̄
( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
いい加減2バイト圏の文字列に対応したバージョンアップして欲しいな → Lua
UTFは対応してるだろ?
>>445 結構使いやすいと思うんだけどなぁ。
>>447 SquirrelがUTF16、AngelScriptがUTF8に対応してるんだっけか?
>>450 というか対応って何?
所詮文字列も配列の一種じゃん。
ソースの対応じゃなくて、入出力の文字コードのこったろ?
それは対応「させてる」って話であって「してる」じゃないんでね?
語りえないことについて、対応が対応がと呪文を唱えるのは
かっこわるい
IronLuaってないの?
どのみちLuaが文字コード対応なんて贅肉を取り入れることはないから安心しなょ
>>456 LuaInterfaceとNuaってのがある
要するに
print([[ハロワ]])
みたいな代替手段を使ったり、ソース弄ったりコンパイルし直したりせずに
print("ハロワ")
でSJISに代表されるような文字コードでも化けずに表示できるようにならんかなって事だろ?
Lua側で文字を弄らず出力せず、組み込んだアプリ側でやればいいってお話?
対応対応いってるやつは素人
まあソースにわざわざSJIS埋め込むメリットないし。
そーっすね
しょーゆーこと
ここ参考にしてやっとこさ__index〜__callまでキー全部入りのメタテーブル設定したクラスを継承する関数作れた。
サンクスコ。
では次はオーバーロードとオーバーライドを指定して継承できるように改良して下さい
ctor/dtor って constructor と destructor か
repl の無い言語は組み込み言語としては魅力を感じないな
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
(´\r-、 ┼ + /`/`) +
┼ (\. \! * // ,/) *
+ * (ヽ、 \ + * / /) +
⊂ニ ) * + ( ニ⊃
* + ⊂、 ( ∩___∩ ノ ⊃ + *
(/(/ ヽ | ノ ヽ / 、)ヽ) ┼
+ (/ ∨ ● ●レ /⌒) 、)ヽ)
* (/' | ( _●_) ミ' /、)、)´ +
+ (/'ヽ 彡、 |∪| ノ / AngelScript!!
+ / __ヽノ / * +
┼ (___) / +
ASのほうがカッコイイな
羽が生えてるから遅いのか
AngelScriptって名前が恥ずかしくて使えない。厨二っぽい
禿同
GodScriptとかHolyScriptとかJusticeScriptとかLegendScriptとかのほうがかっこいい
ImagineBreakerScript
AngelScript良さそうじゃん!
型チェックしてるれるの?
型チェックって動的型付けなら数字か文字かリストかくらいでしょ?
いちいち宣言で型を書かなきゃいけない面倒くささと比べれば
型のチェックなんて自分でやればいいんじゃねの?
リストとかテーブルを一つの型として扱って
目的を達成できるならそうかもね
カプセル化がしっかりしてればいちいち型チェックなんてしなくていいんだけどな
C++で言うと
void hoge::fuga() { assert(typeid(this) == typeid(hoge())); ・・・ }
なんてするアホは居ない
でもluaだと
selfが期待した型じゃないなんてことはよくある(意図的にしたり、.と:のタイプミスだったり)
ほかの引数も同様だ
宣言を書く手間と
もっとガチガチに強固なクラスを作る機能を提供してくれてもいいじゃないか
>>481 チェックコード書く手間と宣言書く手間って大差なくね?
>>480 静的型付け言語だからね。
他のスクリプト言語と比べて、デフォルトで連想配列とコルーチンオブジェクトがないのが難点かな?
そんなにピキピキガチガチでクラスとか型チェックしたいならC++使ってろ。
Lua厨の敗北宣言である
むなしい勝利宣言であった
文字コードも型チェックも完成するまでにバージョンがいくつ上がるかわからんが
できれば最弱バージョンから最強バージョンに一回だけアップデートしたい
>>489 バージョンアップしたら以前のスクリプトが使えなくなった、ってそんなに多いかな?
492 :
デフォルトの名無しさん:2011/07/20(水) 06:20:15.30
Lua の coroutine.create() ってのは重い処理なのでしょうか?
それから coroutine.resume() で関数抜けた後(coroutine.status == "dead"な状態)に
そのコルーチンオブジェクト?は再利用は可能でしょうか?
わりと重い処理だとされている。つーか「コルーチン 再利用」とかでググれ
テーブルでFSM作ったほうが速いよ
出来ることの差なんてないし
>>493 dクス。luabindでの例とかありますね。
しかしluaでほとんど処理させてるんで導入したくないでござる。
>>494 状態の数が多い処理だと記述は確かに楽なんですけどね。
それもアリかもですね。
海外のコードみてても普通にcreateして変数上書きしてたりしますね。
速度関係無いなら別にこれでいいかな。
何か簡単ならやっとこうと思ったんですけどね。
使い回すコード書いてベンチとったけどあんまり速くならんかった記憶があるが、実装適当だったせいかも
「スクリプト言語による〜」でもわざわざ言及されてたし、差が出るかどうか計った人いたら教えて欲しい
ゲームとかシビアな要求がある場合だけでいいんじゃん?所詮スクリプトだし
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
. -―- .
/ ヽ
// ',
| { _____ |
(⌒ヽ7´ ``ヒニ¨ヽ
ヽ、..二二二二二二二. -r‐''′ Lua!!
/´ 〉'">、、,,.ィ二¨' {. ヽ _ _
`r、| ゙._(9,)Y´_(9_l′ ) ( , -'′ `¨¨´ ̄`ヽ、
{(,| `'''7、,. 、 ⌒ |/ニY { \
ヾ| ^'^ ′-、 ,ノr')リ ,ゝ、ー`――-'- ∠,_ ノ
| 「匸匸匚| '"|ィ'( (,ノ,r'゙へ. ̄ ̄,二ニ、゙}了
, ヘー‐- 、 l | /^''⌒| | | ,ゝ )、,>(_9,`!i!}i!ィ_9,) |人
-‐ノ .ヘー‐-ィ ヽ !‐}__,..ノ || /-‐ヽ| -イ,__,.>‐ ハ }
''"//ヽー、 ノヽ∧ `ー一'´ / |′ 丿! , -===- 、 }くー- ..._
//^\ ヾ-、 :| ハ  ̄ / ノ |. { {ハ. V'二'二ソ ノ| | `ヽ
,ノ ヽ,_ ヽノヽ_)ノ:l 'ーー<. / |. ヽヽヽ._ `二¨´ /ノ ノ
/ <^_,.イ `r‐'゙ :::ヽ \ `丶、 |、 \\'ー--‐''"//
\___,/| ! ::::::l、 \ \| \ \ヽ / ノ
全くLua厨のキモさは天性だな。( ´,_ゝ`)プッ
アンヘルスクリプト最強
シナリオのあるゲームならLUAの有用性も分かるんだけど、組み込み家電で活用できる用途ってあるかな?
>組み込み家電
そんな餌で(ry
Pornってやつが組み込み家電でも使えなかったっけ?
確かAcceedが組み込み家電向けの言語だったと思う。
>>503 いや、すまん。組み込み家電っつーか、組み込み機器でも良いんだけど。
今のところヤマハのルーターぐらいしか応用例知らなくて。
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
Acceedいいな。まさにLuaとAngelScriptの良いとこ取りだね。
参考リンクくれ、Acceed
ぐぐれ。
無いのか。
Acceed、何かアダルトビデオのメーカーばっかり引っかかるな
Acceedすごすぎwこういうの待ってたんだよw
AcceedのURL貼ってくれ。ゲイビデオしかヒットしない。
なにかに名前つけるときは検索されたときのこと考えて慎重に付けないとだめだな
仮にAcceedがどんなに良い言語だったとしても検索してゲイビデオが出てきたら普及する前に潰れるわ
おまいら釣られすぎw
いや、釣られたのは俺かorz
オナニー言語イラネ
やたーオレオレスクリプトできたよー
>>519 GitHubかBitBucketで公開して
debug.debug() ってコンソール用なんですかね?
yes, you can.
>>522 ありがとうございます。
じゃあ組み込み用途には使えないって事ですね…
あー、要するに struct lua_Debug を中心としたデバッグインターフェイスを利用して、
アプリでデバッガ用意してねって話なんですね。
これはLuaに限らず、Squirrelでも同じと。
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
コンソールベースのデバッガがあれば十分なんで lua.c パクってきて、
アプリが管理してる lua_State* 渡してコンソール画面だしてやる感じにします。
いや〜しかし面白いですねコレ。
yes, we can.
> アプリが管理してる lua_State* 渡してコンソール画面だしてやる感じにします。
それが出来る状況ならdebug.debugも可能だと思うw
ゲームだとゲーム画面内にコンソール描いてるよな。
そんな感じじゃないのかな。
Luaがスレッドセーフなことを確認しました
× Luaがスレッドセーフなことを確認しました
○ Luaのリファレンスを一読しました
lua も squirrel も全然スレッドセーフじゃないぞ
>>532 だから確認したって。
スレッド毎にステート作ってやればぜんぜんOK。
それはスレッドセーフとは言わない
<lua.h>の関数がreentrantだっていうのを翻訳したんだろうな
訳を見て原文を見抜けない人には猫に小判
それぞれの関数そのものは再入可能でスレッドセーフってことで、スレッド毎に完全に独立して動作させることができるCライブラリという意味ではスレッドセーフだな
でもステートと付随するVMの操作を複数のスレッドにまたがって行うことはできないからスクリプト言語としてはスレッドセーフじゃない
>>538 「ステートと付随するVMの操作」ってなによ
スレッド毎VMとか管理地獄になるからやめとけ……
メインスレッドだけで動かしてそこに別機構でメッセージパッシングするのが安全安心
>>540 もう作ったんで。
Luaがスレッド毎VMに耐えることを確認しました。
ちなみにそれほど面倒じゃないです(言語によるのでしょうが)。
それぞれのスクリプト中から相互にグローバル変数/関数を直接見れないのってすごく面倒じゃね?
うむ、それならいい。がんばれ。
Lua使ってたらIDEが構文チェックしてくれないからエラー出まくりで
普通にC++使ってるほうがいいって気付いた。
スクリプト言語ってやっぱりCGI以外で存在意義ってないな。
そうですね。
普通使う時にIDE側に定義足すだろ
すまん誤爆
>>533 それは Lua がスレッドセーフなのではなく、
君のプログラムがスレッドセーフなのである。
業界標準に従った用語法を使わないと、書籍や
論文を読むときに自分が困ることになるので、
勝手なオレ用語は改めた方がいい。
print([[ ]])
print(" ")
print(' ')
print ' '
print " "
いろいろあってどれ使うか迷う
これといった標準がないときには、自分勝手に決めてしまう性格の方が迷いがないね
Luaはスレッドセーフな運用ができる。これで満足か?
業界君ってめんどくさい
>>550 つまりお前のプログラムのバグでスレッドアウトってだけだろ?
Luaのせいにすんなよ
業界に限らずオレオレ用語君は実際困るんだが
鉛筆削りで代用できる言語。それがLua
荒れてるようなのでまとめると
スレッドごとにlua_stateを独立して保持してやれば、スレッド毎に独立して動きます。
こういう意味でLua(のDLL)はスレッドセーフです。
なお、各lua_state間(各スレッド間)で情報共有(グローバルj変数などの共有)が
できるかどうかまでは確認していません。
スレッドセーフって意味は、複数のスレッドからアクセスして大丈夫かっていう意味だろ。
スレッドセーフにするには、ロックするか
書き込み可の共有変数を無くすか
Luaは後者
共有変数のないライブラリなんかも
「スレッドセーフなライブラリだ」とか普通に使うよなぁ。
業界君の業界ってどこなんだろ?
四次元の世界のプログラマとかか?
四次元の世界から書き込みご苦労です
スクリプト言語の実装だと、スレッドセーフかどうか、ってのは同一VMに対する操作に対してを指すのが一般的じゃね?
ruby しかり python しかり。
lua とか squirrel はそもそもスタック操作が atomic じゃないわけで、最初からそういう点でのスレッドセーフを確保するつもりが全く無い実装だよね
VM わけてスレッドセーフなのはあたりまえすぎるというか、そうなってない言語実装とかはずかしくて表にだせないような
何が一般的かはよくわかりませんが、とにかく
Luaはlua_sate毎に別スレッドで動かせることを確認した次第です。
それ以外のことは知りません。
スレッドセーフでないことの確認はともかく
スレッドセーフであることの確認って
ソースコードチェックする以外にどうやるの?
>>566 RubyやPythonってひとつのプロセスに複数VM持てたっけ?
例えばCの関数 strtok_r は strtok のリエントラント版でな、
こいつは本質的にはLuaと同じ方法でスレッドセーフを実現してる
>>571 グローバルに一つやね。スレッドセーフは GIL で確保する実装
ruby はマルチVMの研究はやってたと思うけど詳しいことは知らない
マルチVMでシームレスに使うには結局メッセージパッシングの機構を
つくりこむ必要があってそこで難航してたんじゃなかったっけか
lua や squirrel はその点は総スルーしてるから、使う側はあきらめるか独自に頭をひねる必要がある
そろそろ erlang 使いが乱入してこないかしら
レースコンディションを自身で解消できるものしか
スレッドセーフと呼ばない、というのが業界標準なのか?www
それどこ業界よ?
>>574 lua_stateが別でも相互に参照し合いたいってことか?
イラネ
そんなマイナーな議論よそでやってくれよ
Lua鹿使えないSEなんていないんだから、
Luaをコントロールする言語側でロックなり何なりして情報を共有すればいいだけ。
Lua言語ですべてやろうとする馬鹿は消えてほしい
まとめ
Luaはlua_state毎に別スレッドで動作させることができます。
そういう意味でLuaはスレッドセーフです。
異なるlua_satateで情報を共有できるか否か、というのはまた別の話になりますです。
普通は母体となるC言語なり何なりでロックしてから情報を書き換えるなどすればよいだけなので、
一般的な意味でも、Luaはスレッドセーフであるといえると思います。
なお、レースコンディションを自身で解消できる言語しか
スレッドセーフと呼ばない、という業界が存在するらしく
話がかみ合わない場合があるので注意。
wikipediaのスレッドセーフの実現手法の中の
スレッドローカルデータってのにあたるのかな?
この方法でLuaはスレッドセーフといえるのであれば、
広域変数もスレッドセーフであると言えるってこと?
Luaはリエントラントだっつーとろーが
>>583 ああスマソ。理解した。
lua APIはスレッドセーフだけど、lua_stateはスレッドセーフじゃないよってことか
なんだよlua_Stateがスレッドセーフじゃないって
スレッドセーフってのはAPIとかコードの性質であって変数のじゃない
お前は全然分かってない
いずれにせよLuaはCorei7対応だね
>>574 Do not confuse Lua threads with OS threads.
www
StackTraceないのLuaって?
組み込み言語って主にどういう場面で使うの?
Android OSで動くLuaはまだないんだよね?
>>591 スタックトレースっちゅうよりユニットテストじゃん。
>>594 スタックトレースとユニットテストは別物だよね?
スタックトレース → エラーがおきたらスタックの中身表示するVMの機能。
ユニットテスト → クラスが正常に動作するかチェックするためのクラス?
なんでluaのbreakって最後にしか置けないの?
なんかメリットあるの?
5.2betaならblock途中にも置けるよ
gotoのないバージョンで置けて
なんかメリットあるの?
インクリメントとか複合代入演算子とか実装してほしい
luaのリファレンスで stat ::= 〜 って書いてあるけど
::= の部分ってなにを意味しているの?
>>603 ありがとうございます
いままで知らなかったのが嘘の様なほどの基本なんですね
>>601 BNF記法でイコールみたいな感じらしい
定義だろ。
>>605 コーディング時間が長くなるとかより、コード解析速度ダウンのほうが痛いから。
複合代入はともかくインクリメントは流石に要らんな
Luaはスクリプト言語なんだから全部の式に戻り値付けてほしい。
X = if Y < 0 then -1 else 1 end みたいに。
あとメタテーブルがあるんだから演算子は必ず代入しないといけないのもやめてほしい
Table + {1,2,3} とか
スクリプト言語 → 全部の式に戻り値
この論理がどう繋がってるのかわからんのだが
確かにw
要は3項演算子が欲しいんだろ?
好きなように改造してしまえばいいじゃない
X = Y < 0 and -1 or 1
でいいんじゃなかったっけ
AngelScript|Д`)<インクリメント演算子欲しい子よっといで
マイナーすぎるからやだ(´・д・`)
んで、luaの三項演算子もどきのソレだけど、確か何か欠点が無かったっけ
素直にand/orとして解釈すれば欠点はないが、もどきとしての解釈は自己責任
f(x and g(y) or z)
自己責任で適当な f, g を選ぶ
天使さん不憫すぐるw
>>620 true and false or true
>>623 ソレダ
真のときの返値が偽値のときにおかしくなるんだな
Pythonでは (x and [y] or [z])[0] とする
Prologではカットを使う
Schemeでは(call/cc (lambda (k) (or (and x (k y)) z)))
>>625 今のPythonには、そもそも三項演算子がある
ちょっと珍しい書法だが
条件が真の際の返値 if 条件式 else 条件が偽の際の返値
なんでそこまで1行にこだわるのかね何回も使うなら関数定義すりゃいいのに。
F(条件、真、偽)とかじゃ駄目なの?
そりゃ遅延評価の言語ならIFだって関数にできるけどさ
>>628 それだと返値に関数が指定されたとき
関数に全く副作用が無く、かつ
呼ばれることによるオーバーヘッドが気にならない程度の小さい関数ならば良いが
呼ばれることによって何らかの状態が変わってしまうものや
呼ぶことによって大量の処理が動く場合はマズいことになる
スピード求めるならCにでもやらせればいいと思うんだが・・・
今さら気がついたんだけど1行でも動くんだな。関数なんか書かなくていいっすね
もっとリファレンスきちんと読み直してくるわ
>>631 スピードって、複合代入やインクリメントの話?
633 :
628:2011/08/10(水) 22:48:23.43
話の内容勘違いしてるの気がついて逃げようとしただけだから
もうほっといてくれー(ノ_・。)
結局luaってゲームぐらいしか活用できるとこないの?
ゲーム用なら値を倍精度じゃなくて単精度にして欲しいんだが。
結局、Basicにチン毛が生えた程度の誰得言語だなLua。
>256-266
ループしてるよ!
PSPだと double 使うと悲惨なことになるよ
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
doubleで頂点データなんか用意したら、そんな精度要らないのにメモリやキャッシュを無駄にするし、x86でもSSEを前提に設計するだろうに。
LuaJITだと、JITがSSE2向けに作ってある
組み込みだとdoubleはまだまだきついね
かといってLuaは整数、少数で変数分けてないからfloatにすると精度がきついので
固定少数を検討することになる
ところで蒸し返すようで悪いんだが、Luaはスレッドセーフではないよね?
リエントラントに作ってあって、アプリ実装者がやりやすいように作ってあるだけで
LuaGemsの人はState分離したらスレッドセーフにできるよって言ってるだけだし、
いや、規制で書き込めなくて、過去スレで何回かスレッドセーフではないって言われてるのに
なんか理不尽な流れだなーと思って眺めてたんだ。オレオレ君が間違った認識持って帰る分には
いいんだけどね
てめえの垢で呟いてろオッサン
なんでだれも実際のコードで試さないの?
とっくに試して自明だからだろ
同一のstateとそれから派生した state は別スレッドからは扱えない。スレッド毎に作る分には問題ない
事実は単にこれだけ。
そう。
それに対して「僕はこうだとおもいまーす」はブログに書いといてください
>>644 Luaはstate単位でスレッドセーフ。
それをもってスレッドセーフでないというのは単なる言葉遊び。好きにしろ。
>>644 Do not confuse Lua threads with OS threads.
By Luiz Henrique de Figueiredo
>>650 そんな間違いをしてる人はこの話の流れで一人もいないぞ
スレッドセーフについては、複数走らせたい場合はStateを複数作れば
いいわけで、大した問題ではない。
一つのStateを複数のスレッドから使う場合も、Mutexでアクセス権を付与すれば
いいだけだし、そもそもそんな使い方をする状況もあるのか怪しい。
複数走らせてるLuaStateから同じC変数にアクセスする必要性ならわかるが、
それはLuaがスレッドセーフになってるかは関係ないケースだし。
スレッドセーフ厨の人は、どういう状況を想定してるんだろ?
「C++のこのクラスはスレッドセーフですか?」って聞かれて
「インスタンスを分ければスレッドセーフです」って言ってるようなもんだよな。スレッドセーフ君
>>652 「スレッドごとにスクリプトを走らせたい」ってのが第一義の目的として、
単純には state 複数で実現できるのはわかった上で、それだとグローバル変数を
簡単に共有できないから「一つのState を使いたい」って要望がでてくるんだと思われ。
その要望自体は皆理解はできると思う
で、一つのStateを複数のスレッドから使おうとした場合、確かにスクリプトの呼び出しとか
の部分だけを整理して Mutex で固めてしまうのは簡単なんだけど、
「スクリプトが複数スレッドで動いてる」って状況だと、そのスクリプト自体が lua/squirrel の
内部処理を自分のAPIつかっていろいろ呼び出してしまってるので、その操作も
全部精査した上で適切にロックする処理を全部の箇所に足す必要があります。
「付与すればいいだけ」なんだけど、その場所がかなり多くて調べるのもうまく動くかチェックするのも大変。
lua も squirrel もスタック操作がステートフルなので、APIをロックするだけではダメだからね。
俺はそんな作業頼まれても絶対やりたくないので、聞かれたら
「lua も squirrel も単一State の操作はスレッドセーフにできないからやめとけ」って説明します。
単一State の操作をスレッドセーフにするバカっているの?
>>653 それはLuaの実態がStateであると捉えるか、VM関数群であると捉えるかで
変わるんじゃない。
C標準関数みたいに内部変数が使いまわされてるのが混ざってないのだから、
マルチスレッドでの使用は一応考慮されて設計してるのでしょ。
python とか ruby は実際そういうことをやってるよね。もっとも逆に「複数ステート」相当が無いんだけど。
lua や squirrel でやる物好きは、なかなかいないと思うけど、誰かが作ったら使う人はいるんじゃね?
>適切にロックする処理を全部の箇所に足す必要
そんなことしなくてもコルーチンと併用して、VMが一時停止したときだけ
ロック解除すれば良いかと。
それ以前にグローバル変数はLua上で管理しない方がてっとり早いだろうけど。
>>657 lua_newthreadがまさにそれじゃね
>>658 コルーチンベースでのVMまるごとロックならそもそもスレッド全くわける必要がないような……
>>659 あれはコルーチン用のステート生成なので、親stateともども別スレッドから同時にはさわれません
>>660 PythonやRubyはいけるの?
初耳
>コルーチンベースでのVMまるごとロックならそもそもスレッド全くわける必要がないような
そうだよね。
だからなおさら1Stateを複数スレッドで〜という状況がありえないと思う。
>>654 その要望自体理解できないが。
単に設計ミスじゃね。何でもかんでもLuaに頼る必要なかんべ。
>>653 それの何が問題かをいってくれないと。
インスタンス単位でスレッド単位で十分なクラスなんだからそれでいいじゃん。
LuaもState単位でスレッドセーフが保障されていれば十分。
それ以上を望むのは馬鹿とマニアだけ。
>>659 Do not confuse Lua threads with OS threads.
By Luiz Henrique de Figueiredo
>>654 「グローバル変数を共有とかお馬鹿な設計はやめとけ」の間違いだろ?
Lua様のせいにしてんじゃねぞ、こら
まとめ
Luaはlua_state毎に別スレッドで動作させることができます。
そういう意味でLuaはスレッドセーフです。
異なるlua_satateで情報を共有できるか否か、というのはまた別の話になりますです。
普通は母体となるC言語なり何なりでロックしてから情報を書き換えるなどすればよいだけなので、
一般的な意味でも、Luaはスレッドセーフであるといえると思います。
>>664 言い方の問題じゃね?
「vectorはスレッドセーフである」とか普通は言わないでしょ
まぁ完全なスレッドセーフではないよな。
スレッド運用可能程度で。
関数がリエントラントでもスレッドセーフと呼ばないのは自由だが
馬鹿だと思われるから気をつけた方が良いよ
>>661 CPython と CRuby は GIL で実現してるので実質同時に動くスクリプトは一つだけど、まあ、実現はしてる。
他の実装だと、MacRuby は既に GIL 無しになってて、実際に複数スレッドで同時にスクリプトが走る。
あとは Rubinius もたしか開発ブランチでは GIL 排除してる。
CPython は GIL 排除は目標にあがってたけどまだ実現はしてなかったはず
Jython と JRuby はJava上の実装だけど完全に複数スレッド対応ずみ
>>663 「スクリプトだけでなんでもやる」的なスクリプト言語では、現実に求められてる要望だよ。
マルチコア時の性能がかなり上がるからね。
もっとも、俺も Lua でする必要はさっぱり無いと思う。適材適所やね
AngelScript|Д`)<AngelScriptは一応マルチスレッド環境対応って書いてるけど大丈夫なのかな?
AngelScript|Д`)<boost::threadと組み合わせて複数のスクリプト動かした時は問題なかったけど。
673 :
644:2011/08/18(木) 00:37:04.54
まずごめん。予感はしてたんだがやっぱり荒れ気味にしてしまった
とりあえず
>>647 の認識で合ってるか気になったんだ。
前の流れのときは(今もいるっぽいが)悪口雑多撒き散らしてまで
「一般的にスレッドセーフ」でまとめたい人がいたから。
これに関しては定義を決めないと結論出ないし、これでまとめるには
誤解を招くと思ったんで、
>>647 でおkなのを確認したかった
>>670 関数はそれでいいと思うんだけどvectorもLuaも状態を持ってるから、
ちょっと前提が違う。関数もstatic変数で状態持ってたら崩れる
でなんか面白い議論になってるLuaStateを単一でマルチスレッド化に
需要あんの?って話だけど、ちょっとずれてるかもしれんがGameProgrammingGemsの
7か8にそういう話が載ってたような。確か、変数、関数をスレッド数分
コピーしたくないから、一箇所に集めてアクセスさせる話だったと思う。
State自体はスレッド数あったかもしれんからずれてるかもしんない。
本は会社においてるから確認できなくてすまん。
ただ、最近は8コアとかざらだから無視できないのかもしれないね
あとほんと、なんか自分の自身が無いのに巻き込んだようですまない。
>>671 >
>>661 > CPython と CRuby は GIL で実現してるので実質同時に動くスクリプトは一つだけど、まあ、実現はしてる。
それで良しとするならLuaでも同じじゃないの?
countフックしてスイッチングするだけじゃん
Lua Programming Gems
http://www.lua.org/gems/ という本の
Enhanced Coroutines in Lua
という記事で、Lua のコルーチンをネイティブスレッドに対応させる拡張が紹介されてます。
ソースコードだけダウンロードできます。
使った事ないけど。
>>668 多分この中でお前だけ話を理解できてない。
AngelScript2.21.1リリース記念火気庫ヽ( ´∀`)ノ ボッ
http://www.gamedev.net/topic/609014-angelscript-2211-released/ asOBJ_ASHANDLEを使えばvalue typeをハンドルのように扱えるらしい
CScriptHandleは・・・どんな型の変数でもreference typeのように扱えるアドオンか?
Win64とMinGWでのnative calling conversionか・・・、うちには関係ないな
CSerializerというアドオンはモジュールの変数を、スクリプトを再コンパイルした後も内容を維持するためのものっぽい
Lua 5.2リリース記念火気庫ボッはまだですか
(´\r-、 ┼ + /`/`) +
┼ (\. \! * // ,/) *
+ * (ヽ、 \ + * / /) +
⊂ニ ) * + ( ニ⊃
* + ⊂、 ( ∩___∩ ノ ⊃ + *
(/(/ ヽ | ノ ヽ / 、)ヽ) ┼
+ (/ ∨ ● ●レ /⌒) 、)ヽ)
* (/' | ( _●_) ミ' /、)、)´ +
+ (/'ヽ 彡、 |∪| ノ / AngelScript!!
+ / __ヽノ / * +
┼ (___) / +
∧_∧ / ̄ ̄ ̄ ̄
( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
>CSerializerというアドオンはモジュールの変数を、スクリプトを再コンパイルした後も内容を維持するためのものっぽい
これがsuspendで一時停止させたスクリプトの状態まで保存してくれるとなるとすげぇ便利なんだけどなぁ…
今度調べてみよう。
ログ復活
(´\r-、 ┼ + /`/`) +
┼ (\. \! * // ,/) *
+ * (ヽ、 \ + * / /) +
⊂ニ ) * + ( ニ⊃
* + ⊂、 ( ∩___∩ ノ ⊃ + *
(/(/ ヽ | ノ ヽ / 、)ヽ) ┼
+ (/ ∨ ● ●レ /⌒) 、)ヽ)
* (/' | ( _●_) ミ' /、)、)´ +
+ (/'ヽ 彡、 |∪| ノ / AngelScript!!
+ / __ヽノ / * +
┼ (___) / +
/ /
(_ ⌒丶..
| /ヽ }.
し ))
ソ トントン
Luaのメタテーブルの__addメソッドでテーブルとテーブルの足し算をしたいのですが、
同じメタテーブルを設定したテーブルのXとYがあって、
X = X + Y と X = Y + X を区別するために、
今、呼び出されているメタテーブルがXとY、どちらのメタテーブルか、
判定する方法はないでしょうか?
同じメタテーブルを設定しているので、getmetatableでも判定できないので困ってます。
__addに指定したメソッドの中で判別できるでしょ
>>686 482 :名無しさん@初回限定:2007/09/10(月) 02:39:05 ID:+7lLhCDw0
2chで調べ物をしたい時は「教えてください」って書いても
なかなか教えてもらえない。
そういう時は、知ったかぶり風に間違ったことを自信満々に書く。
そうすると、ものすごい勢いでツッコミを入れてもらえる。
アスペ診断か
この板でもっと流行らせるべき
Javascriptかー。最近Node.jsが熱いらしいね
webGLもあるしどうなるかな
LuaでLuacのバイトコードコンパイルでもJITコンパイルでもなくて
普通にバイナリにコンパイルしてDLLかなんかにするっていう
そんな魔法のようなことできませんか?
普通に C とかで書くかプログラマ辞めろ
>>692 ネイティブバイナリにするのが重要なのか、DLLにするのが重要なのか、
どちらなのかでアプローチが変わると思う。
>>693 ひどい…そんな風に言わなくたっていいじゃない!
>>694 配布形式は全部バイナリで、
開発中はVMにDLL読み込ませて呼び出し〜みたいにできたらいいなぁ。
ということで両方知ってたら教えてください。
llvm-luaとかで、バイナリコード吐けるのかな?
周辺のモジュールも含めて全体をコンパイルするのはJITでないと難しい気がする。
単体でコンパイルして意味があるのかよくわからん。
>>695 DLLにLuaを埋め込めばいいのでは?
>>695 ネイティブの速度が必須とかじゃなきゃ、698の言うとおり
Luaを丸ごとDLLにすれば良いだけじゃ。
配布形式は全部バイナリでというのは、スクリプトが別ファイルになってるのが
嫌なのだろうか?
もしそうならスクリプトのソースをバイナリに埋め込めばいい。
700 :
695:2011/09/09(金) 22:00:26.22
>ネイティブの速度
…現状で遅いんで、ちょっとでも早くならないかなと思って聞きました…。
>>700 どの部分が遅いのかテストしてみたら?
なんかよう分からんけどLuaは遅いという理由だと
全部Cで書けとしか言えない
LuaJIT使ってるかい?
スクリプトは所詮スクリプト。
適材適所。
704 :
695:2011/09/10(土) 07:21:42.29
JITより早くしたいから最適化コンパイラでもないかなぁと思って聞いたんですが、
ムリポ ナイポですかね。理解した。
全部Cで書くのは無理じゃないが、コスパを考えると人間は怠惰になる。
Basic並にメジャーになればそのうちコンパイラを作ろうとかいう奇特な人が現れるかもね。
コンパイラ作るよりコード変換機作るほうが楽だし早いよ
JITより速くしたいとか夢見てるんだから、コード変換機じゃまだ足りないなんじゃね?
709 :
684:2011/09/14(水) 22:00:02.88
あの
>>684の質問に誰か答えてくださる方いないでしょうか?
>>685で言われてる通りの質問なのでそのメソッドの中で判別する方法を聞きたいのですが。
>>709 もし__addがXのものでもYのものでもない普通の関数だったら、
「__addは誰のものか」という質問は存在しない。
だから質問が無視されているのだと思います。
711 :
684:2011/09/14(水) 23:39:19.08
>>710 普通の関数というのがよくわかりませんが、
__add=function(operand1,operand2) … end
という要素が入ったメタテーブルを使ってます。
このメタテーブルをXとY両方にsetmetatableしているので、
XのものでもYのものでも無く共用、というか、
XとYは同じクラスのオブジェクトです。
>>711 一例として
X = { 1,2,3,4,tonumber=function(self) ret=1; for i,v in ipairs(self) do ret = ret * v end; return ret end}
Y = { 1,2,3,4,tonumber=function(self) ret=0; for i,v in ipairs(self) do ret = ret + v end; return ret end}
mt = {__add=function(op1,op2) return op1:tonumber() + op2:tonumber() end}
setmetatable(X,mt); setmetatable(Y,mt)
print(X+Y); print(Y+X)
>>711 X+YとY+Xをなぜ区別したいのかわからないので
適切な回答が思いつかない。
ひょっとしてX=X+YのときXの束縛を変更するんじゃないくて、
Xに束縛されているオブジェクトに副作用を起こしたいとかか?
714 :
684:2011/09/15(木) 22:03:12.20
>>712 これはX+YもY+Xも値が一緒だから判定は無理ってことでしょうか・・・?
>>713 順番を保持した値が重複の無いリストを作りたいのですが、
X = {1,2,3},Y = {2,4} とあって両方に__addメソッドがついた同じメタテーブルが設定されているとき
X = X + Y なら Y が後ろなので X = {1,3,2,4} に、
X = Y + X なら Y が前なので X = {2,4,1,3} になるといった形で
足されるリストの並びを優先するようにソートしたいのです。
>>714 一例として
X = {1,2,3}
Y = {2,4}
mt = {__add = function (op1,op2)
local t = {}
local s = {}
for i,v in ipairs(op1) do
table.insert(t,v)
s[v] = true
end
for i,v in ipairs(op2) do
if not s[v] then
table.insert(t,v)
end
end
return setmetatable(t,getmetatable(op1))
end}
setmetatable(X,mt)
setmetatable(Y,mt)
print(unpack(X+Y))
print(unpack(Y+X))
>>714 普通だったら
X + Y => {1,3,2,4}, Y + X => {4,1,2,3}
もしくは
X + Y => {1,2,3,4}, Y + X => {2,4,1,3}
ってすると思うんだけど、
なんで
X + Y => {1,3,2,4}, Y + X => {2,4,1,3}
になるの?
ただの誤記なら>715でいいけど
>>696 可能なはずでは?無理ならCやアセンブリコードへ変換して
手作業で最適化すればいいと思う。
>>704 言語の速度に文句を言う前にプロファイラ使って
遅い部分を見つけて最適化しては?マシン買い換えるのも手。
単に全部Luaでやりたい変態ってだけだろ。
たぶんプログラマに向いてない。
719 :
684:2011/09/16(金) 20:41:28.97
>>715-716 X = X + Y なら代入されるのは X なので重複される値を
X から消して Y を後ろから足すという風にしたかったのです。
X = Y + X でも同様に X に代入されるので
重複される値を X から消してから Y を前から足す、といった形です。
代入されるのを Y に変えれば
Y = X + Y → Y = {1,2,3,4} Y = Y + X → Y = {4,1,2,3}
と言う風に計算したかったのですが、自分で書いてて気づきましたが、
どちらのoperandのmetatableが呼ばれたかを判定するだけじゃなくて
代入先の変数が何かも判定しないといけないから無理っぽいですね…。
すみません。お騒がせしました。
こういうのはスズキ菌キャリアではなくライトデベロッパであればありがちな話だな。
まあLua 遅くて不満なら、Cコードの吐ける Euphoria 4.0.3 でも使えば?
LL言語の癖に嫌でも低級メモリ操作とC言語と向き合わなくては Win32 API すら
叩けないから脱童貞にはいいんじゃない? 必要ならスレ立てておいで。
そういうことなら、拙作だけど Teco(
>>395) が吐くバイトコードはかなり単純なので、アセンブラへの変換も楽じゃないかな。
「Javaより遅い言語なんて耐えられん」by Webプログラマ
>>719 X+Yの場合 {1,2,3}+{2,4} -> {1,2,3}+{4} -> {1,2,3,4}
Y+Xの場合 {2,4}+{1,2,3} -> {4}+{1,2,3} -> {4,1,2,3}
という事なら
X = unq.new({1,2,3})
Y = unq.new({2,4})
function unq.concat(op1,op2,[,base])...end
というような関数で操作した方がいいんじゃない?
メタメソッドでやるとすると
どちらを基準とするのかという情報をX,Yに埋め込んだり
他から参照したりする必要があるから汚くなる
724 :
684:2011/09/17(土) 16:33:14.72
>>723 確かにクラスやメソッドでやったほうがいいですね…。
テーブルをテーブルのままに処理を加えられるメタテーブルっていいなと思いましたが、
制限多すぎるのでやっぱりやめておきます。
725 :
デフォルトの名無しさん:2011/09/26(月) 18:31:24.78
・スクリプトエンジンがvakye typeで値を返すときに、
ヒープではなくスタックに確保するようにして高速化
・64bit LinuxとMac OS Xでnative calling conventionsに対応するための変更
3次元ベクトルのようなPODの構造体ではコピーコンストラクタやデストラクタが実装されず、
この機能がうまく働かないことがあるらしい
全てのメンバーがint,float,doubleの場合、asOBJ_APP_CLASS_ALLINTSやasOBJ_APP_CLASS_ALLFLOATSのフラグをつけることで解決した
全ての組み合わせをカバーできるわけではないが、ほとんどのものはこれでカバーできる
・サンプルゲーム
・クラスメンバーにもメタデータを付けられる
ABIってなんだろ?64bit LinuxとMac OS XのABIは複雑で、
メンバーの型によっては違うレジスタに渡される事があると書いてあるが
この場合コーリングコンベンションのことかな
ABIという言葉にはもっと他のものも含まれるけども
Application binary interface
> 全てのメンバーがint,float,doubleの場合、asOBJ_APP_CLASS_ALLINTSやasOBJ_APP_CLASS_ALLFLOATSのフラグをつけることで解決した
なんだかグダグダだな
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
規則を単純明解にしようと思ったら、全部スタック(CPUスタック)渡しになって重くてかなわん、
というわけで性能を稼ごうとレジスタ渡しを頑張ると規則が複雑怪奇になる。というトレードオフ。
トレードオフではないだろ
クロスコンパイルと同じで
ターゲットごとに処理を振り分けりゃいいだけなんらからw
大体組み合わせと例外でバリエーションがやたら増えて泥沼になるよ
∧_∧ / ̄ ̄ ̄ ̄
( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
Windows環境でUnicodeビルドして普通に使えるのって今のところSquirrelだけ?
Luaでも普通にUnicode使えるよ
AngelScriptだって大丈夫
ファイルを読み込みをライブラリに頼らず
自分でやればいいだけ
Xtalも少し初期化あたりいじる必要あるけどできるよ
す、Squirrelだってっっ……!
Squirrelのstring型ってutf16leでいけんの?
他の言語の同じようにvm内(とファイルエンコーディング)はutf8でやって
変換かませてたわ。
ゲーム系ってLua多くねえか
WoWがluaだから?
他にも何か理由あるのかな
浮動小数点をfloatに指定して再コンパイルしてやるとDirectXとの相性ばっちりになるからとか?
そ、そんなマニアックな理由なの?
もっと単純に小さくて速い組み込みやすいスクリプト言語で、
開発者がよく知っている言語をゲーム内のスクリプトに使いたかっただけじゃないの
ゲームとは関係ないが、unix系ツールの組込みスクリプトが
lua,python,tclあたりでデファクト争ってて、ただのユーザーとしては面倒きわまりない
速度と採用実績だろうね>Lua多い
ゲームは特に速度気にする傾向が強いような気がする。
pythonとluaは別の道具な感じがするが
LuaでCからモジュール内の変数を設定することは出来るのでしょうか?
例えば
static luaL_Reg l_foo);[] = {
{ "bar", lua_bar },
{ NULL, NULL }
};
luaL_register(L, "foo", l_foo);
で設定した後にC側で
foo.varに3を設定し
Lua側で
a = foo.var
などのように利用したいのですが
lua_pushnumber(L, 3);
lua_setfield(L, -2, "bar");
lua_pop(L,1);
luaL_dostring(L,"foo.bar=3");
lua_pop(L,1);
luabind::globals(L)["foo"]["bar"] = 3;
lua_pop(L,1);
あぁ、varか。
barの部分をvarに読み替えてちょーだい
>>746 ユーザー(ゲームだから、プレイヤーか)も速度を求める人が多いからね
そりゃ開発側も速度に気を使うだろうと思うよ
>>749 lua_getglobal(L, "foo");
lua_pushinteger(L, g_"3");
lua_setfield(L, -2, "var");
lua_pop(L,1);
これで登録できました
モジュール名でテーブルが作成され、そこにモジュール内部の関数等が登録されるのですね
>>752 ちょっとゴミが残ってた、正しくは以下です
lua_getglobal(L, "foo");
lua_pushinteger(L, "3");
lua_setfield(L, -2, "var");
lua_pop(L,1);
microSDにメジャーなOSでほぼ動くエディタと自前ツールとLuaJIT一式入れとくと簡単で便利だ。
LuaJIT 安定してますか?
ちょっぱやだからオヌヌメ
LuaJITのAAください
∧__∧
(´・ω・) いやどす
ハ∨/^ヽ
ノ::[三ノ :.、
i)、_;|*く; ノ
|!: ::.".T~
ハ、___|
"""~""""""~"""~"""~"
LuaJIT2.0そろそろRCにならんかなぁ
if 〜 then 〜 end
英語が母国語の国の幼稚園児でも意味が分かる。これがLuaのいいところ。
if (〜) {〜}
これを幼稚園児が理解することはおそらくない。
なのに後者がいいという奴は、単に自分が好きな言葉で書かせろって
わがままいってるだけ。つまり、ぴゅーた日本語ベーシックを作った奴と同じ発想。
お前の脳内幼稚園児の話なんてどうでもいいわ
Lua はアプリケーションへの組み込みを意図し,
高速な動作,ポータビリティ,拡張の容易さなどを
重視して設計されたコンパクトな汎用スクリプト言語.
今月の TIOBE Programming Community Index では
Ruby の一つ下の12位にランキングされている*1.
これは,iPhone アプリの開発者による利用が増えている
というのが大きい*2と思うが,プログラム言語の設計者た
ちへのインタビューを纏めた Masterminds of Programming
(邦訳: 言語設計者たちが考えること)に Lua の設計者の
インタビューが取り上げられたり,その設計者の一人
Roberto Ierusalimschy による Programming in Lua や
入門書(入門Luaプログラミング)など日本語の書籍も出版さ
れたりしているので,ここ数年で日本でも認知/普及が進ん
でいるのは間違いなさそうだ.
速さを極めるならイフゼンより括弧の方がすこしだけいいでしょ
{}のほうがパッと見たときに全体を把握しやすいな。
if〜then〜endだとVBのようにゴチャッとした印象になるし、タイプミスが発生する可能性も高くなる。
分かりやすいことが必ずしも優れているとは限らないしな。
それにスクリプトを使うのは幼稚園児ではないのだし。
初見で意味が分かるかどうかは重要じゃない罠
if〜thenはLingoで見飽きた
スクリプトにLuaを選択する人は速度を求めるようなコアな層なんだし
記述的にももう少しスマートにして欲しいと考えるのはある種当然の成り行きとも言えるなぁ
Luaの記述は分かりやすい!Lua最高!な人ほどむしろ別のスクリプト言語選ぶべきと思う
英単語に弱い日本人らしい意見が続出
{}はコメントだろ?Pascalだと。
視覚的にカーリーブレースのほうが見やすい気がしなくもない
カーリーブレイスはすでにテーブルリテラルで使っちゃってるからかな。同じ記号を複数の意味で使いたくなかったとか?
>>770 AppleScript書きまくってから言えー
>>774 何かと思ってググってみたが、日本語で記述できるんだな…
LuaとWSHとひまわりを足して2で割ったような感じか
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
おっぱい言語が最強
PyPy!!
man man
Lua
アーカイバ作ってて、拡張子のテーブルにコマンド入れといてos.executeとか
local FileExtTable={lua={SrcExt="lua",DstExt="lbc",Cmd="luajit.exe -b $FileName.$SrcExt $FileName.$DstExt"},...}
テーブルとstring.gsub "%$(%w+)"が便利でにやけちゃう
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
入門Luaプログラミング買ったら糞本だった
プログラミングインルアで必要十分
>>786 同意してしまう。
Dijkstraのところなんて、あれは糞だ。
>>786 同意w ある程度囓ってから本買いにいったお蔭で変なの掴まないですんだわw
結局、本屋では何も買わなかったというオチ?
>>721 それ、いいとは思うが日本国内に置いてあっても発展は望めないような。
ドキュメントなどを英訳して海外に出したほうがいいような。
海外に向けてオープンソースで公開したら勝手に拡張してもらえるっていうのは
海外の人達はそれだけ、物好きで技術高い人が多いってこと?
単純に
人が多いってこと
かと。
日本人は社畜だからただでできるほど余裕ない
わかんないところはソース読むorトライ&エラーで十分
>>791 英語かー。読むのも満足にできないしなあ。
知り合いに、使ってもらうための努力もしろとは言われたけれど。
いざ完成すると大したもの作った気がしなくて、宣伝なんて恥をかくだけじゃ?って思ってしまうのは、日本人だからか。
新しいソフトウェアを開発することが恥なものか
むしろ反響が全く無いほうが萎える
>>796 > いざ完成すると大したもの作った気がしなくて、宣伝なんて恥をかくだけじゃ?って思ってしまうのは、日本人だからか。
現時点で
個人サイトに公開し2chに貼り付けて宣伝してると思うw
>>797 だよね。レスもらえるだけでうれしいもの。
励まされたよ。ありがと。
>>798 その通りw
自己顕示欲とのせめぎあいだわ。
苦労した分だけ、けなされるのが怖い。
みんなに聞きたいんだけどluaの言語仕様でこれは納得できない!とかってのある?
配列が1から始まるとかnilとfalse以外は0でも真扱いされる部分とかは賛否両論ありそうだけど
賛成意見なんてあるのか?
>>800 1オリジンはBASIC出身だから「おっ、久し振りだな1オリジン」ってしか思わなかったし
nilとfalse以外真ってのもRubyは私用でよく使うから「Rubyと同じだな」としか思わなかったな
配列を連想配列で擬似的に実現してるってのも何かの言語でやったような…
PHPとLuaとJavascriptは言語仕様がいまいちなのに
流行ってしまったな
>>800 breakはあるのにcontinueが無いのはなぜ?と2日前に思ったよ
>>800 ~=だけじゃなく!=も使いたい。他は特に気にならん。
>>800 やっぱ数値型がdoubleしかない点だろう。
>>800 英語の文法は日本語と違うから嫌い!といっても無駄なのと一緒だよ
>>804 え、continueないの!?個人的にはこれが一番衝撃的だわ。
じゃあcontinue的な事したい場合ってさ、if文で後続処理を囲うとかしないといけないわけか。
c++/clrでlua使うと動いてけど
warning LNK4248: 未解決の typeref トークン (0100001A) ('lua_State') です。イメージを実行できません。
とでる、このwarningどうしたら解決できるのだろうか?
#include "stdafx.h"
#include <lua.hpp>
using namespace System;
int main(array<System::String ^> ^args)
{
lua_State *L;
return 0;
}
>>809 #include <lstate.h>
LuaってC++とかで言うところのenumあったっけ?
ないよ。標準APIだとそのへんは単純に文字列だぬ
luaって学んでいく内に他の言語にはあるような機能が無かったり変な縛りがあったりして
少し残念に思ったりする。まぁ代わりの手段はあるとはいえ。
そこら辺は速度優先するためのトレードオフになってる面が大きいから仕方ないだろ。
気に入らなかったら自分で拡張すれば良いんだし。
>>815 それもそうか。速さは大事だし。
あんま気にしてなかったけどluaってインタープリター系の言語なんだっけ?
AngelScript|Д`)<分かりやすい文法と聞いて飛んできました
>>816 中間言語にコンパイルして、その中間言語をインタプリタ(VM)が実行するスタイルなので、
分類としては「中間言語コンパイラ(バイトコードコンパイラ)」かな。
JIT機能があるので、実際の動作はさらに複雑
自分がLuaの仕様で最も嫌なところは、ローカル変数を宣言する時、キーワード: local を付けないといけないところ。
つけ忘れると、グローバルになってしまう。
スクリプトはプログラマ未満が書くことも多いため、結果グローバル変数が散見されることもある。
Pythonみたいにデフォルトでローカル、キーワード明示宣言でグローバル出あるべきだと思う。
>>819 あー、考えてみたらその通りだね。
PHPやPythonみたいにグローバル宣言の時はglobal指定子必須とかにしておくべきだったと思う。
まぁlocal指定子も語感がカッコよくて割りと好きなんだけどねw
初めてリファレンスみながらいぢってるのだけど
for i=1,10 do
のi ってlocal扱いしてくれるのかな?
というかグローバルかローカルかなんてどっちでもいい。
>>821 for文で用いられる変数はローカル変数になると言語仕様に明記されている。
>>821 こんなシロウトがいて開き直るから困る。
俺は「変数宣言はlocalで行う」と考えることにした
グローバル変数なんてだいたい無くても何とかなるし
どう困るかシロウトでも分かるように説明してくれよ。
i と l を見間違えるからとかあほっぽいこといいださないだろうな。
Luaは配列が1開始なのがやっぱ一番気になるなぁ。
連携先の言語は基本的に0開始だから妙なバグ埋め込まないか不安になる。
まあ今更変更なんて効かない部分だろうけど。
そういえばC++とかだと
for ( int i=0; test != 10; i++ )
とか条件節に任意の式書けるけど
luaのfor文って条件節に相当する部分には繰り返す数しか書けないよね
while文あるから別に困らないけど少し驚いた
>>819 whileでもifでもブロック内でlocalにしようと思えばできるところがいいんじゃないか
localをつけ忘れる言語より、つけようと思ったのにできなかった言語の方が不安だ
配列も、ずらそうと思えばずらせる
英語の文法は日本語と違うとこがいやだといくらいっても無駄だって。
マイナーで流行らないオナニー言語の増加を招くだけ。
グローバル変数はまず単純に処理が重い。
もっと深刻なことは、そのグローバル変数がどの環境で束縛されているか分からなくなるから、クロージャやコルーチンを安全に使うことが難しくなる。
いや、普通に関数呼び出しを行うのも怖くなるか…。
プログラム初心者のためにlua乗せようと思ったけど
グローバルやらローカルやら教えて使わせるのってつらくないか?
起動に時間かかるプログラムを再起なしで変更くわえられるので
スプリクトとして使えるのがうれしいけど
中級者以上限定って感じ?
皆どんな感じで使ってるの?
いやもう、なにがなんだかw
スプリクト! スプリクト!
習得は容易で初心者でもすぐ扱えるようになるけど
その使途や目的の都合上、実用する際はそれなりにスキルのある人間がやる事が多いんだよね。
だから割と不満が出るんだろうな。
>>835 池袋の西部百貨店の本屋行ってみ。あるから。スプリクトコーナー。マジで。
>>827 気になるなら、配列先頭にマッチする正規表現を作ってgrepした結果を比較したら良いだけの話では?
その程度の作業なら3分もかからないだろ。
>>842 それ比較しても配列の添字が変数だとどうしようもないと思うけど
というか0開始がおかしいとは考えないの?
面倒なら配列が0から始まるスクリプト言語使えばいいじゃない。
ソースからライブラリまで置換してzerolua作ればいいと思う。
全部変える必要があるか分からないけど。
zeroforとかキーワード追加するのもありかもね。
>>848 自分は最初C学んだ時に0開始になれるのに結構時間かかった。
1開始のが初学者には絶対直感的だけど慣れてくると0開始のが確かに楽できるね。
自分はluaのダメだと思うところはやっぱグローバルがデフォルトなところ。
あとi++とかi += 1とかいう書き方ないのもちょっと面倒くさい
あとさ、luaってCやC++みたいな関数のプロトタイプ宣言なくて
PHPやJavaScriptみたいにファイルの下の方にある関数を自動的に先読みもしてくれないよね。
同一ファイル内でなら自作関数呼び出す前に関数を先に書いておくしかないから
そこがちょっとなーって思う。
まあlua超早いからそういう欠点は大したことないんだけどねw
> 1開始のが初学者には絶対直感的だけど慣れてくると0開始のが確かに楽できるね。
混在してるのは困るが、オリジンは慣れりゃ大差ない
>
> 自分はluaのダメだと思うところはやっぱグローバルがデフォルトなところ。
今更後方互換捨てて変えられてもまいるけどね
ま、省略時グローバルになる言語ならstrictモードがあるし。
> あとi++とかi += 1とかいう書き方ないのもちょっと面倒くさい
代入が文はメリットでもある
> あとさ、luaってCやC++みたいな関数のプロトタイプ宣言なくて
> PHPやJavaScriptみたいにファイルの下の方にある関数を自動的に先読みもしてくれないよね。
> 同一ファイル内でなら自作関数呼び出す前に関数を先に書いておくしかないから
> そこがちょっとなーって思う。
function f(){}ではなくf=function(){}のつもりで。
>>853 主観的なことを並べて日本語のほうが英語より優れてるとかいっても無駄だよ。
よく日本語と英語で例えられるけど
luaはハングルみたいなものだと思う
???
「I am a girl.」 (i = i + 1)
と書かなくても
「女です」(i++)
と書ける日本語のほうが優秀ーとかいっても無意味ってこと。
短く書くことが出来るならその点に於いては優秀である、と言うことが出来ると思うがね。
書式を簡略化するメリットというのは確かにあるわけだし。
cだと、++i, i++があって、i++の動作が分かりづらい。
未定義
i++はあまり必要じゃないけど
++iはよく使うからあったら嬉しい
>>861 だったら i+ とか i~ とかでもいいやん。i++は長いだろ。
別に短いのがいいのか悪いなんて議論するつもりはないよ。
自分がよく使う言語にあるという主観的理由で言語仕様を批判しても無駄といってるだけで。
C の != は変。何でびっくりマークやねん。not は ~ が普通だろ。
どうすると何が未定義なのか、ちゃんとわかって「未定義」と言ってるのか?
++i は i += 1 と同じだから、C言語では特にいらん気がするけど、i++ は i を
インクリメントしたうえで、式の値はインクリメント前の値だから、たまに
うまく使えることがある。
ソースが分かりづらくなるだけやん
冗長であればわかりやすいと錯覚する人向けではないね
>>866 ~はCでもNOTだよ。ただしビット演算の方だけど
i++はCが作られたCPUかま
ポストインクリメントが出来たからだよな
ポインタなんかでは合理的
日本語typoわり
ポインタの指してるオブジェクトのサイズに応じたインクリメント、とか
PDPで出来たのかな?
>>865 自分が良く使う、というレベルではなく
過半数のプログラミング言語にある仕様であればそれはもう主観的とは言いがたい。
既存のプログラミング言語とどこが違うか考えることは
言語の深い習得にとても重要なことだよ
++が必要だったらソースあるんだから改造したり、コンバータ作ればいいだけじゃないの?
JITを作ったのも本家じゃないんだろ?
構文糖も外の人に任せて本家はVM的なものだけ作ってればいいんじゃないの
よしお前らAngelScriptを使うんだ。
>>873 68kの元になったアーキテクチャだしな
ちょっとみた限りアクセスサイズ分はいけんじゃないかな
任意のサイズは無理だが
> 過半数のプログラミング言語にある仕様であればそれはもう主観的とは言いがたい。
「過半数のプログラミング言語にある」だなんて、プログラミング言語を少々知ってれば、
決して言えない台詞だと思うがどうか。
あと ++ の存在、だなんていう表層にとらわれたらダメで、意味論を考えないと。
てか誰もluaを貶したりしてるわけじゃないと思うんだけどな。
現状不満は無いけどもう少し使いやすくなればいいのにな、って言ってるだけで。
どうもこのスレは理屈っぽいというか偏執的というか、そんな人が多いね。
まあこれだけだと荒らしみたいなんで、建設的な話題をば。
luaをjavaで使うライブラリでluaJってのがあるみたいだけど、これ速度面は大丈夫なのかな。
見たところ全部javaで書かれてるっぽいから、持ち味の速度が殺されてしまいそうで不安なんだけども。
やっぱJNIで自前実装すべきなんだろうか?
>>879 言い方が悪かった。過半数というのは古今東西の言語全てではなく、
今主流になっている実務で使われるような言語の中で、という意味ね。
例えば書店で参考書籍が普通に買える様なプログラミング言語には
まず++か+=の仕様が存在すると思う。
まぁ、これは別に++や+=に限らず、他の部分にも言える。
人が使う言語にある仕様ってのは少なからず人が求めているっていうそういうこと。
君だって別に無いならないでもいいけど、あればあった方がいいとは思わない?
>>882 字面さえ真似ればよくて、もともとそう書かれた理由というのを無視してでもいいじゃない、
便利なんだから。ってこと?
>>882 Luaは、自分でも作れそうな気がするところに魅力を感じるので
求める人と作る人に分かれて話し合うのは違和感がある。
そういう別々の立場に立つという発想自体が、無い方がいい。
>>882 何度もいうけど
英語的な文法が世の主流だから英語が客観的に優れてる日本語もそうすべきとかいっても無駄だよ。
出たマジックワード「実務」w
>>885 いいたとえだ。
文の最初に動詞があれば命令、という規則は単純でわかりやすいから、
日本語もそうしろ、って理屈が暴論なのはわかるよね。それと同じだから。
つーかお前等そこまで意地になって反論するようなことかぁ?
「○○あったら便利じゃね?」「せやな」
これで済む話だろ。いい加減この話は終われ。邪魔。
>>882もいくら言っても多分平行線で終わるから諦めたほうがいい。
そもそも全くダメな発想であることを当人が納得しないと、
結局何度も何度も蒸し返しやがるからウザいんだよこのネタは。
+= はあった方が、テーブルの中のテーブルの中のテーブルの中の要素…辺りを弄るときには楽だと思う
何度もいうけど、ソースが分かりにくくなるだけジャン
891 :
887:2011/11/01(火) 09:06:49.97
>>888 ダメな発想ねぇ・・・
蒸し返すも何もLua自体の開発はまだやってるんだから
言語仕様についての話題出すのは別に構わないと思うんだがな。
そういやLua5.2ってまだリリースはされてないんだったっけ?
>>887 間違ったことは正さないと。オナニー仕様のオナニー言語が増えるだけジャン。
そうだよ。世界は892様の為にあるんだから
仕様仕様うるせーんだよ。いやなら違うスクリプト使えやボケが。
>>894 いいこと言うな。オナニー仕様がいい奴はオナニー言語でも使ってればいいんだよw
そうそう。世界は895様が導くんだから
++ は短く書けて便利だけど、式中の項になりえるのが混乱の原因だね。
自作の Teco では ++ のみの文(ステートメント)として定義したよ。
でもC言語で += の動作が未定義になる時ってどんな時だ?
foo(i++, i++)
が未定義とかって意味ではなくて?
それよりも、AngelScript で可変個引数が使えるようになるのはいつなんだぜ?
>>900 ストリームみたいに何かの演算子で渡して、自身の参照を返すようなオブジェクトではダメかい?
int a=100;
ASSteam s;
s<<"とりあえず "<<a<<"を表示";
みたいな感じで。
>897
それってSquirrelじゃね?
>>898 初歩的な質問をする時は名無しを装ったほうがいい
>>903 ありがと。深く考えてなかったw
++ や += みたいな省略記法が便利かどうかは主観的なのかね?
客観性を口実に何かを義務付けられると不便
義務よりオプションが便利
>>904 ここは最近やたら屁理屈こねまわす奴が常駐してるからその問いに関するまともな答えは返ってこないと思うよ。
ID出ない板だからいくらでも自演できるしな。
自分の意見としてはこの程度の事で主観だの義務だの議論する事自体ナンセンスだと思うね。
糖衣構文なんて元々オプションみたいなもんだし、いやなら使わなければいいだけ。
他人のソースを解析とかしない限りそれを見ることは決して無いんだから、ソースが分かりにくくなることも無い。
そもそもC言語の規格で、なにがどう未定義なのかまともな説明すら出ないレベルで、
屁理屈もへったくれもないわw
>>907 じゃあその話が結論付いたら主観だの義務だ言ってる事の答えになるのか?
そうやってすぐ話をそらす所がへそ曲がりだって言ってるんだよ。
おっとちなみに俺は906=908な。言わなくても分かると思うけど。
わざわざ言うくらいならコテハン付ければ?
C vs. C++と全く同じ議論だ
もしC++にデメリットがあるなら使わなければいい
ゆえにC++にはメリットしかない
という理屈
912 :
906:2011/11/02(水) 09:42:24.96
>>910 これでいい?
>>911 俺はさ、
「糖衣構文は自分で使わなければ自分のソースには現れない。でも他人のソースを見た場合はそうではない場合がある。
そしてそれは言語の基本機能であっても外部の誰かの拡張であっても大差ない。故にこの議論はナンセンスである。」
ってことを言いたいんだ。そんだけ。
913 :
906:2011/11/02(水) 09:50:32.69
あと主観的とか利便性がどうこうとかに対する意見も述べておくよ。
これは結局その言語使う人間の大多数が便利と思うかどうか、に帰結するんじゃないかな。
一般のプログラム言語で最初から実装されてるってことはそれが便利だと思う人が多い、ってだけの話なんだろう。
Luaでは諸処の要因で実装されてないけど、あれば使うって人は割といるんじゃね?
++とかは見た目簡潔なのはもちろんだが
luaには関係無いと思うが
左辺値の評価が一回というのが利点
>>913 >一般のプログラム言語で最初から実装されてるってことはそれが便利だと思う人が多い
これが間違いの元。客観性と民主主義は違う。
916 :
906:2011/11/02(水) 11:05:13.08
>>915 その違いがイマイチ分からないから、そこをちょっと俺でも分かるように述べてくれないかな。
できればその結果何故間違いなのか、という部分も一緒に。
>>914 それはポインタか参照の利点なので演算子とは直接は関係ない。
関係ないが、ポインタを移動しないという意味でp[0]と書くのも
ポインタに由来する仕様だな。
>>916 まず、C系が流行っているのは別に「++」が使えるからではない。
つまりC系が流行っていることは理由にならない。
もし、別の時空でPascal系が流行っているとしたら
おまえは「僕チンも含めたみんなが好きなパスカルちゃんには Inc(i) でインクリメントできる。
だからLuaにもIncをつけろ!」と主張するのだろう。
しかし、賢いLuaの中の人がそれに賛同することはないだろう。
919 :
906:2011/11/02(水) 11:22:43.99
>>918 その賛同しないって理由が分からんな。
その時空では流行ってるんだから当然そういう要望は出てくるだろうし、その場合追加することによるデメリットが無さそうに思える。
ユーザーから本当にいらないと思われてるなら単に実装されても死に機能で終わるだけだしさ。
そのコストが無駄ってことかな?
>919
>その賛同しないって理由が分からんな。デメリットが無さそう
マジでそう思ってる?もしかしてプログラマじゃない?
客の要望にただこたえたらへんてこなプログラムができたという経験ない?
「多数決が正しい結論を導くとは限らない」ぐらいは理系の大学でも教えるだろ?
話は戻って、「++だと短く書ける」、この理由付けには客観性があるが
「Luaは短さよりも文法の分かりやすさを重視した」といわれたらどうする?
価値観の違いでしかないので結局反論できず、オナニー言語開発の夢が膨らみはじめる。
しかし、10年後ぐらいに初老を迎えると「何で俺はたかがあんなことで向きになったんだろう」と
思い始める。歴史は繰り返す。
>>920 バランスを考えろ
オナニーは義務ではないが権利としては認められる
922 :
906:2011/11/02(水) 11:39:28.20
>>920 つまり多数決を無視してでも実装しないことのメリットがある、ということだよな?
そのメリットというのをはぐらかさずに簡潔に教えてくれないか?糖衣構文に限っての話でさ。
そもそもLuaの文法がわかりやすいかと言われると…
>>922 >つまり多数決を無視してでも実装しないことのメリットがある、ということだよな?
立証責任の所在をごまかそうとしてもだめだよ。
主張する側がメリットを説明しないと。
そして上で述べたように今までの主張は成功していないよ。
つーか、ソースあんだから、好きに改造しろよ・・・
作者は俺様の思うとおりに作れ!だが俺様はやらん!ってのはびみょーすぎ
明治天皇が「万機公論に決すべし」といってたぞ。
糖衣構文つけなきゃならんだろこれは。
927 :
906:2011/11/02(水) 12:01:28.96
>>924 とりあえず実装することのメリットとしては、コードが短くなって入力ミスが減る、という所だろうか。
というか糖衣構文のメリットってほぼそれだけだよね。
一応その記述が主流の言語で使われていればすんなり受け入れられるという利点か。
まあ使われなければ勝手に淘汰されるだけだし、それは外部の拡張であっても同じ事が言える。
ことさらデフォルト機能としての実装を拒絶する理由としてはどうにも弱いかな、と思う。
そもそも俺の意見としては、別に「糖衣構文を実装しろ!」と言ってるわけじゃなくて、外部拡張も基本機能でも大差ないのに
基本機能に含めることを間違いだのダメな発想だの断じる理由が分からないって事だから。
>>927 >ことさらデフォルト機能としての実装を拒絶する理由としてはどうにも弱いかな、と思う。
ことさらデフォルト機能としての実装を要求する理由としてはどうにも弱い、の間違いだろw
だんだん分かってきてるくせにw
>>927 「俺に金をくれ」と主張するなら
その理由をきちんと説明しないと。
断ったやつに対して「おまえが拒絶する理由は弱い」とか
「おまえが断る理由が分からない」とかいってもだめでちゅ。
930 :
906:2011/11/02(水) 12:24:38.50
>>928 それと「多数派の言ってることが正しいとは限らない」って言ってるけど
これはまさにその通りで、逆に正しい場合もあるってことだよな。
そちらの弁だとどうも「少数派は絶対に正しい」みたいな論調だけども。
結局何が正しいかなんて誰にも分からないことだし、その指標の一つとして「多数決」があるんだから
それを越える正しさを決める方法論をそちらで示してくれないことには到底賛同しかねるな。
もちろん「現Luaユーザーの多数が糖衣構文が不要だと思っている」というような明確なデータがあれば
当然話は違ってくるし、こちらも前述の意見を即刻撤回するぞ。一つの考えに縛られるのはナンセンスだからな。
「相手の言ってる事の逆の事を言い続け、相手からの質問には答えない」
ってのは構ってちゃんの常套手段だ。覚えとけ。
他人の理屈には「屁理屈」とラベリングして、自分はこれだからな
>>930 話をずらそうとしてもだめ。
結局「僕チン(と多数のプログラマ)が慣れてるC++にあるから」
「短く書けるから」以外の積極的な理由はないんだろ?
そんでもってそれだけの理由があればLuaの中の人は糖衣構文を付けてくれると信じてるんだろ?
信じるかどうかはその人の自由だしそれでいいと思うよ。
934 :
906:2011/11/02(水) 12:36:40.48
>>931 すまん。ちょっと熱くなりすぎたな。これで終わりにするわ。スレの人も長々と申し訳ない。
とりあえず糖衣構文に関する自分の考えとしては、
「あれば便利だしあれば使う。しかし無いなら我慢するし、わざわざ自前で実装する程のものではない」ってとこか。
だから欲しいという意見が出るのは共感するし、そこに反論する理由も自分には無いかな。
>>933 という事で一旦よろしいかな?
スレ番も900番台になっちまってるし、これで終わりということで。ディベートみたいでなかなか面白かったよ。
オフィシャルのメーリングリストで、
なぜ追加しないの議論が過去にあっただろうから、
それを追って、まだ議論する余地があると思ったらメーリスにリプライすればいい。
ちなみにCで未定義なのは、a[i]=i++
>>917 左辺値の評価が一回と書いた
ポインタも参照も直接は関係無い
後、昔のCISC CPUでは
効率の良いコードが吐けたというのもある
i++ができるならi**やi//も付けるべき。否定する理由がない。
>>935 やっぱそういう議論って過去にあったりするんだな。
まあLuaでやらないのは何となくコメントの書式のせいのような気がするが…。邪推かな。
リロードしたら、空気読んでなかった。
さーせん
欲しい機能/構文があれば自分で組み込めばいいだけだろ
作ること自体が楽しいならそれでいいけど
作るのが苦痛な人は、需要の大きさを確認しないとコストパフォーマンスが不安だ。
お前ら落ち着いてAngelScriptを使うんだ。
失うものが多すぎる
MetaLuaをLuaJITで動かないのかなと思って
make.shでやってるluacコマンドの変わりにcat input1.lua ... |luajit -b - output.luaでバイトコード吐いてみたけど
コンパイルエラーがあって足踏み状態。
その先のmetaluaコマンドでoutputができないのかーってところ確認したかったのに、残念。
>>943 需要も何も自分が必要だったら作るしかないだろ
>>946 そのへんは公式でないバリアント版のつらいとこだな
∧_∧ / ̄ ̄ ̄ ̄
( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
950 :
デフォルトの名無しさん:2011/11/03(木) 21:14:45.66
Luaってもっさりしてるよね
ユーザーが「もっさり」って言ったら大体Luaが絡んでる
951 :
デフォルトの名無しさん:2011/11/04(金) 00:01:16.17
逆に、もっさりにならない組み込み系言語って何だ?
VM言語で一番もっさりしないレベルのLuaJITでJITをON/OFFどちらでももっさりするようだったら、
C/C++か他の静的タイピングなバイナリ生成できる言語に置き換えるしかない。
もっさりするとこを調べてC++に順次おきかえていくのが lua とか squirrel の適切な使い方だよな
もっさりしてるのってスクリプトで記述する部分が多すぎるんじゃないの?
本当に組み込みで低遅延が必要ならtccなど使ってdynamic code generation
ただ、luaでループ・文字演算と初期化時間入れても20-100倍ぐらい
luajitなら10倍ぐらいで収まるのでは
流石に1秒間に60回luaスクリプトファイルを読み込みに行ってるなんてオチだったりはしないよね
luaファイル長すぎてファンクションを分けたいんだ
メインのluaの中でサブのluaファイルって
どうやって呼び出すの?
requireでよいと思う。
dofile/loadfileなど
次スレそろそろいるかな。980辺りまで行ったら建てようか?
ごめん質問なんだけどさ、luaってデフォルトでrequireできるファイルと
ユーザーが配置してrequireできるファイルのrequire時の記述の書き分けとかできる?
Cで言えば
#include <stdio.h>
と
#include "myHeader.h"
みたいな。
ユーザー定義のものもデフォルトで扱えるものも多分どっちもrequire( "" )
の形式だから人が書いたコード読むとき少し迷うこと多くてさ
>>962 コメントを添えて、空行で区切っておけば、そのうち標準ライブラリを覚えるだろ。
>>962 package.preloadの__indexにフック仕掛けて
モジュール名が'hoge'なら通常の検索パス
モジュール名が'@hoge'なら専用の検索パス
みたいなことも可能っちゃ可能だけどさ
C言語のアレは、スクリプトなら尚更真似するもんじゃないと思うけどねー
>>962 むしろC/C++が割と特殊かと
ほとんどの言語では区別ないと思う
ところでC言語のincludeで" "と< >で囲ってあるヘッダーファイルの違いってなんなの?
探す場所の順番の違いとか、自分で用意したヘッダかコンパイラ側のヘッダかとか
"" だとそのファイルのある場所から探す。<> は規定のパスから探す
プライベートなヘッダファイルとかは .c や .cpp と同じ場所において "" で参照、
パブリックなヘッダファイルは、フォルダを分けておいて、
オプションでパスを指定して <> で参照、といったかんじで使い分けるのが一般的
typedef struct AnyVec {
struct AnyVec *next;
struct AnyVec *prev;
int type;
void *data;
} AnyVec;
こんなvector<boost::any>相当の構造体を引数として受ける
void myprintf(AnyVec* v) {}
な関数があったとして
そのままprintfに流し込むにはどんな方法がありますか?
できればインラインアセンブラ以外のやり方が知りたいです
誤爆った、すまん
>>967-968 おーサンクス。
5〜6年ほど知らずにやってたけど、なんだそんな簡単なことだったのか。
多分あんまり需要ないんだろうな。
>>973 うちの環境だと見れないんだよ、そのJIS規格書……
規格書云々以前の問題だろ…
>>971 2ch数年やっててアンカーのやり方分かんないってレベルだぞそれw
普通入門書が3冊あれば内2冊位はページのどっかでそれについての記述があるw
まぁでも今回知れて良かったじゃないw
978 :
デフォルトの名無しさん:2011/11/06(日) 22:54:40.64
せっくすしよっか(´・ω・`)
∧__∧
(´・ω・) いやどす
ハ∨/^ヽ
ノ::[三ノ :.、
i)、_;|*く; ノ
|!: ::.".T~
ハ、___|
"""~""""""~"""~"""~"
>980
今試してきたけど、クラス用のモジュールに読み込むスクリプトで、
shared class TestClass
{
…
}
って感じでsharedをくっつけてクラスを定義しておいて、別のモジュールに読み込むスクリプトに
shared class TestClass {}
って宣言つければ、TestClassが普通に使えたよ。