10

Forth 著名地允许用户通过为控制流定义新词来改变语言(超出标准给出的词:DO、LOOP、BEGIN、UNTIL、WHILE、REPEAT、LEAVE IF、THEN、ELSE、CASE、ENDCASE 等)

是否有人们实际创建自己的新控制流词的常见示例?有哪些典型和有用的例子?还是标准已经定义了人们实际需要的一切?

我希望找到一些有用的语言扩展的例子,这些扩展已经被接受或被证明通常有助于使语言更具表现力。

4

2 回答 2

7

这是一个例子。 CASE是对 Forth 控制流字集的较晚添加。1980 年初,Forth Dimensions 宣布了定义最佳 CASE 语句的竞赛。那年晚些时候,三项参赛作品打成平手。其中之一最终出现在 Forth94 标准中。

于 2017-06-30T18:17:13.470 回答
7

Forth 中控制流结构的另一大方向是回溯。这是非常有表现力和强大的机制。要实现,它需要返回地址操作 [Gas99]。

Forth 中的回溯是 MLGassananko 在 1988-1990 年开发的 BacFORTH 扩展。第一篇关于这个主题的论文是用俄语写的。

回溯技术使人们能够创建抽象的迭代器和过滤器模块,负责查看所有可能值的集合并拒绝“不适当的”值 [Gas96b]。

有关一些介绍,请参见简短描述:Backtracking (by mlg),也是Forth 中的多线程?comp.lang.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调用消费者——它类似于yieldRuby 或 ECMAScript。BacFORTH 中还定义了许多其他特殊词。您可以在 SP-Forth 中使用 BacFORTH(仅包括~profit/lib/bac4th.f库)。

词源

一般来说,回溯只是一种寻找解决方案的算法。在 Prolog 中,这个算法是嵌入在底层的,所以在 Prolog 中回溯是它自己工作的过程。BacFORTH 中的回溯是由一组特殊控制流字支持的编程技术。

参考

于 2017-07-10T16:45:19.910 回答