トップページtech
981コメント297KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/03/30(水) 01:00:58.93
LuaやSquirrelやAngelScriptなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです
まとめwiki(なにか質問する前に必ずみること!)
http://wikiwiki.jp/lua/

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

■前スレ
【Lua】組み込み系言語総合 その3【Squirrel】
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/
その2 http://pc8.2ch.net/test/read.cgi/tech/1063711237/
その1 http://pc5.2ch.net/tech/kako/1034/10341/1034182349.html
0334デフォルトの名無しさん2011/06/25(土) 19:29:39.23
時間も(半)順序の一種。
認めるも認めないも無いだろ。
0335デフォルトの名無しさん2011/06/25(土) 21:57:57.69
>>331
どうもありがとう
なんだかよくわからなかった
0336デフォルトの名無しさん2011/06/25(土) 23:13:16.65
>>333 には偏見のために何かよく分からないものが見えているようなのだが、
何がどう見えているのかよく分からない。
0337デフォルトの名無しさん2011/06/26(日) 01:10:15.69
そういやLuaのスクリプト内のローカル変数とかってどこに保存されてる?
0338デフォルトの名無しさん2011/06/26(日) 01:32:57.00
宣言された関数の専用スロット
0339デフォルトの名無しさん2011/06/26(日) 13:08:39.45
Luaでクラスの継承で
Object1にindex,newindex,addなど複数のメタテーブルをセットして
Object2はObject1を継承してさらに複数のメタテーブルをセットしたいのですが、
setmetatableやオブジェクトをオーバーライドなど色々やってみましたが、
Object2はセットしたメタテーブルしか呼び出せません。
どうすればObject1も継承できるでしょうか?

0340デフォルトの名無しさん2011/06/26(日) 13:31:25.50
new_hoge = function(base)
local b_ = base
local t_ = {}

setmetatable(t_ , { __index = base } )

local o_ = {}

setmetatable(o_, { __index = setmetatable() } )
0341デフォルトの名無しさん2011/06/26(日) 13:34:24.14
変なとこで送信しちゃった
例えば__indexだけだったら↓みたいな感じでいいとおもう

new_hoge = function(base)
local o_ = {}
setmetatable(o_, { __index = setmetatable({ }, { __index = base }) } )
return o_
end


0342デフォルトの名無しさん2011/06/26(日) 14:31:31.14
>>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
とかで適当に上書き
0343デフォルトの名無しさん2011/06/26(日) 14:34:23.12
__metatable = falseの入ってるクラスを継承するにはどうすれば
0344デフォルトの名無しさん2011/06/26(日) 14:38:06.18
>>343
debug.getmetatableやC関数を介せばいけるけど普通はやらない
0345デフォルトの名無しさん2011/06/26(日) 15:58:37.11
>>341-342
テーブルの値にメタテーブルを指定すればいいんですね。
メタテーブルのことあまり理解していませんでした。
ありがとうございます。
0346デフォルトの名無しさん2011/06/27(月) 07:54:43.92
       //
     /  /   パカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ Lua!!
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

0347デフォルトの名無しさん2011/06/27(月) 20:30:12.75
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で推奨されてる方法を使うのか解らない
0348デフォルトの名無しさん2011/06/27(月) 22:11:58.91
安全に拘るならそもそもスクリプトを使うべきじゃないってことなんじゃないかな
0349デフォルトの名無しさん2011/06/27(月) 22:31:54.81
>>347
それだと、インスタンスごとに関数を作ることになる
0350デフォルトの名無しさん2011/06/27(月) 22:33:46.95
そもそも結論を急ぐ必要がないから
どの方法が普及するかは自然の成り行きに任せればいいんじゃないの
0351デフォルトの名無しさん2011/06/27(月) 22:58:35.96
AngelScript|Д`)ノ<グローバルプロパティ?が何か面白いぞ

_this.Hoge();

とかできる
0352デフォルトの名無しさん2011/06/28(火) 00:06:51.29
ASは3倍早くなってから出直してきてください
0353デフォルトの名無しさん2011/06/28(火) 07:16:08.75
ぼくのASSも3倍出るのがはやくなりたいです><
0354デフォルトの名無しさん2011/06/28(火) 08:21:47.97
   ∧_∧  / ̄ ̄ ̄ ̄
  ( ・∀・) <  Lua!!
⊂/  9)  \____
q(   /
  >  >

0355デフォルトの名無しさん2011/06/28(火) 22:37:19.10
死ね下らんAA貼るカス。
0356デフォルトの名無しさん2011/06/28(火) 23:02:21.92
Lua 5.2.0 (beta-rc3)
いつのまにかgoto文が追加されてた
0357デフォルトの名無しさん2011/06/28(火) 23:07:27.40
gotoなんて要らんがな
0358デフォルトの名無しさん2011/06/29(水) 00:01:05.22
>>355
ツンデレ乙
0359デフォルトの名無しさん2011/06/29(水) 00:17:07.12
continue文を追加してちやほやされるよりも賢い
0360デフォルトの名無しさん2011/07/02(土) 17:30:32.80
goto文とか誰得…
と思ったけどコルーチンを並列化せずに使えるようになるのかな?
面倒くさい宣言書かなくて良くなるなら便利なんだが。
0361デフォルトの名無しさん2011/07/02(土) 17:33:00.45
C++のコードをそのまま使えるスクリプトがあったら便利だと思う
調整ビルドではスクリプト、リリースビルドではコンパイルしてくれるの
0362デフォルトの名無しさん2011/07/02(土) 17:34:02.85
ふつうにDLLでいい気がするけど。
0363デフォルトの名無しさん2011/07/02(土) 17:44:04.56
コンパイルが時間食うから開発中はなるべくしたくないって話じゃね?

C++インタプリタとしては、CINTってのが有名だけど俺は使ったことはない
0364デフォルトの名無しさん2011/07/02(土) 17:45:52.16
メタテーブルっていらなくね?メソッドで十分じゃん。
0365デフォルトの名無しさん2011/07/02(土) 17:46:04.83
DLLレベルなら動作チェックに比べれば時間なんてほとんど食わないだろ
0366デフォルトの名無しさん2011/07/02(土) 17:58:50.13
index,newindex,metatable,gc
よく考えるとこれ以外使ったこと無いわ
動的型はただでさえバグリやすいのにオペレーターまで用意したら訳が分からなくなる
0367デフォルトの名無しさん2011/07/02(土) 18:05:59.16
いちいちDLL作ってられるかよ
0368デフォルトの名無しさん2011/07/02(土) 18:07:02.65
その感覚がわからん。F5かmakeかするだけだろ。
シンタックスチェックもするしむしろビルドしたほうが安心じゃん。
0369デフォルトの名無しさん2011/07/02(土) 18:35:07.47
DLLだと修正してリロードすんのがめんどくさいとおもう
一回アンロードしないといけないじゃん
完全にコールバックな関数だけならいいかもしれんけど
データの引き継ぎとかが起こるとめんどくさくなる
0370デフォルトの名無しさん2011/07/02(土) 20:01:25.28
AngelScript|Д`)ジー
0371デフォルトの名無しさん2011/07/02(土) 21:42:45.91
Boo....
0372デフォルトの名無しさん2011/07/03(日) 07:48:31.25
Lazarusでいいやん
0373デフォルトの名無しさん2011/07/03(日) 11:24:06.78
Luaでメタテーブルを参照して値がなければ
メタテーブルに束縛したメタテーブルを参照するってできない?

table = {}

Ex1 = Extend1.new()
Ex2 = Extend2.new()

setmetatable(table,
 setmetatable(
  {__index = Ex1},{__index = Ex2}))

こんな感じでやってもうまくいかないんだが。
0374デフォルトの名無しさん2011/07/03(日) 11:48:11.95

t = setmetatable( { } , { __index = setmetatable( { EX1 } , { __index = { EX2 } } ) )
0375デフォルトの名無しさん2011/07/03(日) 13:25:20.95
>>374
レスサンクス。ごめん書き方間違えた…。
tableの中にインスタンスが入ってた場合どうすればいいかな?

obj = {X = 1}
t = setmetatable( obj , { __index = setmetatable( { EX1 } , { __index = { EX2 } } ) )

って感じになってた場合、Ex2のメソッドが実行されたとき、
Ex2の第一引数がEx1になってしまってobjの値を参照できないんだが。
0376デフォルトの名無しさん2011/07/03(日) 14:09:50.56
t = setmetatable( obj , { __index = function( _ , k ) return EX1[k] or EX2[k] end } )
0377デフォルトの名無しさん2011/07/03(日) 14:15:50.44
>>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

特に問題ないようだけど?
0378デフォルトの名無しさん2011/07/03(日) 15:13:16.84
>>376>>377どっちがはやいの?
0379デフォルトの名無しさん2011/07/03(日) 15:21:24.66
測ればわかる
0380デフォルトの名無しさん2011/07/03(日) 19:03:20.36
bit、pairs系のmt、公開APIでのdtor、gotoなど
色々更新されてるね
空文が地味に嬉しい
0381デフォルトの名無しさん2011/07/03(日) 20:56:05.97
>dtor
RAII/Disposeキタコレと思ったら、tableにメタメソッド
__gcがつかえますよか・・。残念。
0382デフォルトの名無しさん2011/07/03(日) 22:48:15.59
>>376-377
サンクス。
>>376の方法でできたわ。意外にor文って便利なんだな。
>>377でできたみたいなら自分のやつどこか間違ってんのかな。
まぁ>>376のやつがわかりやすいからこっちでやるよ。
0383デフォルトの名無しさん2011/07/03(日) 22:50:05.58
metatableはなんか初めて触れると素敵感あふれるけどぶっちゃけ多用するのは害悪だと思う
0384デフォルトの名無しさん2011/07/03(日) 23:45:02.89
metaって名前がかっこよすぎるな
もっと恥ずかしい名前にするべきだった
0385デフォルトの名無しさん2011/07/04(月) 00:02:39.73
必死だなテーブル
0386デフォルトの名無しさん2011/07/04(月) 07:51:53.75
           ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ Lua!!
 彡、   |∪|  /
/ __  ヽノ /
(___)   
0387デフォルトの名無しさん2011/07/04(月) 18:34:45.39
>>382
いちおう言っとくけどその変数がブーリアンの場合はorだけじゃできないよ
0388デフォルトの名無しさん2011/07/04(月) 18:44:17.79
lua_tointeger()だとtrueが0になる仕様をどうにかしてほしい...
0389デフォルトの名無しさん2011/07/04(月) 20:58:42.52
>>388
つ luaL_checkint
0390デフォルトの名無しさん2011/07/04(月) 21:23:28.56
メタテーブルってテーブルを形そのままに拡張できるのがうれしいけど、
もともとリストとかセットとか操作演算子とか用意しといてくれよ。
重複排除がしにくくてしゃーない。
0391デフォルトの名無しさん2011/07/04(月) 22:46:14.52
重複排除とか
どこの一神教だよ
0392デフォルトの名無しさん2011/07/04(月) 22:49:06.79
Cに組み込むのってどんなメリットが有るの?
0393デフォルトの名無しさん2011/07/04(月) 22:51:21.12
コンパイルだりーときとか、リリース後に拡張したい時とか
0394天使 ◆uL5esZLBSE 2011/07/06(水) 13:42:06.10
>>388
∨∨∨∨∨∨∨∨∨∨
「「「「「「「「「「「 lua_tointeger()だとtrueが0になる仕様をどうにかしてほしい... 」」」」」」」」」」」(キリ!!!ッッ!!!
∧∧∧∧∧∧∧∧∧(キリッッ!キリッッ!!!きリッッッッ!キリッッ!!!!きリッッ!!!
きも
0395デフォルトの名無しさん2011/07/07(木) 13:26:45.42
ゲ製から誘導されてきた。

できるだけ単純に書けて、単純な出力をするスクリプト言語を作った。
定義ファイル代わり+シーケンスも多少は書けるってとこ。
興味があったらどうぞ。
ttp://kushi.lv9.org/teco/index.html

元々は2Dゲームのエフェクトアニメ記述用で、スプライトの設定とか、アニメパターンの制御に使ってたもの。
多少は汎用性が欲しいなと思ってたらこんな感じになった。
0396見習いちょっと休憩中2011/07/07(木) 19:00:28.98
>>395
実体はアセンブラに組み込むP-codeに近いですか?よく知らないですけど。
VMのソース付きだからコンパイル言語で使うには自由がききそうですね。
0397デフォルトの名無しさん2011/07/07(木) 19:12:01.51
「データは作ってやるからあとはてめーでやれ」
0398デフォルトの名無しさん2011/07/07(木) 21:09:36.40
>>395
何処から本体DL出来るのかと探し回った挙句
ソースからやっとURL見つけた
なんでこんなところにと思ったが
どうやらIEなら普通に表示されてるようだ
0399デフォルトの名無しさん2011/07/07(木) 22:52:44.86
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で関数を評価して値を返すところまでやりたいということです。
0400デフォルトの名無しさん2011/07/07(木) 23:17:24.42
メタテーブルなしだと無理じゃねーかな
つーかそんなコストかけて分かりにくくするなんてことしないほうがいい
スクリプトは簡潔に小さくが基本
0401デフォルトの名無しさん2011/07/08(金) 00:05:16.09
>>399
get_a(){return a++;}
みたいのか
嫌過ぎるw
0402デフォルトの名無しさん2011/07/08(金) 06:49:39.21
>>400-401
get()ってメソッド書くより直接インスタンス受け取ったほうが
使う側でわかりやすいと思ったんですが、やっぱり複雑すぎますね。
やめておきます。
04033952011/07/09(土) 02:10:52.48
レスありがとう。

>>396
P-code って初めて聞いたけど、似たようなものだと思うよ。独自のVM用命令って意味で。
出力バイナリを簡単に、詳細を明確にしておけば、いじりやすいかと思った。
コンパイラのソースも公開予定だけど、これはもうちょい先になる。プライベートな事情で。

>>398
HTMLのチェックしたらひどいことになってたわ。
修正しておいた。報告ありがとう。
0404デフォルトの名無しさん2011/07/09(土) 08:08:17.87
   ∧_∧  / ̄ ̄ ̄ ̄
  ( ・∀・) <  Lua!!
⊂/  9)  \____
q(   /
  >  >

0405デフォルトの名無しさん2011/07/09(土) 10:35:52.59
http://peterodding.com/code/lua/apr/
0406デフォルトの名無しさん2011/07/09(土) 12:25:15.95
日本製は歓迎したいところだけど、使うとなるとちゃんと何年も継続してくれるかが不安だ。
04073992011/07/09(土) 17:48:58.34
すみません。まだちょっと諦めきれないところがあるので
メタテーブルの設定をする関数を作ろうと思っているのですが、

setmetatable({},{__index = setmetatable({},{__index = setmetatable({} …

とメタテーブルの__indexの値がテーブルなら、さらにメタテーブルを付けて入れ子にできますが、

setmetatable({},{__index = function …

と__indexの値を関数にした場合はそのメタテーブルにさらにメタテーブルを付けたりして
入れ子にすることはできないのでしょうか?
0408デフォルトの名無しさん2011/07/09(土) 18:22:50.30
local mt = getmetatable(t) or {}
setmetatable(t, {
__index = function(self,k)
return mt.__index and mt.__index(self,k) or nil
end})
0409デフォルトの名無しさん2011/07/09(土) 18:31:11.10
__index以外の要素もあったらめんどくさいよね、それって
0410デフォルトの名無しさん2011/07/09(土) 22:08:36.28
>>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] )
04114072011/07/09(土) 23:10:07.52
>>408
ありがとうございます。
論理演算で関数つなげれるって便利ですね。
0412デフォルトの名無しさん2011/07/10(日) 00:04:46.61
>>409
基底に垂れ流すだけなら
inherit_mt[k] = base_mt[k]
で参照してあげるだけなので
rideして何をするか次第じゃないかな
0413デフォルトの名無しさん2011/07/10(日) 00:44:27.70
クラスとか継承に向いてないよねLuaって
0414デフォルトの名無しさん2011/07/10(日) 01:58:26.32
プロトタイプベースの継承は、苦手ですか?
クラスベースの継承を使いたいなら、クロージャでクラス実装したライブラリ探すとか?
0415デフォルトの名無しさん2011/07/10(日) 02:01:47.22
http://lua-users.org/wiki/ObjectOrientedProgramming
04163952011/07/10(日) 02:17:52.79
>>406
それを保証するのは難しいね。好きで続けられる分にはいいんだけど。
もし飽きたら重荷を背負い続けることになるし、放棄したら無責任と思われそう。
俺自身がこれを使い続けるのが、動機的にもモチベ的にも一番いい手だろうなぁ。

ちょいと調べてみたが、LuaもPythonも意外と歴史があるんだね。
Lua 18歳
Python 20歳
Squirrel 8歳
0417デフォルトの名無しさん2011/07/10(日) 06:39:10.12
>>413
君がLuaに向いてないんだと
0418デフォルトの名無しさん2011/07/10(日) 07:03:34.78
>>415
javascriptみたいで簡単じゃん
0419デフォルトの名無しさん2011/07/10(日) 07:46:27.83
そもそもプロトタイプベースの継承が、継承には適してないし
ルアにはメタテーブルの問題があるからよけいに継承しにくい
そして厄介なことにクラスの実現方法が何パターンもある
結局のところ基底クラスをソースコードレベルでよく読んで
それから派生クラスのファクトリを書かなければならない
カプセル化や抽象化の概念に喧嘩売ってる
継承に向いてる言語だなんて考えるほうがオカシイ
0420デフォルトの名無しさん2011/07/10(日) 09:47:48.35
>>419
クラスの実現方法が何パターンもあるのは事実であって意見ではない
意見を喧嘩させることはできるが事実は喧嘩しない
0421デフォルトの名無しさん2011/07/10(日) 09:51:17.40
>>420
意味不明
0422デフォルトの名無しさん2011/07/10(日) 10:15:05.57
おまえは5分以内で分からないとキレるのか
0423デフォルトの名無しさん2011/07/10(日) 10:20:34.52
jsと同じルールに落ち着くんじゃね?
0424デフォルトの名無しさん2011/07/10(日) 10:51:32.42
>>420
喧嘩じゃなく選択の問題だろう。
0425デフォルトの名無しさん2011/07/10(日) 14:14:14.23
AngelScript|Д`)<何か面倒くさい事になってるなオイ
0426デフォルトの名無しさん2011/07/11(月) 00:38:50.74
Luaは.と:の違いが視覚的に分かりにくい時点でもうね
チェック機構は組めるけど
そんなところで型チェックとか本末転倒だろ?
要するにだな
もっと開発が活発になるようSquirrel使って下さいお願いします
0427デフォルトの名無しさん2011/07/11(月) 02:11:45.05
> 視覚的に分かりにくい
それはフォントやエディタの色分けに問題があるってだけでLuaと関係なくね?
0428デフォルトの名無しさん2011/07/11(月) 03:01:06.41
直感的って言ったほうが正しいんじゃね
0429デフォルトの名無しさん2011/07/11(月) 07:11:11.68
delphiの := を思い出した。
慣れればどーってこと無いさ。
0430デフォルトの名無しさん2011/07/11(月) 08:23:23.12
フォントやエディタの色分けで.と:の区別がついたところで
どちらを使うのが正しいのかは見ただけでは分からない

コーディング規約で縛るとかで対策してる?
0431デフォルトの名無しさん2011/07/11(月) 08:34:43.52
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())

これで統一するのが一番分かりやすいし安全
0432デフォルトの名無しさん2011/07/11(月) 09:35:08.06
       //
     /  /   パカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ Lua!!
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

0433デフォルトの名無しさん2011/07/11(月) 22:54:42.33
AngelScript|Д`)<型チェック?任せておけ
■ このスレッドは過去ログ倉庫に格納されています