トップページtech
582コメント172KB

プログラミング言語 Lua

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
Lua について語ろう。

http://www.lua.org/
0112 NGNG
最近、淋しいので…
>>103 C言語onlyソースから呼び出して使う...

system("lua");

さぶ〜
0113デフォルトの名無しさんNGNG
>>103 >>111
LUAのソースはC言語だし、組み込み用のヘッダファイルも全部C言語なのだがー
0114113NGNG
訂正。
gsub(>>113, ">>111",">>112")
0115デフォルトの名無しさんNGNG
ちらっと見るだけだといまいちそそられる感が無いんだけど
誰かどんな点が特徴として熱いのか熱く叫んで。
0116デフォルトの名無しさんNGNG
小さい。
0117Go LuaNGNG
あつい国ブラジルで生まれたんだYo-!!!
0118デフォルトの名無しさんNGNG
#include <stdio.h>
#include "lua.h"
#include "lualib.h"

int main(void){
 lua_State *L=lua_open(0);
 lua_strlibopen(L);
 lua_dostring(L, "a = 1*2*3*4");
 lua_dostring(L, "b = gsub('age sage', '(%w+)', '%1 %1')");
 lua_getglobal(L, "a");
 lua_getglobal(L, "b");
 printf("a = %f\n", lua_tonumber(L, -2));
 printf("b = %s\n", lua_tostring(L, -1));
 lua_close(L);
 return 0;
}
0119デフォルトの名無しさんNGNG
これmakeしないと使えない。。。
winでmakeする方法を教えてください。
0120デフォルトの名無しさんNGNG
makeでけた
0121デフォルトの名無しさんNGNG
luaユーザー募集age
0122デフォルトの名無しさんNGNG
あるところで、rubyのようでいてオブジェクト指向でない言語として
紹介されたんだが。。。

luaってどう読むの?「ルア」でいいの?

あと、流行ってますか?
0123デフォルトの名無しさんNGNG
かなり昔、Cマガで取り上げられたの見たっきりだな。
単純だという事以外には、特に利点も無さそうだ。
0124デフォルトの名無しさんNGNG
組み込み向け、サイズが相当小さい(100k以下)、ゆるいライセンス、が特徴かね。

Angband が使ってるね。
http://www.lua.org/uses.html
0125デフォルトの名無しさんNGNG
xwLuaあげ
0126デフォルトの名無しさん NGNG
(#゚Д゚)ルア!!
0127デフォルトの名無しさんNGNG
とりあえずここかな
http://lua-users.org/wiki/LuaAddons
0128デフォルトの名無しさんNGNG
Mailing list traffic 見れば結構盛り上がってるぞ。
http://www.lua.org/lua-l-stats.html
0129デフォルトの名無しさんNGNG
ゴッルア!でいいの?
0130デフォルトの名無しさんNGNG
lua は、オブジェクト指向的なプログラムも書ける。

http://www.iplab.is.tsukuba.ac.jp/protoku/lua/Lua.htm
0131デフォルトの名無しさんNGNG
ダウンロード&コンパイルしたけど。。。
こめんとが--というのが萎えた。。。
0132デフォルトの名無しさんNGNG
そういうな。' よりは良いぞ。
0133デフォルトの名無しさんNGNG
age
0134デフォルトの名無しさんNGNG
これ正規表現とか無いの?
つーか何に使うの?
0135デフォルトの名無しさんNGNG
Ruby-Lua
http://ruby-lua.unolotiene.com/
0136デフォルトの名無しさんNGNG
>var ::= `Name'
stdin:1:<name> expected near `:'

これの意味は何ですか? エラーぽいんですけど。。
0137デフォルトの名無しさんNGNG
BNF 記法。言語の文法を表したもの。
0138デフォルトの名無しさんNGNG
あと、==の反対が~=というのも萎えた。。。
0139デフォルトの名無しさんNGNG
これってこのソースを使って何かあたらしいスクリプト言語を
作るのに良さそう(w
0140デフォルトの名無しさんNGNG
うんこ
0141デフォルトの名無しさんNGNG
素晴らしい言語だが、細部でいままでの言語と趣の違いを感じる。
これがラテンなんだろうか?
0142デフォルトの名無しさんNGNG
有名どころだと tcl も結構妙ちきちんだぞ。
0143デフォルトの名無しさんNGNG
テーブルって微妙
0144デフォルトの名無しさんNGNG
>>143

テーブルは、かなり便利と感じたが。。。
0145デフォルトの名無しさんNGNG
テーブルっていうのは、COBOL の配列の事か?
0146デフォルトの名無しさんNGNG
コボルは知らんが、多分普通でいうところの配列
ただし、連想配列なのでAWKの配列のイメージ

このあたりはrubyよりかなりいい!
0147デフォルトの名無しさんNGNG
コメントって - なの?

それとも -- なの?
0148デフォルトの名無しさんNGNG
-- >147
0149デフォルトの名無しさんNGNG
>>148

ありがとう。

ところで、luaつかってますか???
0150デフォルトの名無しさんNGNG
使い方が分かりません
0151デフォルトの名無しさんNGNG
>>150
どういうこと?
マニュアルなら日本語の奴もある、
単に用途がみつからんということ???
0152デフォルトの名無しさんNGNG
なんかこれといって、特徴とか、売りとかがない気がする。
luaだからこんなことができる、とかあるのかな。

感想。
0)全ての文(?)の終端がendなのは萎える。
 rubyもそうだけど、これ、実はすごく読みにくい。
 結局、文の対応がインデントでしかわからない。
1)式の終端記号がない。危険な香りがする。
2)テーブル{}に関係する構文と操作全般がわかりにくい。
3スクリプト用途にしては、)returnとかfunctionとか長い名前が気になる。
 return不用、function → fn or lambda、 local → letとか。まあ修正すりゃいいけど。
4)elseifかよ。
5)local変数群への多重代入がややわかりにくい。
6)でも多値を返せるのは便利。
7)レジストリって何?
8)タグの有効な使い方ってなんだろう?
9)テーブルは慣れれば使いやすいかも。
0153デフォルトの名無しさんNGNG
>>152
> 7)レジストリって何?

組み込み/拡張用でわ

> 8)タグの有効な使い方ってなんだろう?

タグメソッドでわ

VectorTag=newtag()
function Vector(a,...) do v={}; settag(v,VectorTag); v[1]=a; for i=1,getn(arg) do v[i+1]=arg[i] end; return v; end; end
function dot_product(v, u) do s=0; for i=1,min(getn(v),getn(u)) do s=s + v[i]*u[i] end; return s; end; end
settagmethod(VectorTag, "mul", dot_product)

print(dot_product({1,2}, {3,4}))
print(Vector(1,2)*Vector(3,4))
0154デフォルトの名無しさんNGNG
>>152

確かにendって使いにくいね。
読みやすさが有ると言う意見もあるが、ちょっこりif文なんかいれて
end忘れたひにゃ。。。(以下略)

あと、キーワードが長過ぎるのも同感

多値リターンはすぐれものか?
0155デフォルトの名無しさんNGNG
ライセンスがMITなんだけどこれって本当にgpl互換なんだろうか?
0156デフォルトの名無しさんNGNG
>>155
MIT は修正 BSD 相当だから互換じゃないのか?
0157ヽ(´ー`)ノNGNG
>>154
end 使いにくいよね。Lua も Python もかじってみたいんだけど、俺的にネック。
0158デフォルトの名無しさんNGNG
>157
Python?
0159デフォルトの名無しさんNGNG
Pythonはendじゃないよね
0160デフォルトの名無しさんNGNG
rubyの間違い?
0161ヽ(´ー`)ノNGNG
あ、ゴメン、Ruby と間違えた。Python はインデントだっけ?
始めに触ったのが C だからブレースが無い言語は苦手…。
0162デフォルトの名無しさんNGNG
でも、そんなこと気にしてたらもったいないと思う
すぐに慣れるし、慣れたらそんなことどうでも良くなるよ
0163デフォルトの名無しさんNGNG
end を使うのはブロックの開始を省略できるかどうかによるんじゃないかな。
まあそれはいい。しかし
function f(x)
a = x+1
return a
end
print(f(1))
これのワンライナが
lua -e 'function f(x) do a = x+1; return a end end; print(f(1))'
になるのには少々驚いた。
0164デフォルトの名無しさんNGNG
おお、こういう書き方ができるのか。upvalue はなかなか画期的な文法かも。

plus = function(a) return function(b) return %a+b end end
print(plus(2)(3)) -- 5
0165デフォルトの名無しさんNGNG
>>164
それ高階関数だね。
ML風に書くと
val plus=fn a=>fn b=>a+b; print(plus 2 3);
テーブルの役割からすると意味的にはLISPと似てる。
(((lambda(a)(lambda(b)(+ a b)))2)3) ;;5
0166デフォルトの名無しさんNGNG
>165
むしろ upvalue を使ったスコープの制御が面白いかなと。

それと plus(x)(y) と書けるのは直観的だなと。
ruby だと変数名の後にカッコでは引数を渡せないから [] を使う必要がある:
plus = lambda{|a|lambda{|b|a+b}}
p plus[2][3] # 5
python ではどう書くのだろう。
plus = lambda a: lambda b: a+b
では駄目だし。
この点S式は比べにくい。
0167デフォルトの名無しさんNGNG
漏れ的に一番驚いたのは、複数戻り値が返せるという点

2番目は、そのソースとバイナリの大きさかな?
0168デフォルトの名無しさんNGNG
小さいのは builtin が少ないからだろね。おかげで速いのは良きかな良きかな。

多値や多重代入は python でも ruby でもできるよね。
% lua -e 'function f(x) return x*2,x*3 end; a,b = f(3); print(b,a)'
9 6
% python -c '
def f(x): return x*2,x*3
a,b = f(3)
print b,a'
9 6
% ruby -e 'def f(x) return x*2,x*3 end; a,b = f(3); p b,a'
9
6
0169ヽ(´ー`)ノNGNG
>>162
そうだね。とりあえず、Lua と Ruby を勉強してみるよ。ありがとう。

>>168
む〜、便利だな。Perl の list($a,$b) = f(3) とは違って、配列と同じ扱いじゃないの?

// 今ちょっとコンパイラが(゚Д゚)マズ-な事になってて Lua を入れれないのです。
0170デフォルトの名無しさんNGNG
>>169
lua の場合は一つの何かを返すわけではないので common lisp の values に近いみたい
しかしこう↓書けるのでさらにイカす
% lua -e '
function f(x,y) return x+1,y+10 end
print(f(f(0,0)))'
2 20

python と ruby は値を引数リストに展開するために f(*f(1,2)) と書く必要がある
多値といっても ruby は Array を、python は tuple を返すから
0171デフォルトの名無しさんNGNG
perl -e "sub f{(1+shift,10+shift)} $,=' '; print f(f(0,0))"
2 20
0172デフォルトの名無しさんNGNG
ルアってユーザいたんだ(w
0173デフォルトの名無しさんNGNG
luaってオブジェクト指向ですか?
0174デフォルトの名無しさんNGNG
ユーザっていうか、試用してる。
しかしendがウザイね。
return省いて多値返すときだけvaluesにしたらいいのに。
fun f(x,y) x+1,y+10; //カンマは演算子。y+10が関数の値
fun f(x,y) values x+1,y+10; //カンマはvaluesの区切り
0175デフォルトの名無しさんNGNG
>>173
どっちかっていうと、LISPみたいな関数型だな。
テーブルのタグ付けでそれっぽい事はできそうだが。
0176デフォルトの名無しさんNGNG
>>175
Lispみたいなというのはちょとちがうのでは?
0177デフォルトの名無しさんNGNG
>>176
簡単に言えば、
リストをテーブル(配列)にして、括弧無くしたLISPモドキ→Lua
でしょ
0178デフォルトの名無しさんNGNG
lispっぽいのは
・関数と変数に型がない
・call by value
・lambda 相当の function
・無名関数
くらいでは。eval がない点は大きく違う。
0179デフォルトの名無しさんNGNG
lispといえど、関数のeval使うことなんてほとんどない。
repl改造する時ぐらいじゃないか。
それに、lua自身もeval入れようと思えば出来るだろうし。
0180デフォルトの名無しさんNGNG
むしろlispとの大きな違いは演算子と、区間を限定する構文が
使える事だろう。
lispは括弧を閉じ忘れるだけで、エラー個所の特定が難しくなる。
0181デフォルトの名無しさんNGNG
eval に代表させたけど反射性は言語の大きな特徴だと思うよ
0182173NGNG
いろいろ情報ありがとう>>all

私も触ってみようと思いました。
ところで、最近endで区切るのが流行ってる(?)ような感じですが、
これってメリットあるのでしょうか?

(好みは別として)

なんか、素人丸出しで恐縮ですが、{}の方が閉じ忘れをすぐに見付
けることができるっぽいので(例:vi の % キー)良いような気もし
ています。
0183デフォルトの名無しさんNGNG
そうね。なんちゃら〜endだと非対称だから、
ちゃんとparseしない限り機械的な対応付けも辛い。
既にlua-mode.elなんてのもあるけど。
0184デフォルトの名無しさんNGNG
>>182
Pascal派への挑戦と受け取る。
























爆撃
0185デフォルトの名無しさんNGNG
>>182
好みの問題でしょう。
ブロックの開始を省略できるのがメリット
と思える人にはメリット。
0186デフォルトの名無しさんNGNG
いきなりendは、心臓に悪い。
0187デフォルトの名無しさんNGNG
>>185
それなら}のみにすれば更に吉かも?
0188デフォルトの名無しさんNGNG
vimでは対応してますか?
0189デフォルトの名無しさんNGNG
>>187
いっそ.とかの方が気持ちよくないか?
0190デフォルトの名無しさんNGNG
end に慣れたから正直些細なこととしか思わない。
Pascal の後で C をやったときは == にも抵抗があったがそれも今では些細なこと。
0191デフォルトの名無しさんNGNG
>>190
いや、そうではなくて(つまり、好き嫌いとかなれとかでなくて)
editorが対応してない香具師があるというのが問題なんだ

下手すればemacs専用になるよ(w
0192デフォルトの名無しさんNGNG
>>191
何を訳のわからんことを・・・
0193デフォルトの名無しさんNGNG
漏れは、c/awk/ruby/...と見て来たが、正直luaもハマリそうだ
しかし、言語が変わるたびに書き方変わるのが正直つらい。

いつになったら、--になれることやら。。。

だれか?マジデluaを改造してくれんか?
0194デフォルトの名無しさんNGNG
>>190
重度の不感症ですね。
0195デフォルトの名無しさんNGNG
>191
ttp://lua-users.org/wiki/LuaEditorSupport
Vim, Emacsen, Jed, MED, NEdit, TextPad, Scintilla/SciTE, EditPlus, EditPadPro, MC-Cooledit
0196デフォルトの名無しさんNGNG
>>195
おお〜、ありがとう!!
0197デフォルトの名無しさんNGNG
ついでといっちゃあなんだけど、if〜then のthen
ってなんで必要なんだろう?

改行じゃまずいのでしょうか?
0198デフォルトの名無しさんNGNG
>>195
これって単にハイライト表示するだけじゃないの?
{}のマッチと比較するには非力か?(ちがってたら、スマソ)
0199MLerNGNG
>>197
演算子の区分を決めるために必要。
ただし、別にthenじゃなくてもいいんだけど。
例えば、C言語の条件演算子'?' と ':' の間の式中には
優先度の低いカンマ演算子が置ける。これと同じ原理。
仮に改行を区切り子にすると、BASICの様な行指向言語に
なってしまう。
0200デフォルトの名無しさんNGNG
>>199
でも、どうでしょう?
実際のところifの条件箇所をマルチラインでサクッと書ける言語
なんてほとんどないと思うけど。。。
0201デフォルトの名無しさんNGNG
話が噛み合ってない。
0202200NGNG
えっと、うまく伝わらなかったみたいでスマソ、

例えば、すっごくなが〜い条件文があったとしても、
backslash で結べば十分だとおもうのですが。。。どこか欠けてますか?

if x>3 and \
y<3
a=4
end

来んな風には書けないとおもったが。。。

if x>3 and
y<3 then
a=4
end

0203200NGNG
いま手もとでやってみたら書けた(動いた)!
スマン>ALL
0204デフォルトの名無しさんNGNG
>>198
indent/lua.vim は適切にインデントしてくれる
0205デフォルトの名無しさんNGNG
だれかコンパイル済みのluaください。
0206デフォルトの名無しさんNGNG
http://angband.oook.cz/distrib/Angband-303.exe
0207デフォルトの名無しさんNGNG
>>205
luaのオフィサイトにおいてあるけど
0208デフォルトの名無しさんNGNG
>>195
最新のvimには両方ついてくるね
0209デフォルトの名無しさんNGNG
>>204

勘違いしてる香具師が多いので言っとくけど、インデントなんて
ど〜でもいいんよ!
0210デフォルトの名無しさんNGNG
言語仕様的にはどうでもいいけど、変なインデントは人が読むにはつらいので、適切にインデントしてくれることは重要だと思う。
0211デフォルトの名無しさんNGNG
pretty-printぐらい欲しいだろう
■ このスレッドは過去ログ倉庫に格納されています