首页 > 解决方案 > Forth LEAVE ... LOOP 是如何实现的,因为事先不知道 LEAVE 的数量?

问题描述

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

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

我想到的一种方法是始终将 LEAVE 的数量保持在堆栈顶部。每个 LEAVE 都会增加这个计数器并将自己置于它之下。LOOP 从顶部读取计数器并解析那么多引用。但这似乎是一个廉价的把戏。

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

标签: forthlanguage-implementation

解决方案


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

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

请参阅我基于and的高级实现(剧透警告)。DO LOOPBEGIN UNTILAHEAD THEN


推荐阅读