プログラミング言語 Lua その3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/14(土) 13:13:52前々スレ http://pc5.2ch.net/tech/kako/1034/10341/1034182349.html
前スレ http://pc8.2ch.net/test/read.cgi/tech/1063711237/
本家 http://www.lua.org/
lua-users http://lua-users.org/
LuaForge http://luaforge.net/
Lua 5.1 リファレンスマニュアル(日本語訳)
http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html
0593デフォルトの名無しさん
2007/11/18(日) 15:55:190594デフォルトの名無しさん
2007/11/18(日) 15:57:24continueあったほうがそりゃ素直に書けるしなあ。
0595デフォルトの名無しさん
2007/11/18(日) 18:31:11汚いじゃん
0596デフォルトの名無しさん
2007/11/18(日) 18:35:45最悪レベルの汚さだと思う
0597デフォルトの名無しさん
2007/11/20(火) 00:10:47ttp://staff.aist.go.jp/yutaka.ueno/lua/docsjp.html
0598デフォルトの名無しさん
2007/11/20(火) 00:47:150599デフォルトの名無しさん
2007/11/20(火) 01:21:05実現したら自分へのクリスマスプレゼントにする……っ!
0600デフォルトの名無しさん
2007/11/20(火) 01:26:390601デフォルトの名無しさん
2007/11/20(火) 15:30:260602デフォルトの名無しさん
2007/11/21(水) 08:30:15まあそれでも別に困らんかったから、
改造してまで付けるほどでもないなワシは
0603デフォルトの名無しさん
2007/11/21(水) 23:13:33文字化けする2バイト文字の一覧のようなものってどこかに載っていないでしょうか?
0604デフォルトの名無しさん
2007/11/22(木) 00:40:33文字化けはエスケープシーケンスのせい。
"abc"じゃなくて[[abc]]使うといい。
0605デフォルトの名無しさん
2007/11/30(金) 11:15:33入門Luaプログラミング
http://www.amazon.co.jp/dp/4797342722/
0606デフォルトの名無しさん
2007/11/30(金) 12:58:19期待age
0607デフォルトの名無しさん
2007/11/30(金) 14:01:170608デフォルトの名無しさん
2007/12/08(土) 15:22:140609デフォルトの名無しさん
2007/12/08(土) 16:49:380610デフォルトの名無しさん
2007/12/08(土) 23:14:42そういえば以前にも一回読めなくなったときがあったけど、
そのときはサイト全体が読めなかった。
0611デフォルトの名無しさん
2007/12/09(日) 09:57:13うあーー
ac.jpなのを忘れてた orz
保存しとけばよかった
つーか、ac.jpの人って、卒業したら消えるんだよな・・・大抵
0612デフォルトの名無しさん
2007/12/09(日) 10:09:160613デフォルトの名無しさん
2007/12/09(日) 15:36:33googleキャッシュかInternet archive行けばまだ間に合う
0614デフォルトの名無しさん
2007/12/16(日) 01:31:140615デフォルトの名無しさん
2007/12/18(火) 17:31:29グローバルステートを含めすべての内容をコピーすることは可能ですか?
0616デフォルトの名無しさん
2007/12/21(金) 01:33:58スレッドで使って下の関数をコールするとsuspendでC++側に処理を返したときに
a、bのデータが壊れてしまいます。
function CallSuspend(i, j, k, l, m, n, o)
{
local a = 23;
local b = 32;
while(1)
{
suspend();
print("i = " + i + "\n");
print("j = " + j + "\n");
print("k = " + k + "\n");
print("l = " + l + "\n");
print("a = " + a + "\n");
print("b = " + b + "\n");
break;
}
}
0617616
2007/12/21(金) 01:40:57suspendはwakeupでまたスクリプトを起動するのだから、引数の数だけポップする意味がわかりません。
これはバグなのでしょうか?
ちなみに自分の使っているsquirrelのバージョンは2.1.1です。
SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror)
{
SQObjectPtr res;
if(v->Call(v->GetUp(-(params+1)),params,v->_top-params,res,raiseerror?true:false)){
v->Pop(params);//pop closure and args ←※ここ
if(retval){
v->Push(res); return SQ_OK;
}
return SQ_OK;
}
else {
v->Pop(params);
return SQ_ERROR;
}
if(!v->_suspended)
v->Pop(params);
return sq_throwerror(v,_SC("call failed"));
}
0618デフォルトの名無しさん
2007/12/21(金) 10:05:070619デフォルトの名無しさん
2007/12/21(金) 10:54:35どういうことですか?
知っていることがあるなら教えてください。お願いします。
0620デフォルトの名無しさん
2007/12/21(金) 11:04:12>この関数はすべての引数をpopし、スタック上のこのクロージャを取り除く。
>もしretvalがtrueであるなら、クロージャの戻り値がpush される。
>もし関数実行がsq_suspendvmによって中断されたなら、クロージャと引数はスタックから自動的にpopされない。
しかし、自分が実際に追ってみた限りではsuspendでsq_callを抜けた後に引数をポップする処理は実行されています。
それがlocal a,bを破壊しているようなのです。
0621デフォルトの名無しさん
2007/12/21(金) 22:08:56とりあえずなにがしたいのか書こうよ
「これはバグですか?」じゃ作者に失礼すぎるぞ
てめーを卑下しまくる前にちょっとは他人のことを考えようよ
0622デフォルトの名無しさん
2007/12/21(金) 22:20:18616の関数を実行して無事に終了したいだけです。
suspendで処理がC++に帰った後、sq_wakeupvmでスクリプトを再実行したらstackからlocal a,bが消えていて
printでnullを参照してしまうという問題を解決したいんです。
0623デフォルトの名無しさん
2007/12/21(金) 22:29:42ここは作者の掲示板ではないが、
現象が再現するミニマムコードを掲載して、仕様と挙動が異なっている点を報告したうえで、
それがバグかどうかを質問する、ってのは別に失礼でも何でもないと思うけどな。
0624デフォルトの名無しさん
2007/12/21(金) 23:39:26これは現象が再現しない断片コードだし、仕様を取り違えてるし
そもそも一定の条件を満たしていると自分では思えるというだけで
相手に失礼ではないなんてまたどこまで自分勝手な理屈だよ
常識的に考えておかしいだろ
0625デフォルトの名無しさん
2007/12/21(金) 23:46:38>>616は現象が再現しない、って試したの?
あと作者でもないのに、作者に失礼すぎるぞ、なんて言うのも充分に自分勝手な理屈だと思うけどな
0626デフォルトの名無しさん
2007/12/21(金) 23:47:13もったいぶらないで教えてやれよ。
無駄レスが多すぎる。
0627デフォルトの名無しさん
2007/12/21(金) 23:55:38残念ながら2chとはそういう場所なのです。
0628デフォルトの名無しさん
2007/12/21(金) 23:59:24この際原点に戻ろうじゃないか
入門Luaプログラミング
http://www.amazon.co.jp/dp/4797342722/
0629デフォルトの名無しさん
2007/12/22(土) 00:07:36そんな、作者に失礼とか自分勝手とか卑下しまくってるとか言わんでも…
ちなみに俺はよく分からんけど、>>616の動作は期待に反している感じはする。仕様は知らない。
0630デフォルトの名無しさん
2007/12/22(土) 00:10:01断片だから試せない
>あと作者でもないのに、作者に失礼すぎるぞ、なんて言うのも充分に自分勝手な理屈だと思うけどな
俺作者だよ
当然のことながらsquirrelのじゃないけどね
作ってるものが馬鹿からバグ呼ばわりされたときどんな気持ちになるかは分かってるつもり
0631デフォルトの名無しさん
2007/12/22(土) 00:55:43試してないのなら「再現しない」などと断定するなよ。
>>617の箇所のコードを書いた人間の身になって考えると、確かに
一部のコードを載せられて「これはバグか?」と言われるのは
面白いものではないだろうし反論したいことも沢山あるだろうが、
質問に対する回答は一切無く、その感情に任せて馬鹿とか自分勝手とかてめー呼ばわり
するだけってのは作者であろうがなかろうが人間性を疑ってしまう。
0632デフォルトの名無しさん
2007/12/22(土) 01:22:15そうしないと使い方がおかしいかどうかすらわからん。
予想:引数の数を間違えてる
0633デフォルトの名無しさん
2007/12/22(土) 02:02:250634デフォルトの名無しさん
2007/12/22(土) 02:15:540635デフォルトの名無しさん
2007/12/22(土) 02:20:350636デフォルトの名無しさん
2007/12/22(土) 02:26:24断片で不完全なものは試せるはずがない試せないものは再現するはずがない
再現するかどうか観察しなくても断片で動かないんだから再現するはずない
事実を述べてるにすぎないよ
>質問に対する回答は一切無く
ちょっとずつリードしてあげてるじゃん
すぐに解決策が示されるとでも思ったか?俺の人間性が疑われようが甘えはゆるさん
0637デフォルトの名無しさん
2007/12/22(土) 02:58:27甘えを許そうが許しまいがお前さんの勝手だが、それをスレ住人に強要するなよ
レス数はとても少ないがここは色んな人間が見てる
自分のポリシーを他人に強要したり、それを守れない人間を罵倒したいのなら自分の掲示板でやれ
0638デフォルトの名無しさん
2007/12/22(土) 03:22:11function CallSuspend1(i, j, k, l, m, n, o)
{
local a = 10;
local b = 20;
print("Enter CallSuspend1\n");
while (1) {
suspend("abc");
print("i = " + i + "\n");
print("j = " + j + "\n");
print("k = " + k + "\n");
print("l = " + l + "\n");
print("a = " + a + "\n");
print("b = " + b + "\n");
break;
}
print("Leave CallSuspend1\n");
return "done.";
}
local co = newthread(CallSuspend1);
print("Call CallSuspend1\n");
local ret = co.call(1,2,3,4,5,6,7);
print("ret = " + ret + "\n");
print("Wakeup CallSuspend1\n");
ret = co.wakeup();
print("ret = " + ret + "\n");
0639638
2007/12/22(土) 03:23:12Call CallSuspend1
Enter CallSuspend1
ret = abc
Wakeup CallSuspend1
i = 1
j = 2
k = 3
l = 4
a = (null : 0x00000000)
b = (null : 0x00000000)
Leave CallSuspend1
ret = done.
0640638
2007/12/22(土) 03:36:38if (!v->_suspended) v->Pop(params);
に変更して同じコードを実行すると
Call CallSuspend1
Enter CallSuspend1
ret = abc
Wakeup CallSuspend1
i = 1
j = 2
k = 3
l = 4
a = 10
b = 20
Leave CallSuspend1
ret = done.
0641デフォルトの名無しさん
2007/12/22(土) 03:46:14ありがとう!
やっぱり他の人がやってもそうなるんですかー
638さんはスクリプトから実行しているようですが、
自分はC++から呼び出して実行してました。
>>640
自分も同じ方法で対処するしかないのかなと思ってました。
これって結局仕様なんですか?
0642638
2007/12/22(土) 03:48:05function CallSuspend2(i, j, k, l, m) {
local a = 10;
local b = 20;
print("Enter CallSuspend2\n");
while (1) {
suspend("abc");
print("i = " + i + "\n");
print("j = " + j + "\n");
print("k = " + k + "\n");
print("l = " + l + "\n");
print("m = " + m + "\n");
print("a = " + a + "\n");
print("b = " + b + "\n");
break;
}
print("Leave CallSuspend2\n");
return "done.";
}
local co1 = newthread(CallSuspend2);
local co2 = newthread(CallSuspend2);
local co3 = newthread(CallSuspend2);
print("Call CallSuspend2\n");
co1.call(1,2,3,4,5);
co2.call(10,20,30,40,50);
co3.call(100,200,300,400,500);
co2.wakeup();
co1.wakeup();
co3.wakeup();
0643638
2007/12/22(土) 03:49:23Call CallSuspend2
Enter CallSuspend2
Enter CallSuspend2
Enter CallSuspend2
i = 10
j = 20
k = 30
l = 40
m = 50
a = 10
b = 20
Leave CallSuspend2
i = 1
j = 2
k = 3
l = 4
m = 5
a = 10
b = 20
Leave CallSuspend2
i = 100
j = 200
k = 300
l = 400
m = 500
a = 10
b = 20
Leave CallSuspend2
0645638
2007/12/22(土) 04:05:19if (!v->_suspended) v->Pop(params);
でsuspendしているときはスタックを整えていないことから考えるとバグかも
0646デフォルトの名無しさん
2007/12/22(土) 04:06:59Squirrel全然分からん(昔Hello World試したくらい) けど、勉強がてら俺も>>616試したら同じ結果になった。
ちなみに引数の数を 7つから変更(呼び出し元も変更)していくと、
3つになったところでbが正常になり、2つになるとaもbも正常になった。
これが仕様だとすると何か根本的根本的に使い方間違ってんのかな?
sq_call とか sq_wakeupvm とかの引数とか色々変えてみたけど、勉強がてらなんでまだよく分からん。
整理できたら多少空気読みつつ晒してみる
0647デフォルトの名無しさん
2007/12/22(土) 04:08:590648デフォルトの名無しさん
2007/12/22(土) 04:10:37あまりバグバグ言うとまた五月蝿くなるからやめとけ
0649632
2007/12/22(土) 04:13:48おわびにってことで俺もしらべてたんだが、既に638 で結論でてた…
function test(i,j,k,l,m) {
local a = 10;
local b = 20;
for (a=0;a<10;a++) {
suspend();
print("a=" + a + "\n");
print("b=" + b + "\n");
}
print("done");
}
a <- newthread(test);
a.call(1,2,3,4,5);
while (a.getstatus() == "suspended") {
a.wakeup();
}
こんなかんじのコードで簡単に再現できる。test の引数の数を減らすと
ローカル変数が破壊されなくて止まらなくなるので、sq_call での引数の解放でローカル変数を
破壊してるという、641の推測は正しいと思う。どういった修正が適切かは断言できないけど、
バグなのは間違いないので、本家に報告したほうがよさそう。
自分の手元でこの種のスレッドの suspend を使ったコードはいたるところにあるんだが
なんでいままでトラブルなかったんだろう、とおもってコードを見直したら、
パラメータは bindenv したオブジェクトのメンバ経由で渡してて、引数を全くつかってなかったよ^^;
0650デフォルトの名無しさん
2007/12/22(土) 04:15:59まさにまさに!
自分もまさか4つ以上引数を渡すのはダメとかそういう仕様じゃないよな?
でもこんなイージーなバグがあるわけないよな?
てな具合にずっと悩んでたんです!
0651デフォルトの名無しさん
2007/12/22(土) 04:26:04だからバグだバグだと騒ぐなと
0652デフォルトの名無しさん
2007/12/22(土) 04:42:000653デフォルトの名無しさん
2007/12/22(土) 04:47:46スタック上にローカル変数があろうが無かろうが、suspend時点でのスタック変数を引数の数だけ問答無用で開放してしまうのか。
なんで>>646みたいに現象は引数の数に変化を受けると。
で、単に使い方が悪いのかバグなのかは不明だけど、
squirrelのコードを>>640の通りに変更すれば少なくとも、この問題は解決、と。
0654649
2007/12/22(土) 04:56:400655デフォルトの名無しさん
2007/12/22(土) 05:08:02ところどころ動詞やらが可笑しいけど伝わるな
Unknown table ってのは内部用のローカル変数のテーブルか何かなのかね?
他のスレも見てみたけど本家のフォーラムって意外と閲覧数少ないんだな・・・
0656デフォルトの名無しさん
2007/12/22(土) 09:53:250657デフォルトの名無しさん
2007/12/22(土) 10:28:100658デフォルトの名無しさん
2007/12/22(土) 11:48:48前スレ&現行スレ嫁
0659デフォルトの名無しさん
2007/12/22(土) 15:55:020660デフォルトの名無しさん
2007/12/22(土) 23:29:26http://squirrel-lang.org/forums/2318/ShowThread.aspx#2318
0661デフォルトの名無しさん
2007/12/23(日) 00:00:33結論としてはやっぱりバグで、修正方法は>>640の通りだったと。
発見された>>616氏、本家に報告されたほげげ氏、その他検証された方々乙でした。
0662デフォルトの名無しさん
2007/12/23(日) 00:03:02報告乙
0663デフォルトの名無しさん
2007/12/23(日) 00:05:59621のこと忘れてるぞ
椰子の煽りがなければ住人もここまで迅速に動かなかっただろう
0664デフォルトの名無しさん
2007/12/23(日) 00:09:110665デフォルトの名無しさん
2007/12/24(月) 03:36:260666デフォルトの名無しさん
2007/12/24(月) 06:09:14A5、256ページで\2310ってちょっと高くないかな、、、こんなもんか
買った人レビュー希望
0667デフォルトの名無しさん
2007/12/24(月) 07:01:02値段はまあ普通だろうね
マイナー言語の一種だし・・・
Erlang入門なんて同じ値段で200ページしかない。
ともかく日本語で出たことが快挙
0668デフォルトの名無しさん
2007/12/24(月) 11:33:56入門書としてはこれくらいの長さのほうがとっつきやすいかも。
Lua触るの初めてでしたが、読みやすくて、なかなかよかったです。
奥付みてみたら、2008年1月3日初版第一刷発行とか書いてあってワラタ
0669デフォルトの名無しさん
2007/12/24(月) 11:47:05実際の発売日よりも1ヶ月くらい未来の日付になっているのでしょうか?
ttp://q.hatena.ne.jp/1153656810
0670デフォルトの名無しさん
2007/12/25(火) 00:55:20第一部が基本文法。標準ライブラリとか。さくっと読める
第二部がアルゴリズム実装しながらその他機能。結構いろいろ詰まってる。
第三部がC言語との連携その他。
入門ならこの厚さがちょうど手頃でいいかも。
0671デフォルトの名無しさん
2007/12/25(火) 01:17:43実際に使い出して結構経つ俺には、どのぐらい役に立つのかなぁ。
0672デフォルトの名無しさん
2007/12/25(火) 05:18:46第三部ってどの程度ページある?
ここがある程度詳しく書かれているなら買ってみてもいいかなあ
0673デフォルトの名無しさん
2007/12/25(火) 13:28:19第三部の内訳
第9章 Luaを拡張してみる - 13
第10章 Luaのモダンな機能 - 15
第11章 C言語との連携 - 13
第12章 Luaの組込み - 10
0674デフォルトの名無しさん
2007/12/25(火) 14:21:04詳しい情報さんきゅ
帰ったら注文するわ
0675デフォルトの名無しさん
2007/12/31(月) 01:59:290676デフォルトの名無しさん
2007/12/31(月) 02:29:49というより見られなくなってたのはほんの短期間だった
floatのスペルミスはどうにかならないかなあ
0677デフォルトの名無しさん
2007/12/31(月) 02:33:56分からんから、見たかった人は今のうちに見ておくのが良いかと。
0678デフォルトの名無しさん
2007/12/31(月) 02:40:16保存しとこう。
0679デフォルトの名無しさん
2007/12/31(月) 07:40:09でもac.jpですから、今のうちということですな
0680デフォルトの名無しさん
2007/12/31(月) 15:23:23かなり長い間見れなかったような気がするんだが。
まあどっちだっていいんだけど。
0681デフォルトの名無しさん
2008/01/01(火) 00:52:150682デフォルトの名無しさん
2008/01/02(水) 02:20:120683デフォルトの名無しさん
2008/01/02(水) 02:40:09今年も、組み込み言語が流行るといいな!
0684デフォルトの名無しさん
2008/01/09(水) 20:52:060685デフォルトの名無しさん
2008/01/10(木) 09:07:06>test.cpp:
>Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
>Error: 外部シンボル '_luaL_newstate' が未解決(D:\P\BORLANDC\TEST.OBJ が参照)
>Error: 外部シンボル '_luaL_loadfile' が未解決(D:\P\BORLANDC\TEST.OBJ が参照)
>(以下略)
こんな感じでリンクできないんですがどうしたらいいですか。
パスは通ってると思うんです。lua 5.1.2です。
0686デフォルトの名無しさん
2008/01/10(木) 10:45:48勘だけどextern "C" かな。src/lua.hの代わりにetc/lua.hppを使ってみるとか。
0687685
2008/01/10(木) 16:12:220688デフォルトの名無しさん
2008/01/10(木) 21:31:190689685
2008/01/10(木) 21:46:05extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
main(){
double z;
lua_State *L = lua_open();
lua_dofile(L, "add.lua");
}
0690685
2008/01/10(木) 21:47:080691デフォルトの名無しさん
2008/01/10(木) 21:49:42VCでコンパイルされたライブラリをリンクするときに良くある問題。
詳しくはぐぐればわかると思う。細かいことは忘れた。
0692デフォルトの名無しさん
2008/01/10(木) 22:00:54■ このスレッドは過去ログ倉庫に格納されています