为什么是 : y : x ;合法的?是什么意思?

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

我发现了

: x : y ;

是合法的(至少在未来),但我想不出这个构造的用例。

据我了解,执行

x
会开始重新定义
y
,但会在结束分号处抛出错误:

: y 42 ;  ok
: x : y ;  ok
x 43 ; 
:3: unstructured 
x 43 >>>;<<<
Backtrace:
$7FD8A0818988 throw 
$7FD8A08284E0 c(abort") 
$7FD8A0835600 def? 
$7FD8A08218C0 ;-hook 

有人可以解释一下吗?

forth
1个回答
0
投票
执行

: x : y ;

 时,
y
不会重新定义
x
。 这是因为
x
运行时
调用 :,而不是在编译时。 当您输入
x 43 ;
时,
x
会调用
:
来解析输入流中的名称;在本例中是
43
。 因此创建了一个新的定义
43

其次,

x
调用
y
(在运行时),这会将
42
推入堆栈。 Gforth 进行内部检查,以确保在定义时控制堆栈是平衡的。 IE。运行
:
时,控制堆栈的深度必须与运行结束
;
时的深度相同。 在您的示例中,
x
首先调用
:
,然后调用
y
。 由于
y
推送了未弹出的内容,因此
;
会注意到并抱怨。

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