HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0830
Y_repeatHSPのオブジェクト思考に関する議論のスレッド28解決


Y_repeat

リンク

2020/8/30(Sun) 17:06:51|NO.91291

HSP3が登場して大分経ちますが
それとともに実装された簡単なオブジェクト指向
使いにくいとの感想もありそうですが
そろそろ。皆さんのHSPのオブジェクト機能に関する
提言を書き込みしていく時期でもあるのかな。と思い
スレッドを建ててみました

自分はHSPのまとめサイトを作成しいていきたくもあるので
ここのスレッドの中身をまとめサイトに更新していくつもりです
そういうの嫌な人がいたら、注意書きしておいてください
大丈夫。僕のまとめサイトなんて公式BBSに比べて
検索順位はものすごい下ですから



この記事に返信する


Y_repeat

リンク

2020/8/30(Sun) 17:13:17|NO.91292

HSPのエラー情報は難しくすると
初心者の方々にわかりにくくなるのでしょうが

中級者の方々とか
(自分はたぶん初級者と中級者の間くらいだと思います)
エラー情報を少々難しくしても大丈夫なのではないでしょうか
そういうのをスイッチする命令があって
スイッチONの状態では難しめでも有意義なエラー情報を吐くとか
どうでしょうか



Y_repeat

リンク

2020/8/30(Sun) 17:21:29|NO.91293

・オブジェクトの名前

変数は書いてすぐ使えて
それに支障はないのでしょうが

オブジェクトの名前は
特にオブジェクト変数に入れた場合
モジュール変数とこに定義して
インスタンス関数書いて
モジュール書いて
setter/getter書いて

やっとその辺で使えるんですよね
まあ。前の書き込みした時の間違えに関するのですが
書いてもすぐには使えないんで
使おうとした時にすぐ使えないので
間違え易いと

そもそもnewmodでオブジェクトを作成しないと使えないので
作成してないオブジェクトを使おうとした場合
ほぼタイプミスとかのエラーだと思います
そういう時はそういうエラーを吐いちゃっていいと思います

ってHSPの警告情報、全然見てないんですが
警告吐くものなのでしょうか



Y_repeat

リンク

2020/8/30(Sun) 17:26:55|NO.91294

・テンプレート

自分はモジュール変数
使い出した頃に
seesaawikiにメモを書いておいてたので
それをテンプレートとして
それを見ながらモジュール変数を使ってます

で、モジュール変数にモジュールのオブジェクトを入れたい時の
メモはまだ書いてなくて
それもあってどう書けば良いかわかりませんでした

なので参照しながらコーディングとかに使える
HSPのオブジェクトに関するテンプレートがあったら便利なのでは?
と思ったのでした



kanamaru

リンク

2020/8/30(Sun) 23:07:21|NO.91297

議論ってことは自分の意見を書いていいですよね
・エラーについて
タイトルと違う内容な気がしますがスレッド立てた人が意見書いてますし書いておくと、
エラーダイアログに行数やら書くよりはエディタに赤線引いてほしい。
visualstudioもよく使ってたし昔はeclipse使ってたからその方がわかりやすい。
初心者にもその方がわかりやすいと思う。
まあリアルタイムはいろいろコンパイラの改造が必要だろうから無理だとして、
エラーダイアログが出て閉じたらエラー行に赤線引かれてるとかなら作れそう。
エラー文はステータスバーに表示して。
・モジュール型変数について
getterとsetterとは違うけど
ドット演算子でもアロー演算子でもいいから参照できるようにしてほしい。



Y_repeat

リンク

2020/8/31(Mon) 20:28:15|NO.91301

企画を盛り上げて頂いてありがとうございます
→kanamaru様

ちょっと連動してますが
前にも書き込みしたこともありますが

モジュール変数のアクセサとか欲しいっすね
getter/setter書いてテストするのめんどくさいかんじします

それかモジュール変数のpublic指定もいいっすね



Velgail

リンク

2020/9/4(Fri) 00:59:53|NO.91308

モジュール変数内のメンバ変数アクセスに、
HSP3時代で非推奨な[.]での配列アクセスを潰してでも実装するべきかと。
(a(10)とa.10が同じことを表すのは知らないとビックリしますよね。HSP2時代の記法らしい?)

モジュール変数として、外部からアクセスできるかどうかの定義は

案:

#module testClass global a, global b, local c, global d, e, ...
明確ですが、globalとlocalの指定句を追加するというもの。未指定はlocal(既存配慮)

この場合

newmod testInstance, testClass testInstance.a=10//(OK) testInstance.c="hoge"//(NG) newmod testInstance.d, testClass //(OK) newmod testInstance.e, testClass //(NG)
といった形で使えることを想定しています。



Y_repeat

リンク

2020/9/4(Fri) 18:42:50|NO.91312

以前、newmodしたのの所属するモジュールがわからない
みたいな投稿があったぽいですが
所属するモジュールを教えてもらえる命令とかあれば便利そうっすね

HSPはポリモーフィズムもないですし
共通するユーザー定義命令とか実現出来ないですし

モジュール命令を呼び出して
あれば定義してあるので動いて
定義してなければエラー吐く

とか微妙にめんどくさくもあります

→Velgail様
企画を盛り上げていただいてありがとうございます

自分は配列にドット使ってるんで交換性なくさないで欲しいっすね
括弧で括る方が命令呼び出しっぽくてしっくりこないっす
普通に[]で括った方がいいと思いますね



Y_repeat

リンク

2020/9/4(Fri) 18:46:25|NO.91313

サンプルとしては不要なファイル読んでました


//////////////////////////////////////////////////////////// // prm_label モジュール //////////////////////////////////////////////////////////// #include "FILE_mod_prm_label_R0208.hsp" //////////////////////////////////////////////////////////// // src_one_commandモジュール //////////////////////////////////////////////////////////// #module src_one_command command_insn_no, command_label_no, command_insn_kind, command_insn, command_p_label, comand, command_label #deffunc set_max_command int _p max_command = _p return #defcfunc get_max_command return max_command #modcfunc get_command_insn_no return command_insn_no #modinit int p_no // そのコマンドのナンバー command_insn_no = p_no // ラベルのナンバー command_label_no = p_no + 1 // そのコマンドの種類 -1:未定義 1:insn 2:insn & p_label command_insn_kind = -1 // insnモジュールのオブジェクトを入れる。入ってない時は-1 command_insn = -1 // insnのp_labelモジュールのオブジェクトを入れる。入ってない時は-1 command_p_label = -1 // labelモジュールのオブジェクトを入れる。入ってない時は-1 command_label = -1 // どう記述すればいいかわかんなくなったw // if p_no <= max_command{ // make_tmp_one_command( thismod ) // } return //////////////////////////////////////////////////////////// // mod_prm_labelの委譲 //////////////////////////////////////////////////////////// #modfunc new_prm_label newmod command_p_label , mod_prm_label command_p_label_kind = 0 return #modfunc set_mem_prm_lab_kind int _p set_mem_prm_lab_kind_mod command_p_label , _p return #modcfunc get_mem_prm_lab_kind_name return get_mem_prm_lab_kind_name_mod(command_p_label) #modcfunc get_mem_prm_lab_kind return get_mem_prm_lab_kind_mod(command_p_label) #modfunc set_mem_prm_lab_id int _p set_mem_prm_lab_id_mod command_p_label, _p return #modcfunc get_mem_prm_lab_id return get_mem_prm_lab_id_mod(command_p_label) #modfunc set_mem_prm_lab str _p set_mem_prm_lab_mod command_p_label, _p tmp_int=strlen(_p) set_mem_prm_lab_length_mod command_p_label,tmp_int return #modcfunc get_mem_prm_lab get_mem_prm_lab_mod(command_p_label) return #modcfunc get_mem_prm_lab_length return get_mem_prm_lab_length_mod(command_p_label) #modfunc dump_p_label logmes "no : " + command_insn_no if vartype(command_p_label) == 5{ logmes " kind : "+ get_mem_prm_lab_kind(thismod) + " : " + get_mem_prm_lab_kind_name(thismod);get_mem_prm_lab_kind_name_mod(thismod) logmes " id : " + get_mem_prm_lab_id(thismod) logmes " val : " + get_mem_prm_lab(thismod) logmes " length : " + get_mem_prm_lab_length(thismod) }else{ logmes " kind : null" logmes " id : null" logmes " val : null" logmes " length : null" } return #global //////////////////////////////////////////////////////////// // debug p label //////////////////////////////////////////////////////////// #if 1 newmod prg_code_undef_label , src_one_command , 0 dump_p_label prg_code_undef_label newmod prg_code_void_prm , src_one_command , 2 new_prm_label prg_code_void_prm set_mem_prm_lab_kind prg_code_void_prm , 0 dump_p_label prg_code_void_prm newmod prg_code_jump_prm , src_one_command , 4 new_prm_label prg_code_jump_prm set_mem_prm_lab_kind prg_code_jump_prm , 4 set_mem_prm_lab prg_code_jump_prm,"stst" dump_p_label prg_code_jump_prm repeat 10 newmod prg_codes , src_one_command , cnt*2+10 loop dump_p_label prg_codes.0 new_prm_label prg_codes.1 dump_p_label prg_codes.1 new_prm_label prg_codes.2 set_mem_prm_lab_kind prg_codes.2,0 dump_p_label prg_codes.2 new_prm_label prg_codes.3 set_mem_prm_lab_kind prg_codes.3, 4 set_mem_prm_lab prg_codes.3, "nnn" dump_p_label prg_codes.3 #endif



Y_repeat

リンク

2020/9/4(Fri) 18:50:57|NO.91314

せっかくデバッグしていただいたので、サンプルとして載せておきます

FILE_mod_prm_label_R0208.hsp


//////////////////////////////////////////////////////////// // prm_label モジュール //////////////////////////////////////////////////////////// #module mod_prm_label mem_prm_lab_kind, mem_prm_lab_id, mem_prm_lab, mem_prm_lab_length // #module src_one_insn の委譲。メモリ消費多そうなので別にした #modinit // 引数labelのID(種類)(int) // undef -1 void 0 mark 1 call 2 call_ret 3 jump 4 jump_zero 5 jump_not_zero 6 return 7 mem_prm_lab_kind = -1 // prmラベルのID(配列っぽくラベルを管理していて、そこのID) mem_prm_lab_id = -1 // 普通のラベル形式の引数(setする時、文字数多く確保)(str) sdim mem_prm_lab , 2 mem_prm_lab="" // 普通のラベル形式の引数の長さ。 // 検索時長さを比較してから文字列を比較することで速度アップ mem_prm_lab_length = 0 return #modfunc set_mem_prm_lab_kind_mod int __p mem_prm_lab_kind = __p return #modcfunc get_mem_prm_lab_kind_name_mod if mem_prm_lab_kind == -1 : return "undef" if mem_prm_lab_kind == 0 : return "void" if mem_prm_lab_kind == 1 : return "mark" if mem_prm_lab_kind == 2 : return "call" if mem_prm_lab_kind == 3 : return "call_ret" if mem_prm_lab_kind == 4 : return "jump" if mem_prm_lab_kind == 5 : return "jump_zero" if mem_prm_lab_kind == 6 : return "jump_not_zero" if mem_prm_lab_kind == 7 : return "return" return "other" #modcfunc get_mem_prm_lab_kind_mod return mem_prm_lab_kind #modcfunc get_mem_prm_lab_kind_obj return mem_prm_lab_kind #modfunc set_mem_prm_lab_id_mod int __p mem_prm_lab_id = __p return #modcfunc get_mem_prm_lab_id_mod return mem_prm_lab_id #modfunc set_mem_prm_lab_mod str __p mem_prm_lab = __p return #modfunc get_mem_prm_lab_mod return mem_prm_lab #modfunc set_mem_prm_lab_length_mod int __p mem_prm_lab_length = __p return #modcfunc get_mem_prm_lab_length_mod return mem_prm_lab_length #modfunc dump_prm_lab logmes "kind : " + mem_prm_lab_kind+ " : " + get_mem_prm_lab_kind_name_mod(thismod) logmes "id : " + mem_prm_lab_id logmes "val : " + mem_prm_lab logmes "length : " + mem_prm_lab_length return #global



Velgail

リンク

2020/9/4(Fri) 19:29:54|NO.91315

> 括弧で括る方が命令呼び出しっぽくてしっくりこないっす
Visual Basic民としてみると全く気にしてなかったところですね。

逆に添え字の引き方だからこそ
a(5)=10
b=5
mes a.b // 10
みたいな挙動は頭抱えたいというのがこちらの考えです(同意を求めているわけではないですが……)



Y_repeat

リンク

2020/9/4(Fri) 20:34:23|NO.91317

配列がドットなのは目新しくて好感持った記憶がありますね

ドットは色々意味付けがあって、配列がドットなのは
廃止されても仕方がない気はしますが

廃止されるにしても
例えばHSP4からとかにして欲しいっすね
出るんでしょうかねHSP4w



Y_repeat

リンク

2020/9/11(Fri) 05:31:26|NO.91338


#module m4test mem #modinit mem = 1 return // なんかしないとモジュールが削除されるかもなので #deffunc tmp mes "tmp" return #global tmp // error起こるかな newmod obj,m4tes
objの属するモジュールの指定が間違っている
errorは「Error35 モジュール変数が指定されていません」
わかりにくいので、もう少しわかりやすいerror情報にならないかな



Y_repeat

リンク

2020/9/11(Fri) 05:44:53|NO.91339


#module m4test mem #modinit mem = 1 return #modfunc hoge mes mem return #modcfunc piyo mes "a" return 1 #modcfunc piyopiyo mes "A" return // なんかしないとモジュールが削除されるかもなので #deffunc tmp mes "tmp" return #global tmp newmod obj,m4test // error起こるかな // hog obj // error 2 : 文法が間違っています // モジュール命令の名前が間違っています // 文法間違いと端的に明示されても分かりにくいと思います // hoge ob // error 36 : モジュール変数の指定が無効です // モジュール変数じゃなくオブジェクトが間違っています // 無効とかじゃなく、存在しないオブジェクトを指定してます。とかならいいのに hoge(obj) // 命令形式の書式っぽいのを関数形式で呼び出したのですがerrorにならないっすね // piyo obj // error 2 : 文法が間違っています // 「関数形式を要求するところを命令形式で記述してます」とかの方がいいのに // 文法ミスっちゃ文法ミスですが // piyopiyo(obj) // error 2 : 文法が間違っています // 「関数の中で値を返していません」とかの方がいいのに // 文法ミスっちゃ文法ミスですが
と、簡単なエラーを起こしてみました
モジュール命令関連のわかりにくさの一つに
エラーメッセージが端的すぎるというのがあるので
もっと分かりやすいエラーメッセージだといいのになあ。という書き込みでした



Y_repeat

リンク

2020/9/11(Fri) 05:49:22|NO.91340

Velgailさんの書き込みとも連動するのですが
public属性とかを記述するならなおさらで
モジュール変数に関する記述は
1行にしなきゃいけないのは辛いっす
最近モジュール変数がいっぱいあるデータを二つのモジュールに分割したのですが
それもわかりにくいですよね
複数行でも良くなればいいなあ。なんて

後、データを引数とかで渡すにしても一個一個渡していくのもめんどうなので
モジュールのオブジェクト(塊)を渡せたらいいなあ。なんて思ってます



Y_repeat

リンク

2020/12/14(Mon) 22:13:14|NO.91925

こんばんわ。ここのスレッドではお久しぶりでございます
自分は今回のプロコン向け作品が未完成で
資料として投稿いたしまして
そこよりテンプレートもどきの引用でございます


///////////////////////////////////////////////////////////// // // HSPモジュール機能。テンプレートもどき // ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // #deffunc/#defcfunc の覚え書き ///////////////////////////////////////////////////////////// #deffunc/#defcfunc スペース モジュール命令名 スペース 型 スペース 引数A "," 型 スペース 引数B・・・ 関数/命令名と引数Aの型の区切りはスペース 引数Aの型と引数Aの名前の区切りもスペース 引数Aの名前と引数Bの型の区切りは "," 型の種類 int、整数値(値渡し) str、文字列(値渡し) double、実数(値渡し) var、変数(参照渡し) array、配列(参照渡し) label、ラベル local、ローカル変数 関数は値を渡す変数に代入していないとエラー 関数の引数は()で括っていないとエラー ///////////////////////////////////////////////////////////// // モジュール/モジュール変数の覚え書き ///////////////////////////////////////////////////////////// トークンの区切りはスペースと "," があるのでややこしい ///////////////////////////////////////////////////////////// // "#module" ///////////////////////////////////////////////////////////// "#module" スペース モジュール名 スペース モジュール変数 "," モジュール変数・・・ 例 #module m a,b,c・・・ モジュール名と第一変数の区切りはスペースだが 第一変数と第二変数の区切りは "," ///////////////////////////////////////////////////////////// // "#modinit" ///////////////////////////////////////////////////////////// モジュールのコンストラクタは "#modinit"命令 "#modinit" スペース 型 スペース 引数A "," 型 スペース 引数B・・・ #modinit int l,int n,int m・・・ 命令の名前は不要 "#modinit"と引数Aの型の区切りはスペース 引数Aの型と引数Aの名前の区切りもスペース 引数Aの名前と引数Bの型の区切りは "," ///////////////////////////////////////////////////////////// // "#modfunc" ///////////////////////////////////////////////////////////// モジュール命令の定義は "#modfunc"命令 "#modfunc" スペース モジュール命令名 スペース 型 スペース 引数A "," 型 スペース 引数B・・・ 例 #modfunc mf int l,int n,int m・・・ モジュール命令名と引数Aの型の区切りはスペース 引数Aの型と引数Aの名前の区切りもスペース 引数Aの名前と引数Bの型の区切りは "," "#modcfunc" "#modcfunc" スペース モジュール命令名 スペース 型 スペース 引数A "," 型 スペース 引数B・・・ 例 #modcfunc mf int l,int n,int m・・・ モジュール命令名と引数Aの型の区切りはスペース 引数Aの型と引数Aの名前の区切りもスペース 引数Aの名前と引数Bの型の区切りは "," ///////////////////////////////////////////////////////////// // "newmod"命令 ///////////////////////////////////////////////////////////// オブジェクトの作成は"newmod"命令 "newmod" スペース オブジェクト名 "," モジュール名 "," 引数A "," 引数B・・・ 例 newmod o,m,1,2,3・・・ オブジェクトを"newmod"命令で作成しないとモジュール命令は使用できない "newmod" と オブジェクト名 の区切りはスペース オブジェクト名と モジュール名 の区切りは "," ///////////////////////////////////////////////////////////// // "newmod" モジュール変数版 ///////////////////////////////////////////////////////////// newmodで作成するオブジェクトをモジュール変数とすることで委譲が出来る "newmod" スペース モジュール変数 "," 委譲のモジュール名 "," 引数A "," 引数B・・・ 例 newmod mem_obj_m_somet,one_something ///////////////////////////////////////////////////////////// // モジュール命令の使用 ///////////////////////////////////////////////////////////// モジュール命令 スペース オブジェクト名 "," 引数A "," 引数B・・・ 例 mf o,1,2,3・・・ モジュール命令 と オブジェクト名 の 区切りは スペース オブジェクト名 と 引数 の 区切りは スペース ///////////////////////////////////////////////////////////// // モジュール関数の使用 ///////////////////////////////////////////////////////////// モジュール命令 "(" オブジェクト名 "," 引数A "," 引数B・・・")" 例 mf(o,1,2,3・・・) モジュール命令 と オブジェクト名 の 区切りは "(" オブジェクト名 と 引数 の 区切りは スペース 最後の 区切りは ")" ///////////////////////////////////////////////////////////// // local キーワード ///////////////////////////////////////////////////////////// #modfuncとか local 命令名 例 #modfunc local hoge ///////////////////////////////////////////////////////////// // "thismod" キーワード ///////////////////////////////////////////////////////////// "thismod"キーワードは"#modfunc"の中で 同じモジュール内のモジュール命令を呼び出したい時に オブジェクト名を指定するかわりに指定する モジュール外から mf o,1,2,3・・・ モジュール内から mf thismod,1,2,3・・・ ///////////////////////////////////////////////////////////// // インスタンスの配列化 ///////////////////////////////////////////////////////////// オブジェクトの作成は"newmod"命令 "newmod" スペース オブジェクト名 "," モジュール名 "," 引数A "," 引数B・・・ を複数回実行する 例 newmod Player,player_chara_status newmod Player,player_chara_status ///////////////////////////////////////////////////////////// // 配列化したモジュール変数の使用 ///////////////////////////////////////////////////////////// #modfunc で定義した命令 命令 スペース オブジェクト ドット 配列の添え字 コンマ 引数 の繰り返し 省略しても良い 例 set_mem_ID_many_somet obj_common.tmp_i, 100 #modcfunc で定義した命令 命令 括弧 オブジェクト ドット 配列の添え字 コンマ 引数 の繰り返し省略しても良い 括弧閉じ 例 get_mem_ID_many_somet(obj_common.tmp_i) 配列をドットで記述しているが括弧で記述してもいい気もする 興味のある方は試してみてください ///////////////////////////////////////////////////////////// // "newmod" モジュール変数版 配列化 ///////////////////////////////////////////////////////////// newmodで作成するオブジェクトをモジュール変数とすることで委譲が出来る newmodを複数回使用すると配列化出来る "newmod" スペース モジュール変数 "," 委譲のモジュール名 "," 引数A "," 引数B・・・ 例 repeat MAX_OBJ newmod mem_obj_m_somet,one_something loop ///////////////////////////////////////////////////////////// // モジュール変数 アクセサ ///////////////////////////////////////////////////////////// setter の例 #modfunc set_mem_ID_data int __p mem_ID_data = __p return getter の例 #modcfunc get_mem_ID_data return mem_ID_data ///////////////////////////////////////////////////////////// // モジュール変数 アクセサ インデックス使用 モジュール命令 ///////////////////////////////////////////////////////////// 一つ一つsetterとgetterを書くのがめんどくさくなって まとめて書いたサンプルです 例 // #moduleとモジュール変数は一行で記述して下さい #module wep_class_kaisuu mem_ID_wep, mem_chara_name_wep, wep_kaisuu_nokori, wep_Fire, wep_Fire_cur, wep_Wind, wep_Wind_cur, wep_Thunder, wep_Thunder_cur, wep_Light, wep_light_cur #enum WEP_KIND_FIRE = 1 #enum WEP_KIND_WIND = 2 #enum WEP_KIND_THUNDER = 3 #enum WEP_KIND_LIGHT = 4 // 略 #modfunc set_wep_kaisuu int __p, int __p_val logmes "set wep kaisuu : " + mem_ID_wep if __p == WEP_KIND_FIRE{ wep_Fire = __p_val : wep_Fire_cur = __p_val return } if __p == WEP_KIND_WIND{ wep_Wind = __p_val : wep_Wind_cur = __p_val return } if __p == WEP_KIND_THUNDER{ wep_Thunder = __p_val : wep_Thunder_cur = __p_val return } if __p == WEP_KIND_LIGHT{ wep_Light = __p_val : wep_Light_cur = __p_val return } dialog "error:wep_class_kaisuu:set_wep_kaisuu:__p " + __p,1 return #modcfunc get_wep_kaisuu int __p logmes "wep wep kaisuu : " + mem_ID_wep if __p == WEP_KIND_FIRE{ return wep_Fire } if __p == WEP_KIND_WIND{ return wep_Wind } if __p == WEP_KIND_THUNDER{ return wep_Thunder } if __p == WEP_KIND_LIGHT{ return wep_Light } dialog "error:wep_class_kaisuu:get_wep_kaisuu:__p " + __p,1 return // 略 #global // 略 ///////////////////////////////////////////////////////////// // 呼び出し例 // インストラクタの例 newmod player_wep,wep_class_kaisuu // setter使用例 set_wep_kaisuu player_wep.0,1,100 // getter使用例 get_wep_kaisuu(player_wep.0,1) ///////////////////////////////////////////////////////////// // モジュール変数 アクセサ 委譲 ///////////////////////////////////////////////////////////// setter の例 #modfunc スペース アクセサ命令の名前 スペース int インデックス コンマ 型 代入したい値 コンマ 型 引数 の繰り返し省略可 改行 委譲元の命令 スペース モジュール変数 ドット 配列の添え字 ドット インデックス コンマ 代入したい値 コンマ 引数 の繰り返し省略可 改行 return #modfunc set_mem_ID_somet int __p_index,int __p set_mem_ID_somet_mod mem_obj_m_somet.__p_index,__p return getter の例 #modfunc スペース アクセサ命令の名前 スペース int インデックス コンマ 型 引数 の繰り返し省略可 改行 return 委譲元の命令 括弧 モジュール変数 ドット 配列の添え字 コンマ 引数 の繰り返し 括弧閉じ 改行 #modcfunc get_mem_ID_somet int __p_index return get_mem_ID_somet_mod(mem_obj_m_somet.__p_index) 作成したモジュールの委譲がindex付きで操作しているが indexなしのアクセサ版を作成したければ 試行錯誤してみれば動くと思われる



Y_repeat

リンク

2020/12/14(Mon) 22:21:19|NO.91926

こんばんわ

自分はモジュール変数を一行に書かなければ辛いという意見を書きましたが
モジュール変数を委譲の配列として使用すれば
かなり定義できますな

これは毎回作成しなければならないのではなく
一回作成すれば使い回せるかんじです
あんまり直感的な操作ではないので
途中でよくわからなくなってくるのもありますが

あんまり大量のデータを格納してしますと
確認が大変なのでほどほどに

モジュール変数をどのように作成したり格納したりするかは
やってると微妙に納得いかない感が出てきて
リファクタリングのアジャイルですね
上手いこと実装出来なくて前に進まなくなってきますw



Y_repeat

リンク

2020/12/14(Mon) 22:28:00|NO.91927

こんばんわ

自分、モジュール変数を利用してて
3回くらい同じミスしたんですけど

例えば
モジュールAとモジュールBがあって
モジュールAをobj_Aとしてnewmodして
モジュールBをobj_Bとしてnewmodしたとします

で、モジュールAにはfuncAがあり
モジュールBにはfuncBがあるとします

で、コピペして、修正漏れがあり
funcBをobj_Aで呼び出してもエラーにならなかったです
funcA obj_A
funcB obj_A(コピペしたのにBと修正してない)
みたいな記述で

再現スクリプト必要っすかね?



Y_repeat

リンク

2020/12/14(Mon) 22:33:09|NO.91928

こんばんわ

自分は最近、Pythonの勉強中でございます

で、Pythonは特にメンバの記述をしなくても
メンバを代入したり、メンバの値を取得出来るっぽいです

で、HSPは#moduleの行にモジュール変数書いて
newmodで初期値入れて
setterとgetter書いてやっと使えますよね
確認用にdump命令みたいのかかなきゃいけないですし

なんかあんまりHSPの思想と合ってないような
めんどくさい操作しなくても代入したり取得したり確認出来たり
する方がHSPらしい気がしました



youdai

リンク

2020/12/15(Tue) 15:23:37|NO.91931

配列変数トークンとして.を廃止するのは、自分は強く反対します。
自分は.派なのですが、その理由は関数トークンとしての()と使い分けているからです。
使い分けた方がスクリプトとして視認しやすいと個人的には思います。
また、HSP3の方針として様々な書き方があった方が初心者や、
様々な言語から移ってくる移住者にとってはとっつきやすいと思います。
厳密にすればいいというものではないと思います。



PPP

リンク

2020/12/15(Tue) 16:55:54|NO.91932

自分は逆ですね。
配列に"."なんて不要、取っ付き易さで言うなら逆効果。
そこを重視するのであれば配列は[]に関数タイプには()にとでもしてくれた方がいい。



Y_repeat

リンク

2020/12/15(Tue) 21:29:35|NO.91935

こんばんは

→youdai様
→PPP様

企画を盛り上げていただいてありがとうございます
見事に意見割れてますね
HSPの宗教戦争なんですかねえ
HSP4が出れば統一されるかもしれないしされないかもしれませんね
逆に見事に解決していただけることも期待したり



Y_repeat

リンク

2020/12/15(Tue) 21:37:35|NO.91936

こんばんわ

ちょっとHSP3って後方交換取っててすごいなあ
と思ったんです

でも、もうHSPTV!プログラムは動かないっぽいですね

HSPTV!プログラムは
小型の作品を対象としたランタイムなので
プログラム初心者にとってとっつきやすかったと思います

自分もコンテスト投稿はHSPTV!部門からです
そして、現在も行数の多いプログラムは完成しませんねw

なので
HSPTV!プログラムの後継のランタイムも
需要はあるのではないでしょうか
HSPTV!よりサイズの上限が大きかったり
名前をつけて保存ダイアログによる
SAVE/LOADもあるといいなあ

って言って、自分は、さすがにHSPTV!プログラム向けの
小型ゲームはネタ切れっぽかったり



youdai

リンク

2020/12/16(Wed) 14:29:06|NO.91937

>そこを重視するのであれば配列は[]に関数タイプには()にとでもしてくれた方がいい。
配列変数に[]が使えた方が良いというのは自分も同感です。
ただ、.を使用してきたユーザーからすると廃止してしまうのは絶対に反対です。
ソースを全部書き直さないといけませんから・・・



Velgail

リンク

2020/12/16(Wed) 21:38:05|NO.91938

>ソースを全部書き直さないといけませんから・・・
Python2とPython3みたいに書き直しを強要するのも選択肢ですよ。

私はオブジェクト指向が入ったHSP4(仮称)という新言語になったときに、
HSP2のレガシーを引きずることは反対ですね。(スレの目的に対応してという意味)
最大限許容してa.5のような整数型即値とa.(b)のような明確な表記のみで
a.bのような表記は駄目(というかオブジェクト指向用に明確に譲ってもらう)と考えてます。
(ちなみにa.(b)はHSP2でも許容されてると思います(知らんけど))

パーサーは面倒ですけどa.(b)型ならまあ解釈上オブジェクト指向とぶつからないだろうという想定です。
//もう.を省略すればいいじゃないかと思うのは野暮かな。



youdai

リンク

2020/12/16(Wed) 22:24:06|NO.91939

>Python2とPython3みたいに書き直しを強要するのも選択肢ですよ。
もう少し広い視野に立って考えてみて下さい。
.を配列型変数トークンとして廃止するというのは、
それまで使えていた.を使用していた全てのモジュールが非対応になるということです。
古くても有用なモジュールというのはたくさんあります。
それを.派のモジュール作者に対して対応しろというのは酷です。少なくとも自分はそうです。
修正は単にHSP3スクリプトだけではなく、配布しているモジュール取説の.hsや
リファレンスやホームページの記述にまで及びます。これは膨大な作業です。
今まで.を使っていたユーザーを切り捨てるような廃止は危険だと思います。
HSP3はすでにオブジェクト指向なので、発言の趣旨としてはおそらく、
よりポリモーフィックなオブジェクト指向へという意味だと解釈しましたが、
それでも.を廃止しなければならない理由にはならないと思います。
新要素の追加は.以外の記号でも問題ないはずです。



PPP

リンク

2020/12/16(Wed) 23:56:10|NO.91941

>非対応云々
マシン語のオンパレードでもない限り非対応になるわけではないでしょう。
修正する手間が増えるだけです。
そこまで有用と思えるものがあるなら自分で手直し、何なら改良するまであってもいいのでは?
動かなくなるなら同機能のものを作るだけです。

そもそもモジュールやプラグインのダウンロードサイト・HSP初学者の為のサイトが悉く沈んでいる現状新しい事をするなら
今のうちではとも思いますけどね。

鼻息を荒げて意見が通るなら自分はwinメインなのでいくらでも自分でどうとでもできる"."の扱いより
内部処理はUTF16にしてUTF8でもソースが書けます。みたいにしてほしいですね(要望スレだっけ?)。



Velgail

リンク

2020/12/17(Thu) 01:43:50|NO.91942

> 古くても有用なモジュールというのはたくさんあります。
> これは膨大な作業です。

Python2 / Python3の変革時代から見れば「だから何」で終わりますね。どのくらい激動だったかは利用者目線でも書かれてますよ。
https://qiita.com/cstoku/items/353fd4b0fd9ed17dc152

公式系ヘッダの中で.を利用しているコードは
a2d.hsp 2件/877行
hgimg3.as 8件/572行
mod_hs.as 9件/349行
mod_joystick.as 8件/75行
mod_joystick2.as 8件/107行
mod_rss.as 2件/70行
mod_sprite.as 26件/112行
obj.as 8件/154行
以上です。(調べてみました)

上の記事で思いだしましたが、オブジェクト指向化で一番変えるべきなのは
「命令」と「関数」が分かれていることを関数に統合することじゃないかと。
ドットなんて霞むほど大規模改変ですよこれ↓。

screen(0) pos(100,100) color(128,0,0) mes("Hello World")



Y_repeat

リンク

2020/12/18(Fri) 22:44:09|NO.91947

こんばんわ

>youdai様
>Velgail様
>PPP様
企画を盛り上げていただいてありがとうごいざます
どうぞよろしくお願いします

自分も配列はドット派ですね
なんでオブジェクト機能の議論に配列の記法が出てくるのか
謎でしたが
オブジェクト指向の記法にドットが出てくるからかあ。なんて

配列をドットじゃなくするのは
配列にドットを使用しているとこを
エラー出してくるれるならいいかな?ってとこです
機械的に修正していってOKならいいのかな

でも大きいスクリプトとかデバッグするのが大変な人も
いるかもしれませんね

仮にHSP4で配列の記法としてドットを廃止するとして
でもHSP3はしばらく配布していそうですね
2.61も今でも配布してますし

Rubyと違って
HSPはゲームとかはexeで完結してるので
古いHSPでもexeにしちゃえば普通に実行出来る訳です
例えば今HSP3をVC2019でコンパイルしてしまえば
VC2019が10年くらい動くと
10年くらいは動作する訳です
10年以上経過して後方交換が取れないとか文句言っても
やりすぎな気もしますね

HSPTV!プログラムもHSP3の古いのなら動くのかな
とちょっと思いました

HSPTV!プログラムも最新のでは動かないですし
HSPLetも動かないですし
おちゃっこ様の3Dのも動かないっぽいですし
環境を全部切り捨てていないかと問えば否だったり

作者様が今後はHSP3のように一気には変更しないって
発言を読んだことはあるような

オブジェクト指向的に言えば
オブジェクトを第一引数にする使用は直感的ではなく
そっちもわかり易くして欲しいです
Pythonもメソッドの第一引数はselfという慣習もありますが
それともまた違うややこしさではありますが

なんかPythonの話がちょいちょい出て来ますが
Pythonも微妙にBASICの流れの言語なので
Pythonの機能とかも取り込んで欲しいっすね

>関数/命令
関数で統一と言えばPythonも括弧記法の割合多くなったっぽいっすが
Rubyのように特に曖昧すぎなければ、どっちでも良い
って方がいいかもですね
命令によって関数記法、命令記法って定義されていますが
どっちでも良くていいものも多い気もします
自分がHSP初心者の頃、関数記法が導入されて
ちょっと異議を唱えたら怒られた過去がありますw

>(要望スレだっけ?)。
別にここに書いてもいいですし
他にスレ建てて書いてもいいでしょうし
HSP3.6β3テストのお願いに書いてもいいでしょうし
要望を書くことは否定しないスレッドだとは思ってます

それでは長文失礼しました



ONION software Copyright 1997-2023(c) All rights reserved.