如何将GNU dc的垂直栈显示改为类似GNU FORTH的水平显示?
实现GNU DC栈的水平显示(类似FORTH的
.s命令) 好问题!GNU DC 默认通过f命令垂直输出栈内容,但它的宏定义能力让我们可以轻松实现类似FORTH .s的水平显示效果——毕竟DC和FORTH同属栈式语言,自定义扩展是核心特性之一。
方法:自定义水平显示宏
GNU DC没有内置的水平栈显示命令,但我们可以编写一个宏来完成这个需求,同时保留原栈内容不变。下面是一个实用的实现:
- 首先在DC中定义宏
S(你也可以换成其他喜欢的名称):
[z n d 0 > [sa 1 -] while n d 0 > [la p " " p 1 -] while drop] Sx
- 宏的工作原理拆解:
z:获取当前栈的深度,存入寄存器n- 第一个循环:将栈中所有元素依次存入寄存器
a,临时保存原栈内容 - 第二个循环:从寄存器
a中取出元素,逐个打印并添加空格分隔,同时将元素放回原栈 drop:清理栈中剩余的深度计数
测试用法
比如我们压入几个值到栈:
1 2 3 4
输入S就会得到水平输出:
1 2 3 4
(末尾的小空格不影响使用,如果你想完美去掉,可以微调宏的逻辑,比如判断最后一个元素时不打印空格)
如果你习惯FORTH的<深度> 元素1 元素2 ...格式,也可以修改宏,在开头打印栈深度:
[z "<" p p ">" p " " n d 0 > [sa 1 -] while d 0 > [la p " " p 1 -] while drop] Sx
这样输入S会显示:
<4> 1 2 3 4
注意事项
- 这个宏依赖GNU DC的寄存器功能(
sa/la命令),这是GNU版本的特性,其他DC实现可能不支持 - 定义宏后,只要不退出DC,
S命令就可以重复使用;如果想永久生效,可以把宏写入~/.dccinit配置文件,每次启动DC时自动加载
内容的提问来源于stack exchange,提问作者Evan Carroll
相关产品推荐
相关产品推荐

