- 1 名前:デフォルトの名無しさん mailto:sage [2013/03/10(日) 15:10:32.28 .net]
- LuaやSquirrelやAngelScriptなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです まとめwiki(なにか質問する前に必ずみること!) wikiwiki.jp/lua/ その他の参考URLは>2から ■前スレ 【Lua】組み込み系言語総合 その5【Squirrel】 toro.2ch.net/test/read.cgi/tech/1321063450/ ■過去スレ その4 hibari.2ch.net/test/read.cgi/tech/1301414458/ その3 hibari.2ch.net/test/read.cgi/tech/1272643397/ その2 pc12.2ch.net/test/read.cgi/tech/1243210301/ その1 pc12.2ch.net/test/read.cgi/tech/1205208141/ プログラミング言語 Lua その3 pc11.2ch.net/test/read.cgi/tech/1160799232/
- 837 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 07:42:00.73 ID:6QXsiJCA.net]
- OSの話はスレ違い
その上で動作する組み込み言語の話をせよ
- 838 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 12:35:56.00 ID:AxbgYY0v.net]
- 何がスタンダードでもいいけど
UTF16は中途半端感が半端ないよな
- 839 名前:デフォルトの名無しさん mailto:sage [2016/02/22(月) 21:10:17.21 ID:6cWcowj1.net]
- mrubyも仲間に入れて良いですか?
- 840 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 00:28:29.80 ID:liQI2ylD.net]
- 良いと思います
- 841 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 10:19:51.72 ID:kQ/gcKij.net]
- Luaについての質問
目的:C++で実装したクラス(lua クラス バインド でggって出てきたページを参考に作成)を Luaでnewしてインスタンスを生成、それを更にC++で実装した 全く別の独立した静的関数にそのまま渡してその関数内でインスタンスへの変更処理を行う 実装:関数の引数にluaのソースのtestclass:new()によって生成したインスタンスを指定すると C++側からはlua_Stateのスタック経由でユーザデータで渡ってくると仮定して実装してみた 結果:C++で実装したクラスのlua側から生成したインスタンスの稼動は正常な模様。 しかし、そのインスタンスをC++の関数で参照する際、 肝心のインスタンスを取得する際に実行しているluaL_checkudata()にてエラー発生、 エラー出力は "bad argument #-2 to 'lua側に公開しているメソッド名'( expected, got userdata"。 ステップインしてみるとlauxlib.c(309)、luaL_testudata()内のlua_rawequalの結果の判定にて /* value is a userdata with wrong metatable */ とコメントされている箇所でNULLが返されている。 (#-1にはluaのソースでの [クラス名]:new() のコロン使用での暗黙の第一引数が
- 842 名前:入っている?憶測)
備考:簡単なスタックダンプで見る限りではユーザデータしか積まれていない様に見える。(主観) 徹夜してまで追跡しても方法わからず、何か勘違いや問題点があったら教えてくらはいおながいします [] - [ここ壊れてます]
- 843 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 12:27:23.57 ID:UPC5owG9.net]
- >>831
(★ expected, got userdata のエラーメッセージで、正確な★の値を確認してほしい。 luaL_checkudata は引数 tname の文字列で型チェックをするのだが、 luaL_newmetatable や luaL_setmetatable で登録したものと一致しているだろうか?
- 844 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 16:36:12.58 ID:liQI2ylD.net]
- >>831
それはbinderの質問だな binderは何を使ってるの? その問題が再現する最小のコードを作って作者に質問すりゃいいよ 英語が苦手ならここでもいいけど解決する保証はできん
- 845 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 21:28:17.51 ID:kQ/gcKij.net]
- レスくれたのに遅れてごめね、潰れてた
>>832 Luaでnew()したC++のクラスのインスタンスを受け取る関数で実行してるとこで void * const pv = luaL_checkudata( pluastate, -1, "TestClass" ); にするとそのまま(hoge expected, got userdata)になっちゃった C++のクラスのテーブル作ってるとこのlua_setglobal( pluastate, "TestClass" );と同じでもダメだし もちろんC++側でのクラス名でも変わらず >>833 binderはざっくり検索した範囲だと大きかったりboost必須だったり 更新してなかったりで将来に不安が残る感じで何も使ってないの、アメリカ語は_〜 クラスのテーブル作るとこで型名を明示的に指定してやったりしないといけないのかな きっとthisの値を生で吐き出すメソッド実装してそれを関数に渡せば何とかなるんだろうけど そういう力技あんまし使いたくないし後々すんごく気持ち悪くなりそうな・・・
- 846 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 21:43:48.82 ID:kQ/gcKij.net]
- 連投すまぬ、>>833をヒントに検索したらlua_typename()なる関数を発見、スタックに積まれてる引数に
CString str = lua_typename( pluastate, -1 ); してみたんだけど "no value" になった、lua_type()は相変わらずユーザデータ 念の為luaのソースで引数を数値にしてC++の関数でluaL_checkinteger()に入れ替えると 正しく整数がそのまま流れてくるから位置は間違ってない可能性が高いと思ってる(憶測) メタテーブルと言っても所詮(?)はユーザデータだし、 ユーザデータ作る時にlua_setglobal()の前後で明示的に型名を指定してあげないとダメなのかな?
- 847 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 21:50:32.63 ID:UPC5owG9.net]
- >>834
エラーメッセージを加工しないでくれ。 luaL_checkudata( pluastate, -1, "TestClass" ); の呼び出しで hoge expected, got userdata の表示はありえない。hoge はどこから来たんだ? 「Luaでnew()した」だとどこが悪いのか切り分けられないから まずは、Luaスクリプトを使わず、C APIのみで作成と取得を試してはどうか? 気になるのは lua_setglobal("TestClass") と書いていること。 luaL_checkudata の tname 引数は luaL_*metatable 系で使った C側の内部的な文字列であり、Lua側に公開した変数名ではないぞ?
- 848 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 21:51:06.03 ID:liQI2ylD.net]
- >>834
そうなんか。 まあ俺も使ってたbinderに不満があってオレオレbinder作っちゃったから人の事言えないけど classや関数一つ一つスタックで操作するのはミスしやすいしお勧めしないよ。 classの登録 luaL_newmetatable(L, "TestClass"); 〜stackの一番上にtableが入ってるのでそれに対してメンバーの登録処理が続く。 newの中 void *storage = lua_newuserdata(L, sizeof(TestClass)); new(storage) TestClass(); luaL_setmetatable(L, "TestClass"); 引数の受け取り TestClass* ptr = static_cast<TestClass*>(luaL_checkudata( L, 1, "TestClass" )); //1個めの引数
- 849 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 22:01:41.19 ID:liQI2ylD.net]
- >>835
メタテーブルはユーザーデータではないぞ ユーザーデータにメタテーブルって形で普通のテーブルを設定できるだけでメタテーブル自体はtable型 ユーザーデータはテーブル参照されると、そのユーザーデータに設定されているメタテーブルを参照して 値があればそれを返す >>836 hogeは察するにlua側の関数名だろ
- 850 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 22:03:44.40 ID:liQI2ylD.net]
- 連投すまんが
lua_typename( pluastate, -1 ); この第二引数はスタックのindexではなくlua_typeで返る値
- 851 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 22:50:47.99 ID:kQ/gcKij.net]
- >>836
すまない、hogeからもう一度TestClassやluaTestClass、その他の定義 色々試し直してたら不一致になってしまった LuaからC++、C++からLuaは既に成功していて、C++からC++も既に成功というか OpenCVの亜種とFreeBSDのlibの一部をLuaに機械的な手作業でバインドしようとしてるから その辺りの実績は問題ない・・・筈 >>837 凄いヒントをありがとう、今までnewの後にluaL_setmetatable()はしてなかった けど単純に追加しただけじゃダメらしい、相変わらず同じメッセージが出力されて失敗する >>838>>839 メタテーブルの認識を間違えてたんだ、それとlua_typename()の第二引数・・・ 勉強し直して再確認して出直してくる OpenCVの亜種とBSDのlibのヘッダのインクルードやらリンクやらでソース丸々アップとか難しい状態 文字でしかやりとりできない、もどかしくてごめんね、みんなありがとう
- 852 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 23:12:34.76 ID:liQI2ylD.net]
- たぶんちゃんとメタテーブルを設定できてないんだと思うよ。
luaL_setmetatable はスタックの一番上の値に対して引数で与えた名前のメタテーブルを設定する メタテーブルの名前はluaL_newmetatableで作った時のもの。 www.lua.org/pil/24.2.3.html ここにstack dumpのサンプルコードがあるからそれで出力して色々なタイミングのスタックの状態を printfデバッグすりゃいいんじゃないかな Lua5.3以降ならluaL_newmetatableした時にそのテーブルに__nameが設定されるから 例えば上記URLのstackDumpで case LUA_TUSERDATA: if (luaL_getmetafield(L, i, "__name") == LUA_TSTRING) { printf("userdata:%s", lua_tostring(L, -1)); lua_pop(L, 1); break; } ってするとユーザーデータに設定されているメタテーブルの名前も一緒に出力できる
- 853 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 23:30:00.22 ID:kQ/gcKij.net]
- >>841
一発でわかった、ありがとう、ありがとう、そして一番のキーワードは>>837のluaL_setmetatable() 目的:C++で実装したクラス(lua クラス バインド でggって出てきたページを参考に作成)を Luaでnewしてインスタンスを生成、それを更にC++で実装した 全く別の独立した静的関数にそのまま渡してその関数内でインスタンスへの変更処理を行う 問題:割愛 原因:Lua側でのいわゆるクラスの型情報であるグローバル変数の実体の作成時に、 クラスのテーブルの作成にもユーザデータ共通のメタテーブルの作成にもlua_newtable()を使用していた 対処: 正しく(?)は、メタテーブルの作成の際にはluaL_newmetatable()を使用するべき 憶測(言い訳?): メタテーブルであるべきところをネットのサンプル通りに普通(?)のテーブルで実装してしまった為、 単純なC++からLua、LuaからC++のやりとりでは不都合が出なかっただけだと思われる 長文かつサンプルの提示なしの質問に長々と付き合ってくれてありがとうございました、無事解決しました
- 854 名前:デフォルトの名無しさん mailto:sage [2016/02/24(水) 08:09:28.85 ID:4eLJNqm5.net]
- おまえらすげぇな
- 855 名前:デフォルトの名無しさん mailto:sage [2016/03/08(火) 07:25:35.42 ID:kiMIo1Bf.net]
- “という名前のファイルをio.openで開こうとすると開けないのですがどうやったら開けるようになりますか?
- 856 名前:デフォルトの名無しさん mailto:sage [2016/03/08(火) 07:37:15.49 ID:kiMIo1Bf.net]
- 開けました
- 857 名前:デフォルトの名無しさん mailto:sage [2016/03/20(日) 11:05:43.19 ID:S+FF32wm.net]
- スレチかもですがJavaScriptエンジンのスレがないのでお邪魔させてくだちい。
googleのJavaScriptエンジンv8をVS2015のレガシーなC++でビルドして VS2015のC++/CLIでリンクして実行するとヒープ破壊のエラーが出て落ちます。 (デバッガでトレースが始まる前の段階で落ちているので追跡しようがありません) v8::V8そのものへの参照を全てコメントアウトすると落ちずにmain関数に入ってきます。 何か特殊な設定か対処の類が必要なのでしょうか? それともC++/CLIがダメ子ちゃんなのでしょうか?
- 858 名前:デフォルトの名無しさん mailto:sage [2016/03/20(日) 11:49:11.85 ID:Byvmq8tF.net]
- >>846
その組み合わせは使ったことは無いが、もしネイティブC++で問題ないなら 2種類のGCを持つ環境が競合しているんだろうな v8 の代わりに Chakra JsRT なら、MS同士だから実績があるかもしれない
- 859 名前:デフォルトの名無しさん mailto:sage [2016/03/20(日) 22:46:48.41 ID:S+FF32wm.net]
- >>847
gc回りの机上でのコード追跡に挫折しました・・・ v8のコードを一切コールしなくても、v8::V8回りがリンクされるだけでダメっぽいです。 CRT回りの静的変数の初期化の時点でヒープ破壊のエラーが発生してしまうので (ソースをちょっといじるだけでエラーの種類が変わるのでここで書いても意味がないと判断) ChakraCoreをいじってみます、レスありがとうございました。
- 860 名前:デフォルトの名無しさん mailto:sage [2016/03/20(日) 23:22:32.65 ID:Byvmq8tF.net]
- 自分も最新の情報は持っていないけど、今や組み込みJSも結構な数があるっぽい
https://en.wikipedia.org/wiki/List_of_ECMAScript_engines WindowsオンリーならChakraで十分 速度がいるならv8だけど、巨大で複雑な部類だとは思う Duktapeやv7はLua感覚で使えそうだけど、品質や実績はよくわからない
- 861 名前:デフォルトの名無しさん mailto:sage [2016/03/21(月) 00:04:57.23 ID:jBN/3X9x.net]
- こんなにあったんだ・・・
けどv8ですらまだドキュメントやサンプルが多い方だったんですね。 (Isolateの実装で殆どがコンパイルに通らなくなった様ですが) ChakraCore一つとってみても例えば var userobj = new Userobj(); NativeGlobalFunc( userobj ); を実現する道筋の調査に一苦労、 1時間調べてもオブジェクトの作り方すらまだ確信が持てていない状態・・・ 片っ端から調べ直して出直してきます。
- 862 名前:デフォルトの名無しさん [2016/03/27(日) 14:51:27.25 ID:WUzBhCSW.net]
- luaってなんでC++系の文法真似なかったん?
吐き気がする気持ち悪い・・・ 結局教育機関が作る言語はどれも学生脳の自慰言語ばっかかよ
- 863 名前:デフォルトの名無しさん mailto:sage [2016/03/27(日) 15:03:16.21 ID:9eGj+oKv.net]
- >>851
Lua 1.1 は 1994年。そのころはPascal系もまだ元気だったんだ。 自然淘汰の結果として死滅しただけで、最初から未来が見えてたわけじゃない。 今なら、LuaのVMやAPIを真似たJavaScript実装 (>>849) や 先行き不安なSquirrelなど、自分で組み込むなら選択肢はある。 使う側ならどうしようもないが。
- 864 名前:デフォルトの名無しさん [2016/03/27(日) 15:12:37.47 ID:WUzBhCSW.net]
- >>852
おとなしくうっすいトランスレータ書くわ
- 865 名前:デフォルトの名無しさん mailto:sage [2016/03/27(日) 15:18:28.87 ID:Pr6yzqXD.net]
- C++に近いといえばgcjがある
公式のJavaよりもC++に近いが彼らが負けを認めることはないだろう 負けを認めない相手と張り合うのは時間の無駄
- 866 名前:デフォルトの名無しさん [2016/03/27(日) 21:30:21.55 ID:H7mb6W0C.net]
- mytable.test とテーブルの要素にアクセスした時に
定義されていなければ{}を返すようにメタを設定することはできますか?
- 867 名前:デフォルトの名無しさん [2016/03/27(日) 21:46:25.71 ID:xKhiQxW2.net]
- >>855
luaの話? であれば__newindexで{}返す関数を設定すればいい
- 868 名前:デフォルトの名無しさん [2016/03/28(月) 01:39:38.42 ID:WtaHq3/v.net]
- 何かうまくいかないから今度またやろう。。
- 869 名前:デフォルトの名無しさん [2016/03/28(月) 03:40:07.32 ID:zJAWFm4u.net]
- __indexじゃないかな
$ lua Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio > pp = require 'pl.pretty' > mytable={1, 2, 3} > pp.dump(mytable.test) nil not a table > setmetatable(mytable, {__index=function() return ({}) end}) > pp.dump(mytable.test) { }
- 870 名前:デフォルトの名無しさん [2016/03/28(月) 04:37:20.45 ID:OzjTEsq7.net]
- >>857
すまん。 >>858 せやったな。 __newindexは代入したときに無かったらや。
- 871 名前:デフォルトの名無しさん mailto:sage [2016/03/28(月) 12:35:11.30 ID:K6EkYblL.net]
- nil のメタテーブルって設定できたっけ?
Safe Navigation Operator 的な動作なら、そっちのほうが良いかもしれない。
- 872 名前:デフォルトの名無しさん mailto:sage [2016/03/30(水) 08:03:28.46 ID:MvqxUS0K.net]
- >>851
プログラマーではない人をターゲットにしていたからだよ。 つまり英語をある程度知ってる人なら内容を理解できるようにってこと。 パスカルを真似ったってよりも日本語ベーシックみたいなものかな。
- 873 名前:デフォルトの名無しさん [2016/03/30(水) 10:21:33.98 ID:PJ1J1ZJR.net]
- C++というかC言語は構文的には美しくないからな
普及してるからそれが普通に見えるだけで
- 874 名前:デフォルトの名無しさん mailto:sage [2016/03/30(水) 10:50:30.01 ID:IKaSwJOV.net]
- Luaって ( ) と { } が無いだけで、後はほぼJavaScriptと感じたけどなぁ
Swiftも { } は使うけど ( ) が無いから気持ち悪いんだろうか?
- 875 名前:デフォルトの名無しさん mailto:sage [2016/03/30(水) 11:35:11.53 ID:mjOFe187.net]
- 引数と戻り値が可変長だから
local i, j = f(x, ...) int i=0, j=0; のような文法をそのまま採用するのは無理
- 876 名前:デフォルトの名無しさん mailto:sage [2016/03/30(水) 13:09:07.35 ID:MvqxUS0K.net]
- もし i==1 そのとき x=2 そのほか x=3 おわり
うごけ x=x+1 まで x < 10 おわり
- 877 名前:デフォルトの名無しさん mailto:sage [2016/03/30(水) 13:44:09.05 ID:UL6gISrg.net]
- >>862
そんなノリで「ならおまえが作れよ」でObjective Pascalやら○言語やら 色々出たし確かに文脈としてはCよりマシだったけど結局普及しなかったしな 一旦普及しちまうとIA64やらOSXやら互換性を捨てたモンが代替に成り上がるのは難しいね 過去のソースの流用だけじゃなくてコーダーの慣れとかの問題も含めて >>865 ぴゅう太だっけか 今なら[ #define もし if( ] [ #define おわり ) ]とかで凌げるのかね?
- 878 名前:デフォルトの名無しさん mailto:sage [2016/03/30(水) 23:36:59.47 ID:/8cK4WLw.net]
- Squirrel 3.1 stable
- 879 名前:デフォルトの名無しさん mailto:sage [2016/03/31(木) 01:03:50.28 ID:zQkq4gxf.net]
- もし 私 が イケメン なら あなた は モテる 違うなら あなた は 爆発 おわり
- 880 名前:デフォルトの名無しさん mailto:sage [2016/03/31(木) 02:59:26.18 ID:nACjm5l+.net]
- >>863
{}の変わりにdo endがあるでしょう
- 881 名前:デフォルトの名無しさん mailto:sage [2016/03/31(木) 20:47:53.62 ID:nkzU0v9F.net]
- >>867
1年またぎで RC1 が正式リリースになったのか うっひょーー
- 882 名前:デフォルトの名無しさん mailto:sage [2016/04/01(金) 06:14:44.27 ID:rWTRiDhV.net]
- RC1からリリースまでの間に一体何があったのか
間が空くと細かいとこ忘れがちだしちょいと心配なリリースではある
- 883 名前:デフォルトの名無しさん [2016/04/07(木) 01:07:47.63 ID:dZYAORAr.net]
- 下記のように、関数群に対して値型の変数を与えるとします。
functionA(value) functionB(value) functionC(value) この時に、値渡しでなく参照渡しにする方法はありますか? 戻り値で返してもらうとかしないと駄目でしょうか?
- 884 名前:デフォルトの名無しさん mailto:sage [2016/04/07(木) 01:37:09.92 ID:m5Wmq6v/.net]
- >>872
総合スレだから言語を明記してね Luaだとすると参照渡しはない 戻り値か、テーブルで渡して中身を書き換える 具体的な用途が決まってるなら別解もあるかも
- 885 名前:デフォルトの名無しさん [2016/04/07(木) 01:49:59.00 ID:dZYAORAr.net]
- 失礼、総合でしたか。
言語はluaです。 returnを書き忘れそうなんで、 下記みたいなゲッターセッターのクロージャ渡すことにします。 後で拡張するのも楽そうだし。 ありがとうございます。 local value function getter_setter(val) if val != nil then value = val end return value end
- 886 名前:デフォルトの名無しさん [2016/04/07(木) 23:57:49.14 ID:s1RKY7Zg.net]
- >>874
変な理由だな。returnを忘れるぐらいだったら代入とかクロージャの呼び出しを忘れる心配もしなければならなくない?
- 887 名前:デフォルトの名無しさん mailto:sage [2016/04/08(金) 00:31:02.22 ID:NMv2dsC8.net]
- >>874
参照渡しの主な用途は、複数の返値か、変数の入れ替えだと思うんだが Luaだと自然な記述でどちらも書けるから必要になったことはないなぁ その例なら value = val or value みたいな書き方もできるし
- 888 名前:デフォルトの名無しさん mailto:sage [2016/04/08(金) 09:00:43.43 ID:QHM1+lud.net]
- >>875
必須じゃないからreturnいらないし、呼び出し忘れたってかまわないです。 ただ、生存期間中は使いたい場合があるのです。
- 889 名前:デフォルトの名無しさん mailto:sage [2016/04/08(金) 09:05:33.22 ID:Awm5dteq.net]
- そもそも基本的なところから勘違いしてるに一票
- 890 名前:デフォルトの名無しさん mailto:sage [2016/04/08(金) 10:02:48.01 ID:NMv2dsC8.net]
- 他人が見たら首をかしげるようなスパゲティ・コードになってそう
- 891 名前:デフォルトの名無しさん [2016/04/08(金) 11:47:10.88 ID:tJM0u/og.net]
- >>879
もうなってるでしょ >>877 の説明読んでも何言ってるのかさっぱりわかんないし
- 892 名前:デフォルトの名無しさん mailto:sage [2016/04/08(金) 18:15:07.93 ID:QKtAKDZQ.net]
- err = f()
if err ~= nil then return err end これを参照渡しのように f(seterr) と書くのは合理的だと思う 人間がみんな合理的に行動すればコミュ力は重要ではないかも
- 893 名前:デフォルトの名無しさん [2016/04/08(金) 21:19:50.62 ID:ZsT2Hxo0.net]
- >>881
どう合理的なんだ? seterrのエラーチェックしてないからイコールなコードでもないしどういう利点が有るのか説明してよ。 r=assert(f()); のような書き方出来なくなるし
- 894 名前:デフォルトの名無しさん mailto:sage [2016/04/08(金) 21:32:21.04 ID:QKtAKDZQ.net]
- インクルードガードのように、中に入ってから#ifndefすれば、外でしなくてもよい
- 895 名前:デフォルトの名無しさん mailto:sage [2016/04/08(金) 22:34:01.66 ID:NMv2dsC8.net]
- >>883
日本語でおk JavaScript でいう Promise の reject ハンドラのような意図か? Luaは例外処理 (try-catch) が書き難いから、その手の用途なら必要性は理解できる。
- 896 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 01:02:16.06 ID:EFL/mBbR.net]
- catchした変数がすぐ消えてなくなるのが困る
何もしないで続行するのは自由だからそれでいいけど 後で念のため再度エラーチェックする自由も欲しい
- 897 名前:デフォルトの名無しさん [2016/04/09(土) 02:22:04.50 ID:u1ofpue+.net]
- 何言ってるのか俺には理解不能だわ…
- 898 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 07:21:19.22 ID:FoBfIIvs.net]
- 理解できないのはそういう場面に出くわしたことがないからかと思われ。
- 899 名前:デフォルトの名無しさん [2016/04/09(土) 07:34:56.67 ID:u1ofpue+.net]
- >>887
そうかもな、どういう場面か具体的なコードで示してくれるとありがたい 合理的なコードならありふれてるよね? あと例外は複雑になりやすいからGoとかでも例外は排除して多値でエラー返すようにしてる
- 900 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 08:25:05.90 ID:WDrzc2Wm.net]
- >>888
むしろLuaもGoも複数の返値を持てることがポイントだと思う。 { 本来の返値, エラー? } のペアを返すという発想で、合理的。 「例外」という別口をわざわざ用意しなくて良くなった。 ただ、All or Nothing のトランザクション等、処理事にエラー値の確認が面倒というのも想像できる。 その場合、Luaの流儀なら >>882 の assert のように、エラー値を例外ジャンプに変換する関数で包むべきなんだろうな。
- 901 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 08:38:40.76 ID:FoBfIIvs.net]
- 多値で返すのは当然いいのだけれども、
関数が関数テーブルに構造化されている場合、多値を返すと他の関数と戻り値の仕様がごちゃごちゃになってくるので、引数のレベルで疎結合にしておきたい。
- 902 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 08:50:59.47 ID:EFL/mBbR.net]
- Luaがマイナーすぎるおかげで「合理的ならありふれてる」は嘘だとわかった
嘘だとわかる場面に出くわした
- 903 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 09:01:44.19 ID:WDrzc2Wm.net]
- >>890
関数テーブルに構造化されていると言うなら、 引数や返値含め、全ての関数は同じ型であるべきだろう。 それぞれが違うなら、それは構造化ではなく寄せ集めだ。動的型言語に甘えてる。
- 904 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 09:19:31.93 ID:l8xjVqJC.net]
- 値を返す関数で失敗時に例外を飛ばすのは、それを呼ぶ側では成功時の記述しか
しなくていいという理由が大きいと思うが。 タプルを返せるのはステータスを参照型の引数に返すよりは合理的だとは思うが 例外の代用になるかというとそれはちょっと違うと思う。
- 905 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 09:23:54.21 ID:WCRIlqKI.net]
- Windows APIみたいに GetLastError 的なものを用意した方が簡単じゃね。
いずれにせよtry-catch-fainalyは標準で欲しいな
- 906 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 09:43:40.75 ID:EFL/mBbR.net]
- >>893
失敗時の記述が不要というのはexitでもできる スレッドがあるならスレッドを止めてもいい なので本当の理由は、プロセスやスレッドの起動・再起動が遅すぎるからじゃないか
- 907 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 11:18:07.50 ID:8JT9QS2I.net]
- 化石並の言語体系に何を求めているのやら
というかオプソなんだし気に入らないなら修正すりゃええやん 他と互換性なくていいならやりたい放題なんだし、 その修正を公開してメジャーになったとしたらバックポートしてくれるかも知れんでよ
- 908 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 11:28:03.33 ID:WDrzc2Wm.net]
- >>894
旧来の書き方がしたいならばその通りなんだが、 非同期処理が一般的になってきた昨今では、最良かどうかは分からない。 tryブロック内で処理が同期的に完了するとは限らないから。 タプル返しも、error/pcallも、rejectハンドラ渡しもできるから、現状のLuaで十分汎用性はある。 せいぜい構文糖のためにパーサを改造したくなるくらい。
- 909 名前:デフォルトの名無しさん mailto:sage [2016/04/09(土) 12:43:02.89 ID:FoBfIIvs.net]
- >>892
ただのトレードオフ。 どこを重視するかは自由。
- 910 名前:デフォルトの名無しさん [2016/04/09(土) 13:38:58.58 ID:u1ofpue+.net]
- >>890
引数にしたら引数の仕様がごちゃごちゃになってくると思うんだけど。 引数を受け取るだけの関数を渡せとなるなら尚更
- 911 名前:デフォルトの名無しさん [2016/04/09(土) 14:08:41.76 ID:u1ofpue+.net]
- >>891
別にluaに限定する必要ないよ 引数で返すのが合理的に見えるコードであれば C言語みたいに返値を一つしか返せないからって理由なのは無意味だから外して欲しいけど。 >>893 何もしなかったらそのままアプリが終了するだけじゃん 個人的にはtry catchは要らないかな。Goが例外無くしたのと同じ理由で
- 912 名前:デフォルトの名無しさん mailto:sage [2016/04/11(月) 08:27:07.88 ID:k7zVs+aP.net]
- >>900
確かにGo的なのでいいかもな。 ttp://www.geocities.jp/m_hiroi/golang/abcgo15.html 足りないのはdeferとrecoverかな? deferは__gcメタテーブル使えばできそうだけど標準で欲しいな。 recover はわからん。
- 913 名前:デフォルトの名無しさん [2016/04/11(月) 08:58:49.07 ID:WTwt1caF.net]
- >>901
deferのようなものは例外とは関係無いところが理由で欲しいね 途中returnでclose書くの面倒とかそういう所で gcに任せてたらいつ実行されるかわからんし recoverはpcallでいいんじゃないかな
- 914 名前:デフォルトの名無しさん mailto:sage [2016/04/11(月) 09:29:17.60 ID:AFQC7gKw.net]
- try catch は大域脱出に使うから、無くすなら別途機構が欲しいやね
- 915 名前:デフォルトの名無しさん mailto:sage [2016/04/11(月) 10:19:40.88 ID:UaC8pXHz.net]
- >>902
Luaのソースを読んでると スコープを抜けるタイミングでクロージャのupvalueを閉じる処理があるから その辺りを改造すると、スコープ終了時に何かする機能が追加できる気がした。
- 916 名前:デフォルトの名無しさん [2016/04/12(火) 00:55:24.80 ID:JDMXFvBX.net]
- PC版は今日発売のdarksouls3もLua使ってるのな
- 917 名前:デフォルトの名無しさん mailto:sage [2016/04/12(火) 01:26:42.97 ID:fKt10c2M.net]
- たしかクソ1の頃からLuaのクレジットあったぞ
- 918 名前:デフォルトの名無しさん [2016/04/13(水) 22:16:47.11 ID:PD+aqUpV.net]
- しかもLuaJITじゃなくて本家Luaなんだな
負荷が高いものはCやC++で書けばいいしやっぱ速度はそれ程重要じゃないのな
- 919 名前:デフォルトの名無しさん mailto:sage [2016/04/13(水) 22:23:51.85 ID:7YNUgm8C.net]
- なにかのエディタで補完を効かすことはできますか?
例えば、メッセージテーブルみたいなのをloadfileで読み込んで使いたいです。 MSG.PLEASE_INPUT_ANY_KEY
- 920 名前:デフォルトの名無しさん mailto:sage [2016/04/14(木) 08:00:44.86 ID:PaNxRcDi.net]
- >>904
スコープというのはブロック単位のことだと思うんだけど 確かにブロック単位でdeferができれば便利ですな。 個人的にはdeferという単語はイマイチだけど
- 921 名前:デフォルトの名無しさん mailto:sage [2016/04/14(木) 08:31:22.32 ID:PaNxRcDi.net]
- それとも goto で十分なんだろうか
- 922 名前:デフォルトの名無しさん [2016/04/14(木) 12:08:10.65 ID:z7Vrjvws.net]
- >>910
何か勘違いしてない?
- 923 名前:デフォルトの名無しさん mailto:sage [2016/04/14(木) 17:46:31.38 ID:PaNxRcDi.net]
- >>911
なぜ勘違いしてると感じたの?
- 924 名前:デフォルトの名無しさん [2016/04/15(金) 00:30:26.65 ID:MuKGbCph.net]
- >>912
突然gotoが出てきたから
- 925 名前:デフォルトの名無しさん mailto:sage [2016/04/15(金) 04:18:23.81 ID:+t9YcmSi.net]
- 頭で思ったことを全て言語化してないから唐突な感じになる
でも思ったことをそのまま喋ったら明らかな失言や暴言や嘘も増える 脅迫や詐欺みたいな発言を連発するよりは、少し意味不明な方がマシじゃないか
- 926 名前:デフォルトの名無しさん mailto:sage [2016/04/15(金) 07:45:58.29 ID:Hp4CXrU7.net]
- >>913
だってさ、たとえば ::finally:: というラベルを作って、 if エラー発生 then goto finaly end とかやればいっしょじゃね?
- 927 名前:デフォルトの名無しさん [2016/04/15(金) 08:24:11.24 ID:uS8f5f96.net]
- >>915
全然違う。それだと途中でreturn出来ないし、しないように注意しなければいけない。 コーデイング規約でreturnはfinallyラベルの後の一つだけにするって定めるつもり? それに後処理が必要になるものはそのすぐ近くにそれを書きたいもの。
- 928 名前:デフォルトの名無しさん mailto:sage [2016/04/15(金) 08:41:49.74 ID:+t9YcmSi.net]
- 1. finallyに行きたくなければreturn出来る
2. 行きたくない人などいるはずがないからreturn出来ない
- 929 名前:デフォルトの名無しさん mailto:sage [2016/04/15(金) 09:10:31.83 ID:9cTSD0EJ.net]
- >>915
「エラー処理をどうするか」なら良いのだけれど、話の流れは 「エラー処理を忘れないようどうするか」だったと思うんだ。 Luaに限れば、必ず後始末したい場合は pcall が必須なのがメンドイ。
- 930 名前:デフォルトの名無しさん mailto:sage [2016/04/15(金) 09:56:06.34 ID:Hp4CXrU7.net]
- returnの話も、pcallの話も全て理解できるよ。
ただそういうのは織り込み済みの上で gotoで足りると中の人は考えてるのかもしれないなぁ、ということ。 これって勘違いというほどのもの?
- 931 名前:デフォルトの名無しさん mailto:sage [2016/04/16(土) 15:05:29.04 ID:ls9rc/e1.net]
- そもそもエラー復帰処理を組み込み言語側に書かせるべきなのだろうか?
例えばホスト側が「文字列を丸ごとファイルに書き出す」機能を公開すれば スクリプト側で「失敗したらファイルを閉じて削除して〜」などと考えず済む。 汎用言語なら細かい粒度のAPIのほうが小回りが利くけど 所詮組み込み言語なんだから「どのように」ではなく「何をしたい」単位で記述させたほうが良い。
- 932 名前:デフォルトの名無しさん [2016/05/01(日) 13:23:19.66 ID:tKi6j9CT.net]
- 匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています 言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか? Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします https://twitter.com/Lyrise_al ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw The Covenant Project 概要 Covenantは、純粋P2Pのファイル共有ソフトです 目的 インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します 特徴 Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW) 接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です DHTにはKademlia + コネクションプールを使用します UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります) 検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません 0
- 933 名前:デフォルトの名無しさん [2016/05/15(日) 09:01:08.96 ID:WYUaDR6g.net]
- luabindオリジナルは更新止まってて5.2すら使えないしfork多すぎてどれ使えばいいか解らん
- 934 名前:デフォルトの名無しさん mailto:sage [2016/05/15(日) 12:38:52.61 ID:llz61aSC.net]
- プログラマなら自分で作っちゃいなYO!
車輪の再発明?知らんな!
- 935 名前:デフォルトの名無しさん [2016/05/15(日) 12:41:10.00 ID:WYUaDR6g.net]
- >>923
それだと意味が無いんですよ
- 936 名前:デフォルトの名無しさん mailto:sage [2016/05/15(日) 12:42:54.01 ID:ZVMufeYJ.net]
- 自分の1年前のバインダ引っ張り出したら目を背けたくなるコードで
結局リファクタリングしたなんてこともあったな 効率はともかく他人のコードのリファクタリングも結構勉強になるし とりあえず無難そうなのを選んで落としてデッドコピーしてみたら?
- 937 名前:デフォルトの名無しさん [2016/05/15(日) 13:13:01.22 ID:WYUaDR6g.net]
- 色々なlua binder使ったときのベンチマーク書いててluabind使うこと自体が目的なんですよね
なので、ぱっと見修正量多いから自分で修正したくないしメンテもしたくないから何処かから引っ張ってこれるのが理想なんですけど 欲を言えば5.1以降全部に対応してたらいいんですが…
|

|