我发现了
: 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
有人可以解释一下吗?
: x : y ;
时,
y
不会重新定义 x
。 这是因为 x
在 运行时调用
:
,而不是在编译时。 当您输入 x 43 ;
时,x
会调用 :
来解析输入流中的名称;在本例中是 43
。 因此创建了一个新的定义43
。
其次,
x
调用y
(在运行时),这会将42
推入堆栈。 Gforth 进行内部检查,以确保在定义时控制堆栈是平衡的。 IE。运行 :
时,控制堆栈的深度必须与运行结束 ;
时的深度相同。 在您的示例中,x
首先调用:
,然后调用y
。 由于 y
推送了未弹出的内容,因此 ;
会注意到并抱怨。