SysRPLで再帰処理を書くにはどうするのか、気になって居りました。
ここでは、再帰処理による階乗計算の例を示しておきます。
これをASM でコンパイルし、スタックに載っているSysRPLコードを「'facto' STO 」とやって保存すると使える様になります。CK2とか使っていないので、パラメタは決め打ちです。実数として明確にスタックに数を置き、引き続いてfacto と打ち込みます。
例えば、70の階乗を求めるには、「70. facto」とやってやります。70の後に少数点をつけて実数とするのです。
実は、局所変数に関数定義を束縛し、呼び出すという技法があります。
SysRPL Recursion Question - comp.sys.hp48
https://groups.google.com/forum/#!topic/comp.sys.hp48/JrtXN0bz1QU
上記ではAckermann functionの例が出ておりますが、こちらでは上と同じく階乗の例を示しておきます。
冒頭の「'」は、以降のプログラム節 (「::」と「;」で括られたもの) をQuoteする、というものです。これにより、
の部分を実行(評価)せずに、「そのまま」の状態でスタックに置く、というイメージです。続く「{ LAM facto } BIND」によって局所変数(シンボル)facto に束縛します。
更に「LAM facto EVAL」で、factoシンボルに束縛されたプログラム節をEVALにて評価する事で、実行します。
最後は「ABND」で、BINDで束縛した局所シンボルスコープを脱し、プログラムの終了という具合です。
ここでは、再帰処理による階乗計算の例を示しておきます。
!NO CODE
!RPL
::
{ LAM n } BIND
LAM n %0 %>
ITE
:: LAM n DUP %1 %- ID facto %* ;
:: %1 ;
ABND
;
@
これをASM でコンパイルし、スタックに載っているSysRPLコードを「'facto' STO 」とやって保存すると使える様になります。CK2とか使っていないので、パラメタは決め打ちです。実数として明確にスタックに数を置き、引き続いてfacto と打ち込みます。
例えば、70の階乗を求めるには、「70. facto」とやってやります。70の後に少数点をつけて実数とするのです。
実は、局所変数に関数定義を束縛し、呼び出すという技法があります。
SysRPL Recursion Question - comp.sys.hp48
https://groups.google.com/forum/#!topic/comp.sys.hp48/JrtXN0bz1QU
上記ではAckermann functionの例が出ておりますが、こちらでは上と同じく階乗の例を示しておきます。
!NO CODE
!RPL
::
'
::
{ LAM n } BIND
LAM n %0=
ITE
:: %1 ;
:: LAM n %1- LAM facto EVAL LAM n %* ;
ABND
;
{ LAM facto } BIND
LAM facto EVAL
ABND
;
@
冒頭の「'」は、以降のプログラム節 (「::」と「;」で括られたもの) をQuoteする、というものです。これにより、
::
{ LAM n } BIND
LAM n %0=
ITE
:: %1 ;
:: LAM n %1- LAM facto EVAL LAM n %* ;
ABND
;
の部分を実行(評価)せずに、「そのまま」の状態でスタックに置く、というイメージです。続く「{ LAM facto } BIND」によって局所変数(シンボル)facto に束縛します。
更に「LAM facto EVAL」で、factoシンボルに束縛されたプログラム節をEVALにて評価する事で、実行します。
最後は「ABND」で、BINDで束縛した局所シンボルスコープを脱し、プログラムの終了という具合です。