最近、gotoにはまっていて
繰り返しをgotoによって行う。というmacroを作成したりしています
で、そんなことをしているうちに思った
HSPってサブルーチン呼び出し、命令呼び出し、関数呼び出し、信用ならない
いやいや。僕が仕様をよくわかってなくてerrorが起こるって話ですが
サブルーチンの中でgotoを使ったら
ネストの返り場所とか、そのまんまなんだろうか?
とか考えたら
自分で、gotoを使ったサブルーチン呼び出しを作ってみました
なんかcall命令のp2が冗長で、p2のラベルをユニークラベルにおきかえることは
今後の課題です
m_init
変数の初期化処理
call(p1,p2)
gosubのようにサブルーチンを呼び出します
p1:呼び出すサブルーチンのラベル
p2:帰ってくる時の目印
(なんでもいいです。ただし、衝突に注意)
back
call命令でジャンプした場所に戻る命令
FILE名:FILE_manage_label.hsp
#module manage_label *a stop #deffunc m_init now=-1 max=0 back_l=*a back_r=*a dim num,16 l_0=*a:l_1=*a:l_2=*a:l_3=*a:l_4=*a l_5=*a:l_6=*a:l_7=*a:l_8=*a:l_9=*a return #deffunc set_num int index,int m num.index=m if index>=10{ dialog "error ネストが深すぎます",1:stop } return #deffunc get_num int index if index<0{ dialog "error ネストが浅すぎます",1:stop }else{ now=num.index } return #deffunc set_lb int index if index==0:l_0=back_l if index==1:l_1=back_l if index==2:l_2=back_l if index==3:l_3=back_l if index==4:l_4=back_l if index==5:l_5=back_l if index==6:l_6=back_l if index==7:l_7=back_l if index==8:l_8=back_l if index==9:l_9=back_l if index>=10{ dialog "error ネストが深すぎます",1:stop } return #deffunc get_lb int index if index<0{ dialog "error ネストが浅すぎます",1:stop }else{ if index==0:back_r=l_0 if index==1:back_r=l_1 if index==2:back_r=l_2 if index==3:back_r=l_3 if index==4:back_r=l_4 if index==5:back_r=l_5 if index==6:back_r=l_6 if index==7:back_r=l_7 if index==8:back_r=l_8 if index==9:back_r=l_9 } return #deffunc set set_num max,now: set_lb max now=max: max++ return #deffunc back_of_st get_lb now get_num now max-- return #define global ctype call(%1,%2):\ back_l@manage_label=%2:set:goto %1:%2 #define global back:\ back_of_st:goto back_r@manage_label #global |