2008年7月27日日曜日

gotoを使用したサブルーチン

最近、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

0 件のコメント: