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

Nic*_*mot 5 lua

来自Lua编程第3版第38页

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

我有几个猜测,为什么会这样:

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

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

与此同时,还有其他人有什么想法吗?

小智 9

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

C标准库还提供了longjmp()setjump()它做,可以实现的"GOTO"形式出当前堆栈帧的. setjmp()保存当前堆栈上下文.然后,您可以调用longjmp()将堆栈展开回您调用的位置setjmp().longjmp()在调用setjump()退出的函数后,您无法调用.