[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/27 16:07 / Filesize : 264 KB / Number-of Response : 1020
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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/

817 名前:デフォルトの名無しさん mailto:sage [2016/02/09(火) 08:14:07.29 ID:DpNg1xio.net]
UTF16なら固定長で行ける!という勘違いをしてる
外人は多いよ。

818 名前:デフォルトの名無しさん mailto:sage [2016/02/09(火) 10:53:46.23 ID:dd4nRHCa.net]
>>807
ユニコードでさえあれば、内部のUTF表現まで気にする必要はないんじゃ?
特に文字列型がimmutableなら、複数の表現をキャッシュしても問題なさそうだし

>>808
日本人でも多くないか?
新しく言語を設計できるなら、CharはUTF-32であるべきだとは思う

819 名前:デフォルトの名無しさん mailto:sage [2016/02/09(火) 12:19:21.81 ID:+sr/gpA9.net]
charのサイズがintのサイズに近づけばintの配列を使う人も出てくるんじゃないの
それにluaがpythonに近づけばpythonを使う

820 名前:デフォルトの名無しさん mailto:sage [2016/02/09(火) 12:28:04.23 ID:OaLyyuyL.net]
>>809
話の流れはutf8がデファクトかどうか、です
実際にはutf16のが主流だろって指摘

外部はutf8でいいとして、内部で使うなら今後はやっぱ32だな。少なくともサロゲートペアの罠は回避できるし

821 名前:デフォルトの名無しさん mailto:sage [2016/02/09(火) 14:09:36.45 ID:+sr/gpA9.net]
sjisとutf16とutf32って、まるでxpとvistaと7みたいだね

822 名前:デフォルトの名無しさん mailto:sage [2016/02/09(火) 17:44:02.58 ID:zKyrJnIK.net]
>>809
それって言語の問題無の? 標準ライブラリで吸収できない?

823 名前:デフォルトの名無しさん mailto:sage [2016/02/10(水) 08:02:28.26 ID:2QwVjJmi.net]
Web系の主流がutf8なのは確か

824 名前:デフォルトの名無しさん mailto:sage [2016/02/10(水) 12:03:00.48 ID:ShaMeiRT.net]
iOS もAndroidもC言語文字列を扱うAPIはwideでもそれ以外の整数型の配列でもなくconst char*のutf-8だけどな
iOSはCore*とかAndroidはC用API自体少ないけどAAssetManagerとかAStorageManagerとか

825 名前:デフォルトの名無しさん mailto:sage [2016/02/10(水) 13:05:28.92 ID:D1g79far.net]
だから、どの部分か限定しないと意味がないって
>>800 の分類なら 1 (文字列型) はUTF-16の言語もあるけど
低レイヤのC言語APIを含む、2,3,4 (API/ソース等) はUNIX系ならUTF-8ってだけだろ
ほとんど全員の言っていることは正しいよ

で、互換性や過去のしがらみがない場合、文字列型のあるべき姿が
SJIS等の個別エンコードを触れるべきなのか、
UTF-8/16/32のどれかに見えるべきなのかは、また別の話

Luaを改造してUTF-32 Luaを作ってくれてもいいんじゃよ



826 名前:デフォルトの名無しさん mailto:sage [2016/02/12(金) 08:59:17.26 ID:w1PVoXoh.net]
>>816
>UTF8用の処理は低層のUnixとのやりとりのためのものだし、
の反論として書いただけなんだけどね

今から言語作るならUTF-32にすべきって人もいるけど俺はそうは思わないな、最近でた言語のgoも基本UTF-8だしswiftの文字列型も内部表現は21bitだし(UTF-32に近い物ではあるけど)ね。
goはコードポイント単位で扱いたい場合は32bit配列に変換するイメージ
文字列をfor rangeで回すとコードポイント単位で取れたりと扱いやすくはなってるけどね

(ソースコードのエンコーディングはUTF-8一択だと思ってるのでどうでもいいです)

冗談につっこむのもアレだけどUTF-32版のluaって何をUTF-32にするんだろうか。
string型?lua5.3からのutf8でstringを簡単にコードポイント単位で扱えるんだからstring自体をUTF32にする必要そんなに無いと思うけど

827 名前:デフォルトの名無しさん mailto:sage [2016/02/12(金) 09:29:05.34 ID:whWT7zC/.net]
>>817
「文字列型のエンコーディング」の話をする場合、
内部の保持方法なのか、文字単位で扱う場合の見え方なのかで祖語があったかも。

私見だが、内部表現は言語本体の開発者だけが知っていれば良いもので、
使う側は文字単位でしか扱えなくて構わないと思ってる。
UTF-8で保持して、文字を要求されるとUTF-32で返す実装ももちろんアリだ。

UTF-32 Luaもそんなイメージだった。
UTF-8での保持が前提だから、WindowsではUTF-16へ変換してW系のAPIを使えるし
長さ, substr, 正規表現 等は、バイトではなく文字数で指定させる。

828 名前:デフォルトの名無しさん mailto:sage [2016/02/12(金) 11:00:48.21 ID:x5lzfsVs.net]
>>817
UNIXとのやりとり≒C言語の文字列処理APIだから反論になってなくて同じこと言ってるだけだと思う

go言語は従来的な言語での「内部コード」相当は結局のところ32bitってことだよね
コンバートを言語仕様に組み入れて使いやすくしたところは偉いけど、複雑で面倒とも言える

829 名前:デフォルトの名無しさん mailto:sage [2016/02/12(金) 13:17:26.15 ID:w1PVoXoh.net]
>>819
中身Javaで書かれたAndroidのフレームワーク使うのがUnixとのやり取り?C言語だったらUnixとのやりとりなん?
センセーWin32を使うのもUnixとのやり取りに入りますかー?

>go言語は従来的な言語での「内部コード」相当は結局のところ32bitってことだよね
言ってる意味がわからん…。簡単32bitに変換できたら内部コードは32bit?
C++でも関数一つで変換出来るけどC++の内部コードは32bit相当になれますか?
ちなみにgoでlen(string)したらUTF-8でのbyte数返るよ。

830 名前:デフォルトの名無しさん mailto:sage [2016/02/12(金) 15:01:37.11 ID:XlZH7QFA.net]
確率的に考えるとサロゲートペアは "\r\n" よりマシだが
無料ソフトがすごすぎて誰も確率やコスパの話をしない

831 名前:デフォルトの名無しさん mailto:sage [2016/02/12(金) 22:39:27.60 ID:Bbm2lPXR.net]
>>820
s/UNIX/C言語ベースのOSのAPI/でいい?

内部コードは以下のながれ
・今つくるなら32bitだろってのは「文字列型」の内部表現の話
・従来の多くの言語での文字列型は、長さ=文字数を期待してつくられた(実際は破綻したけどそれはさておく)
・go言語でも、文字数=長さで処理したい場合は、32bitなruneにするんだから発想は同じだよね?

832 名前:デフォルトの名無しさん [2016/02/13(土) 01:24:52.89 ID:M5U5EIyy.net]
>>822
だからC言語ベースのOSのAPI ってくくりだとUTF-8をまともに扱えないWin32も入るでしょ?何が言いたいのか全く解らんのだけど

GoのruneはあくまでもUnicodeのコードポイントが入るサイズの整数(int32)の配列であって文字列型では無いと思うけど。その配列をそのまま文字列として出力できないしね

833 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 01:55:35.83 ID:24vNB1dv.net]
>>823
お互いさっぱりだね。
元の

834 名前:bは、スマホでデファクトなのはutf16じゃろってだけの話だよ

runeはあきらかに他の言語の「文字列型」を想定したものだと言ってるだけだよ。言葉遊びしたいわけじゃない
[]
[ここ壊れてます]

835 名前:デフォルトの名無しさん [2016/02/13(土) 05:49:29.94 ID:M5U5EIyy.net]
>>824
だからgoの文字列型はstringだろ。そこに異論がある?
runeは文字列からコードポイントの配列を取るだけ。
そんなもん他の言語、Luaにすら5.3からあるわ

スマホがUTF-16がデファクトってのも上に乗っかってるJavaとObjective-C(Swift除く)だけ使うならそうだろうよ。
でも一番最初の話はスマホへゲームを移移植するときの話 でAndroidもiOSでも動かす場合はUTF-8がデファクトスタンダードだって話をしてたんだ。それをUTF-16だろってツッコミ入れられたから反論してるだけで最初から俺はJavaとかObjective-Cは話の外にあんの



836 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 07:08:29.64 ID:tl7vIPkr.net]
なんだ、最初の奴がまだ頑張ってたのかよw

>AndroidもiOSでも動かす場合はUTF-8がデファクトスタンダード

とりあえずこれ、まともに根拠を示せてないんだけど。

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のクレジットあったぞ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<264KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef