[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

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"