More ... | HSPでもポリモーフィズムがしたい正確にはHSPにはポリモーフィズムの機能はありません。 しかしJAVAの本とか読んでいると。 バリバリ、ポリモーフィズムを使っています。羨ましいですね。 ここではHSPの機能の範囲内で。 ポリモーフィズムに近いことをやってみたいと思います。 案1、モジュール名で区別する。HSPでは命令/関数にはモジュール名を書かなくても機能します。 しかしマクロはモジュール名で区別できます。 goto *@f #deffunc logmes_str str p_s logmes p_s return #deffunc logmes_int int p_i logmes str(p_i) return *@ #module str_ #define logmes_si(%1)logmes_str %1 #global #module int_ #define logmes_si(%1)logmes_int %1 #global logmes_str "abc" logmes_int 123 logmes_si@str_ "def" logmes_si@int_ 456 stop
案2、引数で区別する@で区切ってもいまいちポリモーフィズムって感じがしません。 次は命令/関数を第一引数で区別してみます。 goto *@f #deffunc logmes_str str p_s logmes p_s return #deffunc logmes_int int p_i logmes str(p_i) return *@ #enum null=0 #enum str_ #enum int_ #define logmes_si(%1,%2):\ if %1==str_{logmes_str %2}else{if %1==int_{logmes_int %2}else{logmes "ERROR:"+str(__LINE__)+"行目"}} logmes_str "abc" logmes_int 123 logmes_si str_,"def" logmes_si int_,456 logmes_si 3,"def" stop
案3、グローバル変数を使う先ほどのスクリプトでは第一引数で区別しましたが、 今度は、グローバル変数を用いてその変数で区別してみたいと思います。 goto *@f #deffunc logmes_str str p_s logmes p_s return #deffunc logmes_int int p_i logmes str(p_i) return *@ 型=0 #enum null=0 #enum str_ #enum int_ #define logmes_si(%1):\ if 型==str_{logmes_str %1}else{if 型==int_{logmes_int %1}else{logmes "ERROR:"+str(__LINE__)+"行目"}} logmes_str "abc" logmes_int 123 型=str_ logmes_si "def" 型=int_ logmes_si 456 型=3 logmes_si "def" stop 案4モジュール変数を使ういきなり作りたいモジュールを作るのではなく、作りたいモジュールを作成するtypeと命令呼び出しを持つモジュールを作ってみました。 #module cat name #modinit str s name = s return #modfunc bow_cat mes name+"はニャーと鳴いた" return #global #module dog name #modinit str s name = s return #modfunc bow_dog mes name+"はワンと鳴いた" return #global #module type_animal #enum null=0 #enum cat #enum dog #global #module main type,animal #modinit int p_type,str name type=p_type if type==cat@type_animal:newmod animal,cat,name if type==dog@type_animal:newmod animal,dog,name return #modfunc bow if type==cat@type_animal:bow_cat animal if type==dog@type_animal:bow_dog animal return #global newmod mdl_a,main,cat@type_animal,"ミケ" newmod mdl_b,main,dog@type_animal,"タロー" newmod mdl_c,main,cat@type_animal,"シロ" newmod mdl_d,main,dog@type_animal,"ジロー" bow mdl_a bow mdl_b bow mdl_c bow mdl_d stop 案5、テンポラリ変数に代入してタイプ分けをする; ポリモーフィズムを使ったログ出力汎用命令plog(Polymorphism_logmes) #module Polymorphism ; ユーザー呼び出しインターフェース #define global plog(%1) tmp@Polymorphism=(%1) %c Polymorphism_logmes_param tmp@Polymorphism ; ポリモーフィズムの実体 #deffunc Polymorphism_logmes_int int n logmes ""+n return #deffunc Polymorphism_logmes_double double d logmes ""+d return #deffunc Polymorphism_logmes_str str s logmes s return ; パラメータ分岐用 #deffunc Polymorphism_logmes_param var v switch vartype(v) case 2: Polymorphism_logmes_str v: swbreak case 3: Polymorphism_logmes_double v: swbreak case 4: Polymorphism_logmes_int v: swbreak swend return #global plog 1 plog 1.4 plog "str" |