自定义控制流编译单词的示例

10

在Forth中,用户可以通过定义控制流新词(除了标准中提供的:DO、LOOP、BEGIN、UNTIL、WHILE、REPEAT、LEAVE IF、THEN、ELSE、CASE、ENDCASE等)来改变语言。

是否有人常见地创建自己的新控制流词汇?有哪些典型而有用的例子?或者标准已经定义了人们实际需要的一切内容吗?

我希望找到一些被广泛接受或被证明通用的有用语言扩展示例,以使语言更加表达力。

2个回答

7

这里有一个例子。 CASE 是 Forth 控制流单词集合中较晚加入的一个。 1980 年初,Forth Dimensions 宣布了一个定义最佳 CASE 语句的竞赛。那一年晚些时候,由于三个参赛作品并列,该竞赛以平局结束。其中之一最终被收录进入了 Forth94 标准。


2
据我所知,在它们成为标准之前,CATCH和THROW也作为用户定义的控制结构存在。 - Philippos

7
在Forth中,另一个重要的控制流结构方向是“回溯”。它是一种非常表现力和强大的机制。为了实现它,需要返回地址操作[Gas99]。
Forth中的回溯是由M.L.Gassananko在1988-1990年左右开发的BacFORTH扩展。这个主题的第一篇论文是用俄语写的。
回溯技术使得可以创建抽象的迭代器和过滤器模块,负责查看所有可能值的集合并拒绝“不必要”的值[Gas96b]。
有关介绍,请参见简短描述:Backtracking (by mlg),此外,comp.lang.forth中的multi-threading in Forth?讨论也可能很有用(请参见Gassanenko的消息)。
以下是BacFORTH中生成器的一个例子:
: (0-2)=> PRO 3 0 DO I CONT LOOP ; \ generator
: test  (0-2)=>  CR . ." : " (0-2)=>  .  ;
test CR

输出:

0 : 0 1 2
1 : 0 1 2
2 : 0 1 2
PROCONT是特殊的控制流词。 PRO指定生成器词,而CONT调用使用者 - 这有点像Ruby或ECMAScript中的yield。 BacFORTH还定义了许多其他特殊单词。
您可以在SP-Forth中使用BacFORTH(只需包含〜profit / lib / bac4th.f库)。

词源

通常,回溯只是一种查找解决方案的算法。 在Prolog中,这个算法被嵌入到引擎中,所以Prolog中的回溯就是它们自己如何工作的过程。 BacFORTH中的回溯是一种编程技术,由一组特殊的控制流词支持。

参考资料


1
谢谢。这真是开了眼界。您知道是否也可以轻松实现延续、协程和有限状态机吗? - Raymond Hettinger
1
你能否稍微详细介绍一下回溯算法是什么(供未来的读者参考)? - Peter Mortensen
@PeterMortensen 我添加了一些信息和链接,请让我知道是否需要更多细节。 - ruvim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接