Forth 著名的允许用户通过定义控制流的新词来更改语言(超出标准给出的单词:DO、LOOP、BEGIN、UNTIL、WHILE、REPEAT、LEAVE IF、THEN、ELSE、CASE、ENDCASE 等(
是否有人们实际创建自己的新控制流词的常见示例? 有哪些典型和有用的例子? 还是标准已经定义了人们实际需要的一切?
我希望找到有用的语言扩展的例子,这些扩展已经获得认可或被证明对使语言更具表现力有所帮助。
Forth 中控制流结构的另一个主要方向是回溯。这是非常富有表现力和强大的机制。要实现,它需要返回地址操作 [Gas99]。
Backtrack in Forth是由M.L.Gassananko 在~1988-1990年开发的BacFORTH扩展。关于这个主题的第一篇论文是用俄语写的。
回溯技术使人们能够创建抽象迭代器 和过滤器模块负责查看所有可能的集合 值并拒绝"不必要"的值 [Gas96b]。
有关一些介绍,请参阅简短描述:回溯(通过mlg(,以及comp.lang.forth中的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
PRO
和CONT
是特殊的控制流词。 PRO
指定生成器字,CONT
调用消费者——它类似于 Ruby 或 ECMAScript 中的yield
。BacFORTH中还定义了许多其他特殊词。 您可以在SP-Forth中玩BacFORTH(只需包括~profit/lib/bac4th.f
库(。
词源
一般来说,回溯只是一种寻找解决方案的算法。在Prolog中,这个算法被嵌入在引擎盖下,所以Prolog中的回溯是它本身工作的过程。BacFORTH中的回溯是由一组特殊的控制流字支持的编程技术。
引用
- [Gas96a] M.L. Gassanenko, Formization of Backtrack in Forth, 1996 (mirror(
- [Gas96b] M.L. Gassanenko,增强回溯能力,1996年(镜像( [Gas99
- ] M.L. Gassanenko,《开放式口译员词集》,1999 年
这里有一个例子。 CASE
是 Forth 控制流词集的较晚添加。 1980年初,在Forth Dimensions上宣布了定义最佳CASE陈述的竞赛。 当年晚些时候,它以三个条目之间的平局解决了。 其中一个最终进入了 Forth94 标准。