Lua为什么不能跳出功能呢?

时间:2013-09-05 21:30:51

标签: lua

来自Lua中的编程第3版第38页

  

练习4.5:你能解释为什么Lua有goto不能跳出函数的限制吗? (提示:你将如何实现该功能?)

我猜测为什么会如此:

  • 如果你从一个功能跳到另一个功能而第二个功能返回,那么PC会去哪里?
  • 如果您有a = f()但f在该行代码后执行了goto,那么a的价值是多少?
  • 由于不同平台的调用约定,是否无法定义标准行为?

我想知道作者将如何回答这个问题。也许我会给他发电子邮件。

与此同时,其他人是否有一些想法?

1 个答案:

答案 0 :(得分:9)

你的猜测暗示了答案。原因是因为goto语句及其目标必须位于同一堆栈帧中。 goto之前和之后的程序上下文需要相同,否则跳转到的代码将不会在其正确的堆栈帧中运行,并且其行为将是未定义的。由于同样的原因,C中的goto具有相同的限制。

C标准库还提供了longjmp()setjump(),它们允许您从当前堆栈帧中实现“goto”形式。 setjmp()保存当前堆栈上下文。然后,您可以调用longjmp()将堆栈展开回您调用setjmp()的位置。在调用longjmp()的函数退出后,您无法调用setjump()