compilation - 自定义控制流编译词示例

标签 compilation control-flow forth gforth immediate-mode

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

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

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

最佳答案

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

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

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

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

词源

一般情况下,backtracking只是一种寻找解决方案的算法。在 Prolog 中,这个算法被嵌入到底层,所以 backtracking in Prolog是它自己如何运作的过程。 BacFORTH 中的回溯是由一组特殊控制流字支持的编程技术。

引用
  • [Gas96a] M.L.加萨年科,Formalization of Backtracking in Forth , 1996 ( mirror )
  • [Gas96b] M.L.加萨年科,Enhancing the Capabilities of Backtracking , 1996 ( mirror )
  • [Gas99] M.L.加萨年科,The Open Interpreter Word Set , 1999
  • 关于compilation - 自定义控制流编译词示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44852055/

    相关文章:

    c++ - 从 CLI C++ 项目引用非托管 C++ 项目

    namespaces - 将 Clojure 命名空间拆分为多个文件

    ios - NSNotification 和控制流

    forth - 在Forth中实现求幂

    c - 给定堆栈和寄存器的状态,我们能否预测 printf 未定义行为的结果

    c++ - gcc 要求使用 -std=c++11 即使我已经在使用它

    c++ - GCC中enum switch的控制流不足分析

    r - 在函数中调用其他列的控制流程

    forth - 是否有用于堆栈效应的 Forth 静态分析器?