如何实现Ruby的throw-catch?

时间:2015-05-22 02:10:28

标签: ruby compiler-construction lisp language-design throw

在ruby中,只要您将所有内容都包裹在throw :label块中,就可以catch(:label) do

我想将其添加到自定义lispy语言中,但我不确定它是如何实现的。有什么指针吗?

1 个答案:

答案 0 :(得分:1)

这是非本地退出的示例。如果您使用主语言(在本例中为C)调用目标语言中的函数调用堆栈(例如,您的lisp中的函数调用等同于C中的函数调用),那么最简单的方法是使用您的主机语言的非本地退出形式。在C中,这意味着setjmp / longjmp。

但是,如果您要单独维护目标语言的调用堆栈,那么您有很多选项可以执行此操作。一个非常简单的方法是让每个词法范围的出口产生两个值;返回的实际值和异常状态(如果有)。然后,您可以在运行时检查异常并传播此值。这有一个缺点,即在没有信号的情况下会给函数调用带来额外的成本,但对于玩具语言可能就足够了。

这本书" Lisp In Small Pieces"如果您有兴趣,我们会介绍大约六种处理方法。