You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:57:42