forth - 使用循环反转数据堆栈
问题描述
我正在尝试使用两个循环来反转堆栈,一个循环将数据堆栈中的项目发送到返回堆栈。另一个是让它们从返回堆栈到数据堆栈。不幸的是,它不起作用 & 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
解决方案
您在这里遇到的麻烦是DO ... LOOP
将循环参数(索引和终止值)保留在返回堆栈上并在循环结束时丢弃它们。这就是为什么>R
并且R>
必须在循环期间保持平衡。
您的代码在循环期间将一个值放在返回堆栈上,然后在循环结束时将其丢弃,留下一个杂散循环参数仍然存在,整个事情变得混乱。
你可以像这样得到你想要的结果......
: REVERSE ( i*x i -- i*y ) 0 DO I ROLL LOOP ;
......虽然我有点不明白你为什么想要!
编辑(在阅读评论和 ruvim 的回复后):
无论如何,您最初的反转堆栈算法都不会起作用,因为一系列
R>
s 将顺序反转到返回堆栈,并且相应>R
的 s 再次将其反转回参数堆栈,使顺序保持原样。类似于 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
;
它不会(因为使用ROLL
)与任何影响堆栈深度的东西一起使用DROP
or DUP
,但' 2* 4 APPLY
工作得很好!
推荐阅读
- yaml - 通过 env 变量设置 Spring cloud Gateway 过滤器属性
- rider - 如何在 Rider IDE 中运行应用程序时关闭代码只读模式?
- android - 无法将文件上传到firebase存储android
- c++ - 如何在 C++ 中读取 .wav 文件的数据部分?
- r - R 中的网页抓取 | 无法使用rvest提取某个节点下的信息
- python-3.x - Tensorflow - model.fit 中的值错误 - 如何修复
- javascript - 如果对象存在,则将项目添加到对象,如果对象不存在,则创建新对象
- nuxt.js - 如何在 nuxtjs 中使用纯 JavaScript?
- tsql - T-SQL:从外部存储过程提交嵌套存储过程的操作
- python - 如何将“JpegImageFile”转换为字符串以便通过套接字发送