プログラミング言語 Lua
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGhttp://www.lua.org/
0232デフォルトの名無しさん
NGNG記述できるようになるんだけど、Luaって改変して配布するのってOKなの
かな?
まぁ、そこまでして使うのはどうかと思うけど、どーせ使うならあのダサ
いコメント「--」だけは//辺りに変更する事をお勧めするよ。
0233デフォルトの名無しさん
NGNG>ダサいコメント「--」だけは//辺りに変更する事をお勧めするよ。
正直、//に比べて--のどこがダサいのかわからん。
単にお前の好き嫌いだろ?
0234デフォルトの名無しさん
NGNGあ SQL もそうだよ
珍しくもないな
0235デフォルトの名無しさん
NGNG0236デフォルトの名無しさん
NGNG0237デフォルトの名無しさん
NGNG理由は簡単。Cへの組み込みスクリプトだからコメントがCと同じほうが
いいに決まってる。それに--はCではデクリメント演算子なので意味合い
が違う。だから--コメントはダサい。と、個人的に思う。
まぁちょっとパッチ当てるだけで変更出来るんだからいいんだけどね。
0238デフォルトの名無しさん
NGNG0239デフォルトの名無しさん
NGNG0240デフォルトの名無しさん
NGNG今じゃ // コメントは ISO C の標準になってるよ。
0241デフォルトの名無しさん
NGNG0242デフォルトの名無しさん
NGNG0243デフォルトの名無しさん
NGNGInvalid option `-std:c99'だってよ。ちなみにgcc 2.95.3
0245デフォルトの名無しさん
NGNGLua(5.0beta)はMITライセンス(修正BSDライセンス相当)だから、
自由に改変、再配布できるよ。
俺もコメントは//か#がいいのでパッチ作成キボン。
ついでにdo ... endを{ ... }にしてくれると最高。
0246デフォルトの名無しさん
NGNGtest.c:
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
int main(int argc, char **argv) {
int index, i;
lua_State *L, *co;
L = lua_open();
lua_baselibopen(L);
index = lua_gettop(L);
lua_dofile(L, "test.lua");
lua_settop(L, index);
lua_getglobal(L, "coroutine");
lua_pushstring(L, "create");
lua_gettable(L, -2);
lua_getglobal(L, "co_func");
lua_call(L, 1, 1);
co = lua_tothread(L, -1);
lua_setglobal(L, "co");
index = lua_gettop(L);
for (i = 0; i < 4; i++) {
lua_pushnumber(co, i);
printf("c: resume=%d\n", lua_resume(co, 1));
printf("c: co top=%d, L top=%d\n", lua_gettop(co), lua_gettop(L));
printf("c: co result1=%lf\n", lua_tonumber(co, -2));
printf("c: co result2=%lf\n", lua_tonumber(co, -1));
}
lua_close(L);
return 0;
}
0247続き
NGNGfunction co_func(arg)
i = 100
print("co_func: start")
while 1 do
print("co_func: arg=", arg, " i=", i)
i = i + arg
arg = coroutine.yield(i, arg)
end
end
0248デフォルトの名無しさん
NGNGこんな感じでもOK
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
int main(int argc, char **argv) {
int i;
lua_State *L, *co;
L = lua_open();
lua_baselibopen(L);
lua_dofile(L, "test.lua");
co = lua_newthread(L);
lua_getglobal(co, "co_func");
for (i = 0; i < 4; i++) {
lua_pushnumber(co, i);
printf("c: resume=%d\n", lua_resume(co, 1));
printf("c: co result1=%lf\n", lua_tonumber(co, -2));
printf("c: co result2=%lf\n", lua_tonumber(co, -1));
}
lua_close(L);
return 0;
}
0249デフォルトの名無しさん
NGNGうお神降臨!さっそく試してみます。ところでlua_closethreadって実装されて
なさげなのですが、任意のスレッドを開放するにはどうすればいいんでしょうね?
lua_close使うとエラー 出るし。マニュアルにはちゃんとあるんだけどなー。
>>245
Lua5.0b file:llex.c line:317に次レスを追加。//と/**/が普通に使えるようになります。
きちんとデバッグしてないので自己責任でどーぞ。#も似たような感じで。
ちなみに漏れはlua_commentblock( "//" , "/*" , "*/" )で自由にカスタムできるよう
にしてます。あと、--コメントを消し去りたいのならその次のブロックをコメントアウト。
Cスコープ{}にあわせる方法はLuaを弄る訳ではなくプリプロセスを通してLua
コードに変換するだけなので汎用性はあるけど、ちょっと微妙。スマヌ。
0250デフォルトの名無しさん
NGNGnext(LS);
if (LS->current != '/' && LS->current != '*' ) return '/';
/* else is a comment */
//long comment
if (LS->current == '*'){
while (1){
if( LS->current == '*' ){
next(LS);
if( LS->current == '/' ){
next(LS);
break;
}
continue;
}
if ( LS->current == EOZ) break;
next(LS);
}
continue;
}
//short comment
next(LS);
while (LS->current != '\n' && LS->current != EOZ){
next(LS);
}
continue;
}
0251デフォルトの名無しさん
NGNG上の7行目(if (LS->current == '*'){の次)に
next(LS);
を追加しといてちょ。
0252デフォルトの名無しさん
NGNG0253デフォルトの名無しさん
NGNGたとえ改変OKでも、言語仕様を変えてしまうのはどうかと思う。
0254デフォルトの名無しさん
NGNG0255デフォルトの名無しさん
NGNG>ところでlua_closethreadって実装されて
GCに引っ掛けると開放されるのかな?
というか、変数参照されたスレッドをクローズしちゃうとかなりやばそう。
0256デフォルトの名無しさん
NGNGすんげー量の未使用メモリが残るのな。開放のタイミングも全然良く解か
らんし、こりゃメモリリソースがキツい環境じゃ使用がためらわれるな。
断片化怖いしな。
0257デフォルトの名無しさん
NGNG0258デフォルトの名無しさん
NGNGそりゃダメダメだな。
採用しようかと思ってたが、見送ることにするよ。
0259デフォルトの名無しさん
NGNGただ、MLの感じでは5.1あたりから#もコメントとして認識される方向のようだね。
0260デフォルトの名無しさん
NGNGわかりやすく説明してほしいなぁ。
0261デフォルトの名無しさん
NGNG0262デフォルトの名無しさん
NGNG>>248の例だと、
co = lua_newthread(L); ここで"test.lua"の実行環境整えて、
lua_getglobal(co, "co_func"); co_funcを探して、
lua_pushnumber(co, i); co_funcに引数わたして、
printf("c: resume=%d\n", lua_resume(co, 1)); co_funcがyieldを実行するまで待って、
printf("c: co result1=%lf\n", lua_tonumber(co, -2)); スタックから結果を取り出す。
って感じで理解できるんだけど、
>>246の例では、getglobalとかgettable,settop等が何をやっているのかわかりません。
0264デフォルトの名無しさん
NGNGあー、coroutine, thread関係はとりあえず忘れたほうがいいかも?
5.0の新機能だし。
>>246のforの前まではLuaで書くと、以下の文と同様のことをしてる。
co = coroutine.create(co_func)
(1)lua_getglobal(L, "coroutine");
グローバル変数"coroutine"をスタックのトップに積む
ちなみにこいつはテーブルだ。
(2)lua_pushstring(L, "create");
文字列"create"をスタックのトップに積む
(3)lua_gettable(L, -2);
スタックのトップから2番目の要素((1)のcoroutineのこと。テーブルである必要がある。)から、
スタックのトップに積んである文字列("create")で示されるメンバをスタックに積む。
このとき、スタックのトップはpopされる。
ちなみに、createメンバは関数なので、その関数がスタックのトップに詰まれる。
こいつは、(4)で使われる。
(3)lua_getglobal(L, "co_func");
test.luaで定義された関数co_funcをスタックのトップに積む。
続く...
0265続き
NGNG関数コール: 引数が(3)のco_funcで、呼ぶ関数が(2)のcreate。
ちなみに、lua_call(L, m, n)と呼ぶときは、スタックは以下のようになってなければならない。
stack: ... [関数] [引数1] [引数2] ... [引数n] <- ここがスタックのトップ
で、呼ばれるとスタックはこうなってる↓。
stack: ... [戻り値1] [戻り値2] ... [戻り値m] <- ここがスタックのトップ
つまり、(4)は、
[関数"create"] [関数:"co_func"] -> [createの戻り値(スレッド)]
となるわけだ。
(5) co = lua_tothread(L, -1);
lua_setglobal(L, "co");
スタックのトップから値をスレッド型でとってきてそれをグローバル変数"co"に設定する。
こんなんで分かるかな?スタックの状態を想像しながら読んでくれ。
coroutineのことは置いといて、LuaをCから使うための基本は大体入ってるような
気がする(グローバル変数の操作、テーブルの操作、Luaの関数呼び出し)。
あとは、indexの指定の仕方とかどの関数で何がpushされて何がpopされるかが
分かれば大体作れると思うんだけど。
ちなみにcoroutineは、lua_baselibopen(L)を呼んだときに定義されます(ハズ)。
0266デフォルトの名無しさん
NGNG× ちなみに、lua_call(L, m, n)と呼ぶときは、スタックは以下のようになってなければならない。
○ ちなみに、lua_call(L, n, m)と呼ぶときは、スタックは以下のようになってなければならない。
0267デフォルトの名無しさん
NGNG関数が呼ばれるのは、lua_resumeが呼ばれたとき。
lua_resumeは、スレッドのスタックの一番下(index=1)に積んである関数を
呼ぶ(もしくはyieldで中断された実行を再開する)関数ね(多分)。
lua_resumeに指定するのはLじゃなくてスレッドオブジェクトだということに注意。
で、>>248も>>246も
co = coroutine.create(co_func)
for i = 0, 3 do
r1, r2 = coroutine.resume(co, i)
print("main:", r1)
print("main:", r2)
end
と動作的には同じ事をしてる(厳密に同じわけじゃないけど)。
test.luaのこいつを書き加えれば同じように動くよ。
0268デフォルトの名無しさん
NGNG0269デフォルトの名無しさん
NGNGcoroutine.createってcoroutine["create"]って感じですね。
すごくわかりやすくて、Luaを組み込めるようになりそうです。
どうもありがとうございます。
0270デフォルトの名無しさん
NGNGhttp://216.239.53.100/search?q=cache:www.etl.go.jp/etl/divisions/~ueno/lua/manual4jp.html
0271デフォルトの名無しさん
NGNGhttp://staff.aist.go.jp/yutaka.ueno/lua/manual4jp.html
0272デフォルトの名無しさん
NGNGこっちは最後まであるんだね。
これまで、googleのキャッシュをローカルに保存してみてたので、
ちゃんとしたのがあるのは嬉しいなぁ。
0273デフォルトの名無しさん
NGNGちょっとだけ混乱したよ。
0274デフォルトの名無しさん
NGNGと
table:function(a, b, c)
は逆にして欲しかった。
もしくは、JavaScriptみたいにselfを暗黙のローカル変数にするか。
0275デフォルトの名無しさん
NGNG0276デフォルトの名無しさん
NGNGそれを一挙に代入しようとすると、扱いが変わってしまうとき
があるようなので、ちょっと萎えた。
0277デフォルトの名無しさん
NGNG例えばどんな場合か書いてもらえると嬉しい。
0278デフォルトの名無しさん
NGNGx,y=2,3
ならお望み通り
しかし、aho(0)->4,5 と返す関数があったとして、
x,y,z=aho(0),6
としてみて!
0279デフォルトの名無しさん
NGNGたとえば
A, B, C を集合とするとき <a,b>∈A×B, c∈C に対して
<x,y,z> = <<a,b>, c> で x=a ∧ y=b ∧ z=c を期待すべきか?
まあ、確かにそうかも知れない。
しかし、
x,y,z = 1,2 ; x == 1 and y == 2 and z == nil
が成り立つ世界でもそれは妥当か?
0280デフォルトの名無しさん
NGNGfunction a()
return 1, 2
end
x, y, z = 0, a()
とすると、
x=0, y=1, z=2
なんだよね。
確かに一貫性がないように見えるね。
リスト中に多値を返す関数がある場合は、
・リストが展開される
・常に戻り値が一つに丸められる
のどちらかに統一した方が仕様的には美しいかも?まぁ、好みの問題か。
(ただ、前者だと関数がいくつ値を返すかによってプログラムの動作が
異なってしまうので好ましくない。)
ちなみにこの辺の動作は、マニュアルの「Calling Functions」の項に
それとなく書かれてる。
0281280
NGNG×「Calling Functions」の項
○「Function Calls」の項
http://staff.aist.go.jp/yutaka.ueno/lua/manual4jp.html#SECTION00045800000000000000
0282デフォルトの名無しさん
NGNG0284デフォルトの名無しさん
NGNGL
ua 4.0 Copyright (C) 1994-2000 TeCGraf, PUC-Rio
>
> print((function()end)())
error: `)' expected;
last token read: `(' at line 1 in string "print((function()end)()) "
>
なんか実行できねーんですけど。
このインタプリタなんかおかしい?
0285デフォルトの名無しさん
NGNGerror: <statement> expected;
last token read: `(' at line 1 in string "a=(function()end)(); print(a) "
なんなの、これ。
一つも実行できねえ。
全然駄目だ・・
0286デフォルトの名無しさん
NGNGこれでどうしろと。
0287デフォルトの名無しさん
NGNGLua 5.0 (beta) Copyright (C) 1994-2002 Tecgraf, PUC-Rio
$ lua -e 'print((function()end)())'
$ lua -e 'a=(function()end)(); print(a)'
nil
0288デフォルトの名無しさん
NGNG-eつかわないでやりたいんだけど
0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNGんじゃこれ
$ lua4
Lua 4.0.1 Copyright (C) 1994-2000 TeCGraf, PUC-Rio
> function f() end
> print(f())
> a=f(); print(a)
nil
0291デフォルトの名無しさん
NGNGそっちは通った。
なんで>>282はダメなの?
なんかLuaって構文的に変だよな。
0292デフォルトの名無しさん
NGNGただ単に、
'(' 式 ')' '(' 引数リスト ')'
っていう構文が定義されてないだけでしょ。
5.0にあるHISTORYに
+ more general syntax for function calls (e.g. (print or write)(9)).
とか書いてあるから、>>282みたいな構文は5.0から新設されたんだと思われ。
0293デフォルトの名無しさん
NGNG4のころは
function foo() return function() end end
とは書けたけど、無名関数に適用する構文がなかった。
関数がファーストクラスオブジェクトな言語ではそれは不便なわけで、
実際5では使えるようになったわけで、喜ばしいんじゃないの。
0294デフォルトの名無しさん
NGNGfunction f0() return end
function f2() return 1,2 end
に対して
a,b,c,d = f2(),f0(),f2(),f0() は a,b,c,d=1,2,1,2 か a,b,c,d = 1,2,nil,1,2 か。
しかし実際はどちらでもなく a,b,c,d = 1,nil,1,nil となる(>>278)。
では print(f2(),f0(),f2(),f0()) はどうか。
これは print(1,nil,1) と等価(省略可能な引数は値がなければ渡されないから)。
まあ仕組みは分かるんだけど、理屈は納得しにくい。
0295デフォルトの名無しさん
NGNG英語メール打ってよ。
「日本ではendが不評です。
functionは長すぎです。」って。
あとさ、returnあるときと無いときってどうなってるの?
print(function()end)
ってreturn書いてないからエラーにすべきじゃないの?
a = function()end
print(a())
print(a(), 1)
nil 1
結果も違うし、おかしいよこれ。
0296デフォルトの名無しさん
NGNGnil
さっぱりわからん
0297デフォルトの名無しさん
NGNG値のない関数自体は悪くないんじゃない?
まあ明示的な return がなければ最後の値またはnilを返すというのもありだと思うが。
それから>>294もいってるように最後の引数は省略可能なので
print((function()end)()) は print() と同様の扱い。
0298デフォルトの名無しさん
NGNG0299デフォルトの名無しさん
NGNG> function nul() end
> argn(nul())
0
> argn(nul(),nul())
1
> argn(nul(),nul(),nul())
2
0300デフォルトの名無しさん
NGNGそういうことじゃなくて、つまりさあ、
a()は値を返さない関数なわけだから、
他の関数の引数として使われた時点でエラーにでもしないと
辻褄合わないでしょって事。これじゃバグ埋めこみまくり。
print(a())
error: 値を返さない関数a()を引数に適用しました
とかなんとか。
もうだめぽ。
0301デフォルトの名無しさん
NGNGちょっと気持ち悪いかもな。
C言語APIいじってるとそのうち違和感なくなったりするんだがw
0302デフォルトの名無しさん
NGNGerror: `=' expected;
last token read: `<eof>' at line 1 in string "a"
もういいや。
疲れただけだった。
0303デフォルトの名無しさん
NGNG・リスト(引数リスト、多値代入リスト)の途中に現れた場合、1個の戻り値が要求される
・リストの最後に現れた場合、戻り値がそのままリストに加えられる
・どちらの場合でも、戻り値が要求された個数に満たない場合はnilが補完される。
また、多すぎる場合、先頭から要求された個数のみ使用される。
5.0からは次の場合が追加されてる。
・()で括られた場合、1個の戻り値が要求される。
んで、要求された個数だけ値がリストに加えられて、多値代入なり、
関数コールに使われるわけだね。
0304デフォルトの名無しさん
NGNGうーむ、どういうバグを埋め込んでしまうんだろう。。。?
0305デフォルトの名無しさん
NGNG値を返すつもりがreturn書いて無かった
↓
エラー出ない
↓
気付かない
↓
動かない
0306デフォルトの名無しさん
NGNGLua使えねえ
↓
作者にスパムメール
↓
タイーホ
↓
(´・ω・`) ショボーン
↓
仮釈放
↓
復讐のオニ(`・ω・´)
↓
作者にスパムメール
↓
(繰り返し)
0307デフォルトの名無しさん
NGNG動的型付けの言語でそれを期待する方がおかしいと思うが…。
luaだけの問題じゃないし。
(というか、インタプリタでそういうえら出すやつってあんまりないような。)
0308デフォルトの名無しさん
NGNG0309デフォルトの名無しさん
NGNGちゃんと読んでよ。
問題はそこじゃないくて、returnの付け忘れで値が変化することだろ。
防止できないならreturnなんて構文は無い方がいい。
ということ。
0310デフォルトの名無しさん
NGNGこういう問題は起きない。
0311デフォルトの名無しさん
NGNG>>298に同意。
0312デフォルトの名無しさん
NGNGそれともそのバグのある関数をほかの関数呼び出しの引数の最後にくっつけたとき、
渡される引数の個数が異なるのことを問題にしてる?
0313デフォルトの名無しさん
NGNG>>309
0314デフォルトの名無しさん
NGNGrubyなら、
def foo
initialize()
result = ...
finalize()
result
end
def foo
initialize()
result = ...
finalize()
end
で、値が違ってくるでしょ?
これは、luaのreturnありなしと同じことじゃない?
それともこんな書き方は「できない」ようにした方がいい?
0315デフォルトの名無しさん
NGNGつまりこういうこと。
> a = function() return 0 end
> b = function () a() end --return付け忘れた
> b()
> print(a())
0
> print(b())
あれれ・・
0316デフォルトの名無しさん
NGNG0317デフォルトの名無しさん
NGNGやっぱり引数の数を問題にしてる?
それが問題になるのは、可変長引数の関数のときだけでしょ?
もしくは、本当に値のことなら、
def foo
0
end
def foo
0
print "debug..."
end
とか、つまらんミスだけど完全には「防止」できないよね?
(俺には「値を返す場所が1つ」で「そこにreturnを付け忘れた」なんていうミスは
上と同列(文法を理解してない)に見える。)
まぁ、関数にreturnが一つでもついていたら、
「returnで値を返さないパスが存在します。」とかの
warningくらい出してくれてもバチは当たらないだろうけどね。
0318デフォルトの名無しさん
NGNGなんか、全然理解してくれてないね。
もういいよ。
0319デフォルトの名無しさん
NGNG代入文も値を持つので a = b = 0 とか出来るようになるが、
一方で a = b == 0 も合法になるので、
if a = 0 then ... end というありがちな罠が出来るわけだがその辺はどうよ。
0320デフォルトの名無しさん
NGNG誰かもっと実際にありえそうな例で解説してくれ。
0321デフォルトの名無しさん
NGNGあんたの好きなrubyの場合、
def a(x) print(x) end と def a(x) return print(x) end で a(1) は nil を返すし、
lispならそもそも return がないが、lua の場合、
function a(x) print(x) end と function a(x) return print(x) end は違うのが危ない
っていってんだろ。
0322デフォルトの名無しさん
NGNG> b = function()end
> print(a(b()))
> print(a(0))
0
確かに危険だなこれ。
0323デフォルトの名無しさん
NGNGという事だな。
Luaは関数のくせに値を返さない可能性がある。
0324デフォルトの名無しさん
NGNG0325デフォルトの名無しさん
NGNGその場合もfunctionで書いたとき、
return忘れをチェックできないと解決しない。
全ての関数が値を返すという前提で、
return削除するのが一番簡単で楽だと思うけど。
0326デフォルトの名無しさん
NGNG0.5の方がいいんじゃないのか。
0327デフォルトの名無しさん
NGNGreturnはセミコロン(;)と同じ様に、あってもなくてもいい事にすれば、
修正も最小限で済むかな。
さらに変な言語になるけど。
0328デフォルトの名無しさん
NGNGいやいや、subroutine は本来値を持つものではないのよ。
しかし return によって値つきで戻ることが出来るわけで。
0329デフォルトの名無しさん
NGNG0330デフォルトの名無しさん
NGNG単に構文要素 procedure をケチっただけなんだろうか
0331デフォルトの名無しさん
NGNGなんじゃそりゃ。
>>329
それも問題ある。
というか問題が変わってない。
■ このスレッドは過去ログ倉庫に格納されています