GForth新手求助:执行collatzcount时出现零长度字符串命名错误
错误原因及修复方案
核心问题
错误回溯指向Variable,问题出在你把variable count写在了collatzcount的词定义内部。
在Forth中,variable是编译期命令,用来在词典里创建带名称的全局变量,必须在解释态(或者词定义的编译阶段顶层)执行。当你运行1 collatzcount时,词的执行逻辑走到variable count,此时Forth处于执行态,没法正确解析variable需要的名称参数,导致它判定你要创建一个空名称的变量,触发了“Attempt to use zero-length string as a name”错误。
修复方式
根据你要统计Collatz序列步数的需求,给你两种正确实现:
方式1:用全局变量(简单直接)
把variable count移到词定义外面,作为全局变量:
variable count \ 全局定义计数变量 : syr dup 2 mod 0 = if 2 / else 3 * 1 + endif ; : collatzcount 0 count ! \ 初始化计数为0 { ini } ini begin dup 1 <> while dup . syr count @ 1+ count ! \ 每走一步计数+1 repeat . count ? ; \ 输出最终步数
方式2:用栈存计数(推荐,避免全局污染)
不用创建变量,直接用Forth的栈保存计数值,不会污染全局词典:
: syr dup 2 mod 0 = if 2 / else 3 * 1 + endif ; : collatzcount { ini } 0 \ 栈顶放计数,初始为0 ini begin dup 1 <> while dup . syr swap 1+ swap \ 交换栈元素,给计数+1后再交换回去 repeat . swap . ; \ 输出最终步数
补充说明
你原来的代码里没写count的递增逻辑,上面的修复已经补上了。比如执行1 collatzcount会输出1 0(1是终止数,步数为0);执行6 collatzcount会输出6 3 10 5 16 8 4 2 1 8,最后那个8就是步数。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

