定义单词时对堆栈使用的限制?

问题描述 投票:0回答:1

我在定义中测试 [] 的使用,出现错误:

: x [ here ] ;
:2: unstructured
: x [ here ] >>>;<<<

我知道错误的原因是编译时增加/减少了堆栈。罪魁祸首可以是任何“直接”单词:

: y + ; immediate  ok
1 2 y . 3  ok
4 5   ok
: x y ; 
:4: unstructured 
: x y >>>;<<<

我的问题是:它是标准的一部分还是只是第四个实现?

堆栈的使用还有其他限制吗?

stack forth gforth
1个回答
0
投票

它是标准的一部分还是只是第四个实现?

它是标准的一部分。

:
colon-sys留在数据堆栈上:
( -- colon-sys )

;
从数据堆栈中消耗 colon-sys
( colon-sys -- )

colon-sys 是一种系统编译数据类型colon-sys 的大小取决于实现。它可以占用数据堆栈中的 0 个单元,或者 10 个单元,甚至更多。

以下行在使用空数据堆栈运行时,将输出 colon-sys 元组。

: x [ cr .s cr ] ;

反过来,如果单词

;
没有在堆栈顶部遇到 colon-sys(例如,如果您将某些内容放在堆栈上的 colon-sys 上),则会引发异常。抛出异常不是必须的,但由于条件不明确,标准允许

因此,在编译定义时,从数据堆栈中消耗某些内容或在堆栈上留下某些内容并不容易。使用变量或用户定义的堆栈,或者如果以编程方式创建定义,则使用返回堆栈。


正式地,colon-sys 放置在控制流堆栈上。但控制流堆栈可以使用数据堆栈来实现。无论如何,结果是colon-sys可能占用0个或更多数据堆栈单元。

© www.soinside.com 2019 - 2024. All rights reserved.