自定义控制流编译语句示例

Examples of Custom Control Flow Compiling Words

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

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

我希望找到有用的语言扩展示例,这些扩展已经获得认可或被证明通常有助于使语言更具表现力。

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

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

Forth 中的回溯是由 M.L.Gassananko 在 ~1988-1990 年作为 BacFORTH 扩展开发的。关于这个主题的第一篇论文是俄语的。

回溯技术可以创建抽象迭代器 和过滤器模块负责查看所有可能的集合 值并拒绝 "undue" 个 [Gas96b].

有关介绍,请参阅简短说明:Backtracking (by mlg), also the multi-threading in 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 调用消费者——类似于 Ruby 或 ECMAScript 中的 yield。 BacFORTH 中还定义了一些其他的特殊词。 您可以在 SP-Forth 中使用 BacFORTH(只需包含 ~profit/lib/bac4th.f 库)。

词源

一般来说,backtracking is just an algorithm for finding solutions. In Prolog this algorithm was embedded under the hood, so backtracking in Prolog 是它自己运作的过程。 BacFORTH 中的回溯是一种由一组特殊控制流字支持的编程技术。

参考资料