我正在尝试使用两个循环反转堆栈,第一个循环将数据堆栈中的项目发送到返回堆栈。另一个将它们从返回堆栈转移到数据堆栈。不幸的是,它不起作用& gforth 返回堆栈下溢错误。下面是代码:
: srev ( n n2 n3 n4 n5 -- n5 n4 n3 n2 n)
6 0 do >r loop
6 0 do r> loop ;
1 2 3 4 5 srev
Run Code Online (Sandbox Code Playgroud)
小智 5
这里遇到的麻烦是,DO ... LOOP将循环参数(索引和终止值)保留在返回堆栈上,并在循环结束时丢弃它们。这就是为什么>R和在循环期间R> 必须成对平衡的原因。
您的代码在循环期间将一个值放在返回堆栈上,然后该值在循环结束时被丢弃,留下一个杂散循环参数仍然存在,整个事情就会变得混乱。
你可以像这样得到你想要的结果......
: REVERSE ( i*x i -- i*y ) 0 DO I ROLL LOOP ;
Run Code Online (Sandbox Code Playgroud)
...虽然我有点困惑你为什么想要这样做!
编辑(阅读评论和 ruvim 的回复后):
无论如何,您最初的反转堆栈算法都不会起作用,因为一系列R>s 将顺序反转到返回堆栈上,并且相应的>Rs 再次将其反转回参数堆栈,保持原来的顺序。
替代方法,类似于 ruvim 的但没有递归,在这里
: APPLY ( n*x xt n -- n*x' )
DUP 1- -ROT ( n*x n-1 xt n )
0 DO ( n*x n-1 xt )
2>R \ park n-1 xt on return stack
2R@ DROP ROLL \ bring next item to top
2R@ NIP EXECUTE \ apply the function to it
2R> \ clear junk off return stack for now
LOOP ( n*x n-1 xt )
2DROP
;
Run Code Online (Sandbox Code Playgroud)
它不会ROLL与任何影响堆栈深度的东西一起工作(因为使用DROP或) DUP,但' 2* 4 APPLY工作得很好!
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |