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"
|