トップページtech
1002コメント341KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/03/10(日) 15:10:32.28
LuaやSquirrelやAngelScriptなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです
まとめwiki(なにか質問する前に必ずみること!)
http://wikiwiki.jp/lua/

その他の参考URLは>2から

■前スレ
【Lua】組み込み系言語総合 その5【Squirrel】
http://toro.2ch.net/test/read.cgi/tech/1321063450/
■過去スレ
その4 http://hibari.2ch.net/test/read.cgi/tech/1301414458/
その3 http://hibari.2ch.net/test/read.cgi/tech/1272643397/
その2 http://pc12.2ch.net/test/read.cgi/tech/1243210301/
その1 http://pc12.2ch.net/test/read.cgi/tech/1205208141/
プログラミング言語 Lua
その3 http://pc11.2ch.net/test/read.cgi/tech/1160799232/
0754デフォルトの名無しさん2016/02/05(金) 15:39:47.51ID:brMGa4PB
いち早くUnicode()に対応したはいいけど2バイトに収まりきらず、固定長じゃなくなってメリットが何もなくなった上に
他のプラットフォームは軒並みUTF-8になってしまって孤立してしまったが互換性のためにSJISを捨てられないWindowsさん
MSVCで設定とかでUTF-8版のCライブラリ(中でUTF-16に変換するような)を使えるようにしてくれたらいいような気もするんだけど何か問題あるんだろうか
0755デフォルトの名無しさん2016/02/05(金) 16:03:19.95ID:TvHQKkN9
ラテン語圏のやつらが作る言語はいつもこう。
0756デフォルトの名無しさん2016/02/05(金) 19:16:06.06ID:brMGa4PB
ははっ、
RubyのWindowsでの日本語対応がマトモだったと思ってる?
0757デフォルトの名無しさん2016/02/05(金) 19:54:12.16ID:Jcxd0Fsw
Windows切るだけで解決する
0758デフォルトの名無しさん2016/02/05(金) 20:10:36.21ID:pWou2Qho
Windows の API を UTF-8 にすべきだったとは思わんのだよな。
UTF-8 を基本にしてしまうと ASCII コードの範囲内で使う分には対応してようがいまいが使えちゃうから、
対応してない部分が顕在化し難いまま混在してわけわからんようになるのが見えてる。
その点、 UTF-16 と ASCII (ANSI) が混ざったらすぐ発覚する。
0759デフォルトの名無しさん2016/02/05(金) 20:32:40.84ID:brMGa4PB
>>758
へぇ
Windows以外はわけわからんようになってるという主張でございますか?
0760デフォルトの名無しさん2016/02/05(金) 21:00:24.37ID:I7CO4PTN
主要なコードもUTF8じゃなく、OS内部もUTF8じゃなく、標準入出力もUTF8じゃなく、あげく、UTF8にしても世界の文字の一部しか対応できないので
いうような利点はないってことでしょ。

utf8にしても、実際の運営としてはASCIIのような運営範囲なんでしょ?w
0761デフォルトの名無しさん2016/02/05(金) 21:04:55.16ID:ToPlCIrz
>>758 の真意はよくわからんが
char (1 byte) にしか対応していないコードや製品が氾濫するのは困るが
wchar_t (2 byte) にしか対応していないものなら許容できるってニュアンスか?

それもサロゲートペアができて破綻したけどな。
絵文字のせいで目にする機会も無いではないし。
0762デフォルトの名無しさん2016/02/05(金) 21:28:04.79ID:brMGa4PB
>>760
何言ってるのかよくわからんけど
>>UTF8にしても世界の文字の一部しか対応できないので
表現できる範囲はUTF-16も同じなんだが、それもダメって言ってるんだよね?

ってことはつまりSJISとかそれぞれのエンコーディングで適切な処理を行えってこと?

俺はUTF-8のコードポイントの区切りかたは知ってるけど、
他の言語の専用エンコーディングどころか
SJISのコードポイントの区切り方すら知らないわ、
それをプログラミング言語作る人にしかも日本語とかまったく使わない海外の作者に強いるとかできないっすわ。
0763デフォルトの名無しさん2016/02/05(金) 21:36:38.36ID:TvHQKkN9
そんなもん自慢話にもならん。誰それ構わず噛み付いてアホか。
0764デフォルトの名無しさん2016/02/05(金) 21:53:39.03ID:brMGa4PB
誰が自慢話してるんだ?
0765デフォルトの名無しさん2016/02/05(金) 23:17:47.52ID:AF25xcuE
妥協も多いけど現実的だったオリジナルのUnicodeが、世界中のあらゆる文字をひとつのコードで
表現するという無謀な目標を掲げた10646と合流してごみ溜めのようになった。
そんなのに付き合って苦労するのはバカらしいから、基本多言語面だけサポートしてサロゲートペアは
トーフ扱いするのが現実的。どうせろくにフォントも無いし。
0766デフォルトの名無しさん2016/02/05(金) 23:26:52.29ID:pWou2Qho
>>759
コードページの概念を捨てられないという主張。 そりゃ全部 UTF-8 に出来ればベストだとは思うよ。
でも捨てられない以上、下手に混ざってわけわからんようになるよりは混ざったらすぐわかる方がマシって話。
0767デフォルトの名無しさん2016/02/05(金) 23:56:37.35ID:wLhOEYBg
各国のコンソールのコードページも65001じゃないし、65001じゃ
日本語もまともに表示できないわけで。

逆にプログラミング言語ごときが数十億人が使ってる現実的な各文字コードを押しのけて
utf8に全文書統一しろ、今すぐしろとか言っても、相手にされんよ。
0768デフォルトの名無しさん2016/02/06(土) 00:27:48.85ID:/BZKOehd
Unicodeで表現できない文字って少なくとも日本では名前に変体文字使ってる数%がごねてるだけでしょ
数十億人とか盛りすぎ
0769デフォルトの名無しさん2016/02/06(土) 00:47:56.49ID:/BZKOehd
というかSJISには割り当てられててUnicodeで割り当てられてない文字ってあるの?

>>765
最近の携帯電話使ったことないのかい?

>>767
Windows内部はUnicodeで扱ってるからコンソールもUnicodeで表現できない文字は表示できませんよ
WindowsのコンソールをCP65001にしてもまともに表示できないのは実装がタコなだけ
あとメジャーな携帯電話のOSはどちらもUnicodeですけどこれは本当に数十億人が使ってますよ
0770デフォルトの名無しさん2016/02/06(土) 02:13:32.99ID:bnndf23C
iOSは消滅確実だが、Androidは十分残りそうだなぁ。

実装がカスとかいったところで、モノ生産してるデスクトップ85%から占めてるてるものを
否定して見ない振りしてもしょうがない。

逆にビューワー(携帯)なんか資産性がないからどうでもいいよ。
0771デフォルトの名無しさん2016/02/06(土) 03:04:06.56ID:/BZKOehd
話をどこへ持っていきたいのかよくわからんけど元々は、
WindowsがUTF-8をまともにサポートすべきかっての論点だと思ってたけど。だからいまの実装を見ないふりもなにもないよ。
MicrosoftがWindowsでUTF-8をちゃんとサポートししようとしても今と変わらずクソ実装になるって主張じゃないよね?

>逆にビューワー(携帯)なんか資産性がないからどうでもいいよ。
プログラムを動かすのは大多数が持ってるビューワーなわけで、それこそ否定して見ないふりしてどうすんのよ。
今はサーバーはLinuxで携帯はiOS or Androidなわけで、プログラムを実行する環境全体を見るとWindowsなんて少数派だよ。
0772デフォルトの名無しさん2016/02/06(土) 08:26:37.09ID:X7qr0C1S
OSのネイティブ (C言語) では UTF-16 (Windows) と UTF-8 (それ以外) があるけど
今主流の言語 (Java, C#, Swift/Obj-C, JavaScript) のレベルでは
ほぼ UTF-16 に統一された印象があるんだが、この認識は間違っているだろうか?
ファイル入出力では文字コード変換をするのは前提として。
OSうんぬんより、むしろ文字列型がUTF-16でない言語が問題な気がする。
0773デフォルトの名無しさん2016/02/06(土) 12:03:30.10ID:BlYk2woR
結局こういう面倒な問題はグレーにしてるLuaが勝ち組
0774デフォルトの名無しさん2016/02/06(土) 14:43:17.15ID:8fDg9LDU
>(Java, C#, Swift/Obj-C, JavaScript)
その辺の言語はUTF-8が産まれる前からある言語だからな
SwiftはUTF-16じゃないし(もちろん扱えるけど)、goは基本UTF-8
0775デフォルトの名無しさん2016/02/06(土) 15:15:51.79ID:su9E+X74
Ruby ソースコードはコメントで指定、文字列型は内部にエンコーディング情報を持ってる
python 内部表現はデフォルトucs4(WindowsだけUTF-16)
php よく知らんけどググってみる限り統一されてなさそう

というわけでUTF-16に統一されてるわけじゃないよ。
0776デフォルトの名無しさん2016/02/06(土) 15:22:16.66ID:22sNDRQR
結局のところ、このスレ的にはC言語の整合がとれてないのが困りどころよな

wchar_t をいまさら統一とは言わないけど、なんか統一した別枠の仕様を標準化してほしい
0777デフォルトの名無しさん2016/02/06(土) 15:44:17.53ID:22sNDRQR
あ、C/C++の規格的にはもう11で統一されてたのか

char16 _t がutf-16、char32_tがutf-32で固定の組み込み型。u"" U"" でそれぞれリテラル指定も可能

ただし全部これに対応したライブラリーは整備されてないので、
実情はあんまかわらん模様
0778デフォルトの名無しさん2016/02/06(土) 15:52:48.40ID:22sNDRQR
アプリ内部はchar16_tかchar32_tでかいて、
OS依存処理は分離した上で、winはwchar_t がutf-16だからそのままワイド系の関数やapi使って、
unix系はwchar_tは信頼できないから、c16rtomb かc32rtomb でmbに変換して対応、が、C11以降の正しい書き方ってことかな
0779デフォルトの名無しさん2016/02/06(土) 22:02:21.26ID:iW4Rvogm
ここ何のスレだっけ…?
0780デフォルトの名無しさん2016/02/06(土) 22:11:19.39ID:+jWWiLZa
組み込み言語だろ。流れには沿ってるよ
0781デフォルトの名無しさん2016/02/07(日) 00:18:29.86ID:LSSjhAu+
>>777
だからUTF-8に統一すりゃいいのにって話に戻るわけだ
0782デフォルトの名無しさん2016/02/07(日) 00:48:50.94ID:4QXOAnIu
言語処理系がSJISソースコードを処理できるか(5C問題)と、言語やOSの内部文字コードの話がたまに混ざる。
0783デフォルトの名無しさん2016/02/07(日) 03:59:45.36ID:LSSjhAu+
SJISでソースコード書くやつなんて今時いないよね?
それに誰もそんな話してないよね?
0784デフォルトの名無しさん2016/02/07(日) 20:56:40.56ID:8pvMtac5
utf-8サポート入ったlua5.3以降の話だったのね。
以前(5.1/5.2)はsjisパッチがあったりしたので、そっちの話も出てたのかとおもった。
0785デフォルトの名無しさん2016/02/07(日) 23:13:24.81ID:vQROT1hb
>>783
今でもマルチバイトのソースコードは山盛りだよ。
最も使用頻度が多いVSがデフォルトSJISだぞ。

そんな現実すら知らずにプログラマやってて
本気で言ってるな、周りが全く見えてない能無し。
0786デフォルトの名無しさん2016/02/07(日) 23:15:09.52ID:jiomZ/W6
たまに文字列リテラル内の文字コードが書かれた文字コードに依存する糞処理系とかあるしな・・・
0787デフォルトの名無しさん2016/02/07(日) 23:22:01.52ID:vQROT1hb
utg8に依存してるmrubyとかなw
0788デフォルトの名無しさん2016/02/07(日) 23:44:00.61ID:LSSjhAu+
>>785
それはWindowsでしか動かないプログラムを書くお前の環境特有の話
それに気が付いてないなら
>周りが全く見えてない能無し。
自己紹介おつ

>>787
組み込み言語なら現実的な選択でしょ
多種多様なエンコーディングに対応するためにOSとか巨大な外部ライブラリに依存するほうが糞
0789デフォルトの名無しさん2016/02/08(月) 00:07:53.29ID:0XuKQtD5
だいたいMicrosoft傘下になったゲームスタジオのWindows10アプリ移植版が
日本語ユーザー名だとエラーになるっていう体たらくだよ。
完全にSJISがMicrosoft自身の足も引っ張ってる
0790デフォルトの名無しさん2016/02/08(月) 00:20:53.72ID:+/8cbHLD
そういうのはマルチバイトエンコーディングを適切に扱わずにUS-ASCIIしか想定して
なかったという類の問題でしょ。UTF-8だったとしてもやらかす奴はやらかす。
0791デフォルトの名無しさん2016/02/08(月) 00:48:05.85ID:0XuKQtD5
>>US-ASCIIしか想定してなかった
違うよ。日本語表示も(他の言語の表示も)できてる。予想だけど内部ではUTF-8で処理してんだろうよ。

ここまで書けば多数の人は何を指してるのかわかるだろうから具体的なゲーム名は言わないけど
そのゲームは
PC版(Java) → スマートフォンへの移植版(ネイティブアプリ版) → Windows10アプリ版
と移植されていったわけ、スマートフォンではUTF-8がデファクトスタンダードだから当然の結果だね。
で、Windows10版もUTF-8文字列をそのままファイル操作のAPIへ渡してしまったんだろうね

>>UTF-8だったとしてもやらかす奴はやらかす。
とはいってもSJISを"適切に扱う"ということと比べたら屁みたいなもん

それにこのゲームでの問題の適切な解決策はSJISを適切に使うではなくWindowsのみUTF-16へ変換してwide版のAPIを呼び出すだ。
0792デフォルトの名無しさん2016/02/08(月) 01:08:11.78ID:B1wV/kIt
文字コード総合スレ Part10 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1444822140/

どうしてもここで語りたいなら言語と処理系を限定しろ
話が発散する
0793デフォルトの名無しさん2016/02/08(月) 03:55:04.72ID:9ZhGg5zu
システムのファイル名・ユーザー名などは、
半角英数字のみを使う

外人は日本語でのテストなどをやっていないから、
日本語などを使ったら、バグる

SEの常識だろ。日本語など、
誰もメンテナンス・テストしていないものを、
システムで使うのはおかしい

Linux・Macなんか、ファイル名に半角スペースがあっても、バグる
0794デフォルトの名無しさん2016/02/08(月) 07:43:55.20ID:stcXIyTr
ドイツ語でもバグるよ
0795デフォルトの名無しさん2016/02/08(月) 08:08:27.71ID:+/8cbHLD
スマートフォンでUTF-8がデファクトスタンダードってなんのことを言っているのやら。
iOSやAndroidのプログラミングしたことないのかね?
0796デフォルトの名無しさん2016/02/08(月) 09:04:21.92ID:rq38tdFU
AndroidもiOSも代表的なutf-16環境だな
0797デフォルトの名無しさん2016/02/08(月) 09:17:28.34ID:5blmn2mR
扱わないといけない文字コードは4種類ある。
 1. プログラム中の文字列型
 2. OSのAPI
 3. ソースコード
 4. 入出力ファイル
4については、対応が必要なぶんの変換モジュールを用意すればよいだけ。
3については、1に決め打ちするのが楽だが、4があるなら変換して読み込めばいい。

で、Windows対応を謳うには以下のどちらかが必須。
・setlocale で 1=2 という環境に限定し、1に対してmblen等の適切な処理をする
・1=ユニコード (UTF-8/16/32は問わない) として 2=W系API を使う

Luaの実装はどちらでもないので、「Windows対応が完全ではない」と評価するのが妥当。
Squirrelなら後者になるようコンパイルできるので、この件に関しては問題ない。
他の環境はわからないが 1=ユニコード なら後者を満たしていると期待できそう。
0798デフォルトの名無しさん2016/02/08(月) 11:43:28.74ID:M0j0fnEJ
Squirrel って最近聞かないと思ったら1年前の最新リリースから止まってるのかよ
0799デフォルトの名無しさん2016/02/08(月) 11:52:01.97ID:5blmn2mR
>>798
そう。だから「この件に関しては」と書いた
他の要素、将来性などは……
0800デフォルトの名無しさん2016/02/08(月) 14:05:07.38ID:rq38tdFU
>>797
windowsの cランタイムのsetlocale が utf-8 に対応さえしてくれれば悩む必要無いのにねぇ
0801デフォルトの名無しさん2016/02/08(月) 22:35:54.46ID:jpNGf5dG
>>795
>>796
上に載っかってるJavaとObjective-Cしか使ったことないの?
NSStringはUTF8Stringで、JNIではGetStringUTFCharsでUTF8の文字列を取れるけどUTF1 文字列で直接取得する方法ないぞ。
クロスプラットフォームの為にCやC++を扱うならUTF8にするのが常識
0802デフォルトの名無しさん2016/02/09(火) 00:41:57.31ID:W9OWY02z
>>801
デファクトって言うなら主要開発環境でみないと駄目じゃろ
0803デフォルトの名無しさん2016/02/09(火) 07:41:05.80ID:Wb20B9c6
>UTF1 文字列で直接取得する方法ないぞ。

UTF-16のtypoだろうが、NSStringならcharacterAtIndexとか、JNIならGetStringCharsとか。
0804デフォルトの名無しさん2016/02/09(火) 07:54:13.04ID:OaLyyuyL
>>801
NSStringはそのままUTF16だからgetCharactersでunicharでとれるな

UTF8用の処理は低層のUnixとのやりとりのためのものだし、その層ではutf-8が必要なのはもちろんだけど、それをAndroidやiOSの標準かのように言うのはおかしいと思うな
0805デフォルトの名無しさん2016/02/09(火) 08:14:07.29ID:DpNg1xio
UTF16なら固定長で行ける!という勘違いをしてる
外人は多いよ。
0806デフォルトの名無しさん2016/02/09(火) 10:53:46.23ID:dd4nRHCa
>>804
ユニコードでさえあれば、内部のUTF表現まで気にする必要はないんじゃ?
特に文字列型がimmutableなら、複数の表現をキャッシュしても問題なさそうだし

>>805
日本人でも多くないか?
新しく言語を設計できるなら、CharはUTF-32であるべきだとは思う
0807デフォルトの名無しさん2016/02/09(火) 12:19:21.81ID:+sr/gpA9
charのサイズがintのサイズに近づけばintの配列を使う人も出てくるんじゃないの
それにluaがpythonに近づけばpythonを使う
0808デフォルトの名無しさん2016/02/09(火) 12:28:04.23ID:OaLyyuyL
>>806
話の流れはutf8がデファクトかどうか、です
実際にはutf16のが主流だろって指摘

外部はutf8でいいとして、内部で使うなら今後はやっぱ32だな。少なくともサロゲートペアの罠は回避できるし
0809デフォルトの名無しさん2016/02/09(火) 14:09:36.45ID:+sr/gpA9
sjisとutf16とutf32って、まるでxpとvistaと7みたいだね
0810デフォルトの名無しさん2016/02/09(火) 17:44:02.58ID:zKyrJnIK
>>806
それって言語の問題無の? 標準ライブラリで吸収できない?
0811デフォルトの名無しさん2016/02/10(水) 08:02:28.26ID:2QwVjJmi
Web系の主流がutf8なのは確か
0812デフォルトの名無しさん2016/02/10(水) 12:03:00.48ID:ShaMeiRT
iOS もAndroidもC言語文字列を扱うAPIはwideでもそれ以外の整数型の配列でもなくconst char*のutf-8だけどな
iOSはCore*とかAndroidはC用API自体少ないけどAAssetManagerとかAStorageManagerとか
0813デフォルトの名無しさん2016/02/10(水) 13:05:28.92ID:D1g79far
だから、どの部分か限定しないと意味がないって
>>797 の分類なら 1 (文字列型) はUTF-16の言語もあるけど
低レイヤのC言語APIを含む、2,3,4 (API/ソース等) はUNIX系ならUTF-8ってだけだろ
ほとんど全員の言っていることは正しいよ

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

Luaを改造してUTF-32 Luaを作ってくれてもいいんじゃよ
0814デフォルトの名無しさん2016/02/12(金) 08:59:17.26ID:w1PVoXoh
>>813
>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にする必要そんなに無いと思うけど
0815デフォルトの名無しさん2016/02/12(金) 09:29:05.34ID:whWT7zC/
>>814
「文字列型のエンコーディング」の話をする場合、
内部の保持方法なのか、文字単位で扱う場合の見え方なのかで祖語があったかも。

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

UTF-32 Luaもそんなイメージだった。
UTF-8での保持が前提だから、WindowsではUTF-16へ変換してW系のAPIを使えるし
長さ, substr, 正規表現 等は、バイトではなく文字数で指定させる。
0816デフォルトの名無しさん2016/02/12(金) 11:00:48.21ID:x5lzfsVs
>>814
UNIXとのやりとり≒C言語の文字列処理APIだから反論になってなくて同じこと言ってるだけだと思う

go言語は従来的な言語での「内部コード」相当は結局のところ32bitってことだよね
コンバートを言語仕様に組み入れて使いやすくしたところは偉いけど、複雑で面倒とも言える
0817デフォルトの名無しさん2016/02/12(金) 13:17:26.15ID:w1PVoXoh
>>816
中身Javaで書かれたAndroidのフレームワーク使うのがUnixとのやり取り?C言語だったらUnixとのやりとりなん?
センセーWin32を使うのもUnixとのやり取りに入りますかー?

>go言語は従来的な言語での「内部コード」相当は結局のところ32bitってことだよね
言ってる意味がわからん…。簡単32bitに変換できたら内部コードは32bit?
C++でも関数一つで変換出来るけどC++の内部コードは32bit相当になれますか?
ちなみにgoでlen(string)したらUTF-8でのbyte数返るよ。
0818デフォルトの名無しさん2016/02/12(金) 15:01:37.11ID:XlZH7QFA
確率的に考えるとサロゲートペアは "\r\n" よりマシだが
無料ソフトがすごすぎて誰も確率やコスパの話をしない
0819デフォルトの名無しさん2016/02/12(金) 22:39:27.60ID:Bbm2lPXR
>>817
s/UNIX/C言語ベースのOSのAPI/でいい?

内部コードは以下のながれ
・今つくるなら32bitだろってのは「文字列型」の内部表現の話
・従来の多くの言語での文字列型は、長さ=文字数を期待してつくられた(実際は破綻したけどそれはさておく)
・go言語でも、文字数=長さで処理したい場合は、32bitなruneにするんだから発想は同じだよね?
0820デフォルトの名無しさん2016/02/13(土) 01:24:52.89ID:M5U5EIyy
>>819
だからC言語ベースのOSのAPI ってくくりだとUTF-8をまともに扱えないWin32も入るでしょ?何が言いたいのか全く解らんのだけど

GoのruneはあくまでもUnicodeのコードポイントが入るサイズの整数(int32)の配列であって文字列型では無いと思うけど。その配列をそのまま文字列として出力できないしね
0821デフォルトの名無しさん2016/02/13(土) 01:55:35.83ID:24vNB1dv
>>820
お互いさっぱりだね。
元の話は、スマホでデファクトなのはutf16じゃろってだけの話だよ

runeはあきらかに他の言語の「文字列型」を想定したものだと言ってるだけだよ。言葉遊びしたいわけじゃない
0822デフォルトの名無しさん2016/02/13(土) 05:49:29.94ID:M5U5EIyy
>>821
だからgoの文字列型はstringだろ。そこに異論がある?
runeは文字列からコードポイントの配列を取るだけ。
そんなもん他の言語、Luaにすら5.3からあるわ

スマホがUTF-16がデファクトってのも上に乗っかってるJavaとObjective-C(Swift除く)だけ使うならそうだろうよ。
でも一番最初の話はスマホへゲームを移移植するときの話 でAndroidもiOSでも動かす場合はUTF-8がデファクトスタンダードだって話をしてたんだ。それをUTF-16だろってツッコミ入れられたから反論してるだけで最初から俺はJavaとかObjective-Cは話の外にあんの
0823デフォルトの名無しさん2016/02/13(土) 07:08:29.64ID:tl7vIPkr
なんだ、最初の奴がまだ頑張ってたのかよw

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

とりあえずこれ、まともに根拠を示せてないんだけど。
0824デフォルトの名無しさん2016/02/13(土) 07:42:00.73ID:6QXsiJCA
OSの話はスレ違い
その上で動作する組み込み言語の話をせよ
0825デフォルトの名無しさん2016/02/13(土) 12:35:56.00ID:AxbgYY0v
何がスタンダードでもいいけど
UTF16は中途半端感が半端ないよな
0826デフォルトの名無しさん2016/02/22(月) 21:10:17.21ID:6cWcowj1
mrubyも仲間に入れて良いですか?
0827デフォルトの名無しさん2016/02/23(火) 00:28:29.80ID:liQI2ylD
良いと思います
0828デフォルトの名無しさん2016/02/23(火) 10:19:51.72ID:kQ/gcKij
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() のコロン使用での暗黙の第一引数が入っている?憶測)
備考:簡単なスタックダンプで見る限りではユーザデータしか積まれていない様に見える。(主観)

徹夜してまで追跡しても方法わからず、何か勘違いや問題点があったら教えてくらはいおながいします
0829デフォルトの名無しさん2016/02/23(火) 12:27:23.57ID:UPC5owG9
>>828
(★ expected, got userdata
のエラーメッセージで、正確な★の値を確認してほしい。
luaL_checkudata は引数 tname の文字列で型チェックをするのだが、
luaL_newmetatable や luaL_setmetatable で登録したものと一致しているだろうか?
0830デフォルトの名無しさん2016/02/23(火) 16:36:12.58ID:liQI2ylD
>>828
それはbinderの質問だな
binderは何を使ってるの?
その問題が再現する最小のコードを作って作者に質問すりゃいいよ
英語が苦手ならここでもいいけど解決する保証はできん
0831デフォルトの名無しさん2016/02/23(火) 21:28:17.51ID:kQ/gcKij
レスくれたのに遅れてごめね、潰れてた

>>829
Luaでnew()したC++のクラスのインスタンスを受け取る関数で実行してるとこで
void * const pv = luaL_checkudata( pluastate, -1, "TestClass" );
にするとそのまま(hoge expected, got userdata)になっちゃった
C++のクラスのテーブル作ってるとこのlua_setglobal( pluastate, "TestClass" );と同じでもダメだし
もちろんC++側でのクラス名でも変わらず

>>830
binderはざっくり検索した範囲だと大きかったりboost必須だったり
更新してなかったりで将来に不安が残る感じで何も使ってないの、アメリカ語は_〜

クラスのテーブル作るとこで型名を明示的に指定してやったりしないといけないのかな
きっとthisの値を生で吐き出すメソッド実装してそれを関数に渡せば何とかなるんだろうけど
そういう力技あんまし使いたくないし後々すんごく気持ち悪くなりそうな・・・
0832デフォルトの名無しさん2016/02/23(火) 21:43:48.82ID:kQ/gcKij
連投すまぬ、>>830をヒントに検索したらlua_typename()なる関数を発見、スタックに積まれてる引数に
CString str = lua_typename( pluastate, -1 );
してみたんだけど "no value" になった、lua_type()は相変わらずユーザデータ

念の為luaのソースで引数を数値にしてC++の関数でluaL_checkinteger()に入れ替えると
正しく整数がそのまま流れてくるから位置は間違ってない可能性が高いと思ってる(憶測)

メタテーブルと言っても所詮(?)はユーザデータだし、
ユーザデータ作る時にlua_setglobal()の前後で明示的に型名を指定してあげないとダメなのかな?
0833デフォルトの名無しさん2016/02/23(火) 21:50:32.63ID:UPC5owG9
>>831
エラーメッセージを加工しないでくれ。
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側に公開した変数名ではないぞ?
0834デフォルトの名無しさん2016/02/23(火) 21:51:06.03ID:liQI2ylD
>>831
そうなんか。
まあ俺も使ってた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個めの引数
0835デフォルトの名無しさん2016/02/23(火) 22:01:41.19ID:liQI2ylD
>>832
メタテーブルはユーザーデータではないぞ
ユーザーデータにメタテーブルって形で普通のテーブルを設定できるだけでメタテーブル自体はtable型

ユーザーデータはテーブル参照されると、そのユーザーデータに設定されているメタテーブルを参照して
値があればそれを返す


>>833
hogeは察するにlua側の関数名だろ
0836デフォルトの名無しさん2016/02/23(火) 22:03:44.40ID:liQI2ylD
連投すまんが
lua_typename( pluastate, -1 );
この第二引数はスタックのindexではなくlua_typeで返る値
0837デフォルトの名無しさん2016/02/23(火) 22:50:47.99ID:kQ/gcKij
>>833
すまない、hogeからもう一度TestClassやluaTestClass、その他の定義
色々試し直してたら不一致になってしまった
LuaからC++、C++からLuaは既に成功していて、C++からC++も既に成功というか
OpenCVの亜種とFreeBSDのlibの一部をLuaに機械的な手作業でバインドしようとしてるから
その辺りの実績は問題ない・・・筈

>>834
凄いヒントをありがとう、今までnewの後にluaL_setmetatable()はしてなかった
けど単純に追加しただけじゃダメらしい、相変わらず同じメッセージが出力されて失敗する

>>835>>836
メタテーブルの認識を間違えてたんだ、それとlua_typename()の第二引数・・・
勉強し直して再確認して出直してくる

OpenCVの亜種とBSDのlibのヘッダのインクルードやらリンクやらでソース丸々アップとか難しい状態
文字でしかやりとりできない、もどかしくてごめんね、みんなありがとう
0838デフォルトの名無しさん2016/02/23(火) 23:12:34.76ID:liQI2ylD
たぶんちゃんとメタテーブルを設定できてないんだと思うよ。
luaL_setmetatable はスタックの一番上の値に対して引数で与えた名前のメタテーブルを設定する
メタテーブルの名前はluaL_newmetatableで作った時のもの。

http://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;
}
ってするとユーザーデータに設定されているメタテーブルの名前も一緒に出力できる
0839デフォルトの名無しさん2016/02/23(火) 23:30:00.22ID:kQ/gcKij
>>838
一発でわかった、ありがとう、ありがとう、そして一番のキーワードは>>834のluaL_setmetatable()

目的:C++で実装したクラス(lua クラス バインド でggって出てきたページを参考に作成)を
 Luaでnewしてインスタンスを生成、それを更にC++で実装した
 全く別の独立した静的関数にそのまま渡してその関数内でインスタンスへの変更処理を行う
問題:割愛

原因:Lua側でのいわゆるクラスの型情報であるグローバル変数の実体の作成時に、
 クラスのテーブルの作成にもユーザデータ共通のメタテーブルの作成にもlua_newtable()を使用していた
対処:
 正しく(?)は、メタテーブルの作成の際にはluaL_newmetatable()を使用するべき

憶測(言い訳?):
 メタテーブルであるべきところをネットのサンプル通りに普通(?)のテーブルで実装してしまった為、
 単純なC++からLua、LuaからC++のやりとりでは不都合が出なかっただけだと思われる

長文かつサンプルの提示なしの質問に長々と付き合ってくれてありがとうございました、無事解決しました
0840デフォルトの名無しさん2016/02/24(水) 08:09:28.85ID:4eLJNqm5
おまえらすげぇな
0841デフォルトの名無しさん2016/03/08(火) 07:25:35.42ID:kiMIo1Bf
“という名前のファイルをio.openで開こうとすると開けないのですがどうやったら開けるようになりますか?
0842デフォルトの名無しさん2016/03/08(火) 07:37:15.49ID:kiMIo1Bf
開けました
0843デフォルトの名無しさん2016/03/20(日) 11:05:43.19ID:S+FF32wm
スレチかもですがJavaScriptエンジンのスレがないのでお邪魔させてくだちい。

googleのJavaScriptエンジンv8をVS2015のレガシーなC++でビルドして
VS2015のC++/CLIでリンクして実行するとヒープ破壊のエラーが出て落ちます。
(デバッガでトレースが始まる前の段階で落ちているので追跡しようがありません)
v8::V8そのものへの参照を全てコメントアウトすると落ちずにmain関数に入ってきます。
何か特殊な設定か対処の類が必要なのでしょうか?
それともC++/CLIがダメ子ちゃんなのでしょうか?
0844デフォルトの名無しさん2016/03/20(日) 11:49:11.85ID:Byvmq8tF
>>843
その組み合わせは使ったことは無いが、もしネイティブC++で問題ないなら
2種類のGCを持つ環境が競合しているんだろうな
v8 の代わりに Chakra JsRT なら、MS同士だから実績があるかもしれない
0845デフォルトの名無しさん2016/03/20(日) 22:46:48.41ID:S+FF32wm
>>844
gc回りの机上でのコード追跡に挫折しました・・・
v8のコードを一切コールしなくても、v8::V8回りがリンクされるだけでダメっぽいです。
CRT回りの静的変数の初期化の時点でヒープ破壊のエラーが発生してしまうので
(ソースをちょっといじるだけでエラーの種類が変わるのでここで書いても意味がないと判断)
ChakraCoreをいじってみます、レスありがとうございました。
0846デフォルトの名無しさん2016/03/20(日) 23:22:32.65ID:Byvmq8tF
自分も最新の情報は持っていないけど、今や組み込みJSも結構な数があるっぽい
https://en.wikipedia.org/wiki/List_of_ECMAScript_engines

WindowsオンリーならChakraで十分
速度がいるならv8だけど、巨大で複雑な部類だとは思う
Duktapeやv7はLua感覚で使えそうだけど、品質や実績はよくわからない
0847デフォルトの名無しさん2016/03/21(月) 00:04:57.23ID:jBN/3X9x
こんなにあったんだ・・・
けどv8ですらまだドキュメントやサンプルが多い方だったんですね。
(Isolateの実装で殆どがコンパイルに通らなくなった様ですが)
ChakraCore一つとってみても例えば
var userobj = new Userobj();
NativeGlobalFunc( userobj );
を実現する道筋の調査に一苦労、
1時間調べてもオブジェクトの作り方すらまだ確信が持てていない状態・・・
片っ端から調べ直して出直してきます。
0848デフォルトの名無しさん2016/03/27(日) 14:51:27.25ID:WUzBhCSW
luaってなんでC++系の文法真似なかったん?
吐き気がする気持ち悪い・・・
結局教育機関が作る言語はどれも学生脳の自慰言語ばっかかよ
0849デフォルトの名無しさん2016/03/27(日) 15:03:16.21ID:9eGj+oKv
>>848
Lua 1.1 は 1994年。そのころはPascal系もまだ元気だったんだ。
自然淘汰の結果として死滅しただけで、最初から未来が見えてたわけじゃない。

今なら、LuaのVMやAPIを真似たJavaScript実装 (>>846) や
先行き不安なSquirrelなど、自分で組み込むなら選択肢はある。
使う側ならどうしようもないが。
0850デフォルトの名無しさん2016/03/27(日) 15:12:37.47ID:WUzBhCSW
>>849
おとなしくうっすいトランスレータ書くわ
0851デフォルトの名無しさん2016/03/27(日) 15:18:28.87ID:Pr6yzqXD
C++に近いといえばgcjがある
公式のJavaよりもC++に近いが彼らが負けを認めることはないだろう
負けを認めない相手と張り合うのは時間の無駄
0852デフォルトの名無しさん2016/03/27(日) 21:30:21.55ID:H7mb6W0C
mytable.test とテーブルの要素にアクセスした時に
定義されていなければ{}を返すようにメタを設定することはできますか?
0853デフォルトの名無しさん2016/03/27(日) 21:46:25.71ID:xKhiQxW2
>>852
luaの話?
であれば__newindexで{}返す関数を設定すればいい
0854デフォルトの名無しさん2016/03/28(月) 01:39:38.42ID:WtaHq3/v
何かうまくいかないから今度またやろう。。
■ このスレッドは過去ログ倉庫に格納されています