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



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

PROCONT是特殊的控制流词。 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 标准。

相关内容

  • 没有找到相关文章

最新更新