forth - Forth LEAVE ... LOOP 是如何实现的,因为事先不知道 LEAVE 的数量?
问题描述
LOOP 这个词被描述为“解决所有未解决的 LEAVE 事件的目的地”。(强调我的)
与 IF ... ELSE ... THEN 不同,其中前向引用的数量始终为 1,LOOP 对 LEAVE 的数量没有限制。那怎么实现呢?
我想到的一种方法是始终将 LEAVE 的数量保持在堆栈顶部。每个 LEAVE 都会增加这个计数器并将自己置于它之下。LOOP 从顶部读取计数器并解析那么多引用。但这似乎是一个廉价的把戏。
真正的 Forth 系统是如何实现这种循环的?我不需要 codez(将 Forth 作为一种学习体验),只需要概念。
解决方案
在 SP-Forth 中,循环控制参数包括索引、限制和循环后的地址。因此,无需LEAVE
在编译时解析,它在运行时从循环控制参数中知道地址。
另一种方法是将控制流堆栈深度存储在 上DO
,将控制流堆栈上未解析的前向引用放置在所有其他已放置的值(使用存储的深度)下LEAVE
,然后解析所有放置的前向引用LOOP
。
请参阅我基于and的高级实现(剧透警告)。DO LOOP
BEGIN UNTIL
AHEAD THEN