Forth LEAVE ... LOOP 是如何实现的,因为事先不知道 LEAVE 的数量?

shi*_*rom 7 language-implementation forth

LOOP 一词被描述为“解析所有未解析的 LEAVE 事件的目的地”。(强调我的)

与 IF ... ELSE ... THEN 的前向引用数始终为 1 不同,LOOP 对 LEAVE 的数量没有限制。那怎么实施呢?

我想到的一种方法是始终将 LEAVE 的数量保持在堆栈顶部。每个 LEAVE 都会增加此计数器并将其置于其下。LOOP 从顶部读取计数器并解析那么多引用。但这似乎是一个便宜的伎俩。

真正的 Forth 系统如何实现这种循环?我不需要 teh codez(将 Forth 作为学习经验实施),只需要概念。

ruv*_*vim 5

在SP-Forth中,循环控制参数包括LOOP之后的索引、限制和地址。因此,不需要LEAVE在编译时解析,它在运行时从循环控制参数中知道地址。

另一种方法是存储 上的控制流堆栈深度DO,将控制流堆栈上未解析的前向引用放置在 上的所有其他已放置值(使用存储的深度)下LEAVE,然后解析 上的所有放置的前向引用LOOP

请参阅我在和的基础上的高级实现(剧透警告)。DO LOOPBEGIN UNTILAHEAD THEN