如何在Forth中检查单词是否传入足够参数?以浮点乘法单词为例
问题描述
我编写了一个用于计算两个浮点数乘积的Forth单词:
: fpmult { F: a F: b } cr ." Result: " a b f* f. ;
这个单词在以下场景运行正常:
- 浮点栈(fstack)已准备好两个浮点数
- 命令行直接传入两个浮点数
- 浮点栈存一个浮点数,命令行传入另一个的组合
示例运行:
1.3e ok 5.78e fpmult Result: 7.514 ok
但当浮点栈中缺少一个浮点数时,会触发**Floating-point stack underflow(浮点栈下溢)**错误:
5.78e fpmult :9: Floating-point stack underflow 5.78e >>>fpmult<<< Backtrace: $7F5CDB1367A0 f>l
想请教:如何在单词执行初期就检查变量a和b是否都存在?或者有没有更优的解决方法?
解决方法
1. 提前检查浮点栈深度
Forth提供fdepth单词返回当前浮点栈的元素数量,可在参数解析前先检查栈深度是否达标,不满足则抛出自定义错误:
: fpmult fdepth 2 < if ." Error: 需要两个浮点数" cr abort then { F: a F: b } cr ." Result: " a b f* f. ;
注意:必须把栈检查放在{ F: a F: b }参数解析之前,否则参数解析会直接尝试从栈取值,提前触发下溢错误。
2. 利用系统错误捕获机制
很多Forth系统支持用catch捕获异常,可借此处理栈下溢场景并给出友好提示:
: fpmult catch { F: a F: b } cr ." Result: " a b f* f. 0= if ." Error: 浮点栈元素不足,需要两个浮点数" cr then ;
这种方式无需手动检查栈深度,直接复用系统的错误处理逻辑。
3. 遵循Forth传统栈语义(可选)
如果是内部工具函数,更符合Forth风格的做法是依赖调用者维护正确的栈状态——Forth标准单词大多不会额外做栈检查,而是默认调用者保证栈元素数量符合要求。但如果是对外提供的公共接口,添加栈检查或错误提示会更友好。
内容的提问来源于stack exchange,提问作者Rather Vi
相关产品推荐
相关产品推荐

