【问题标题】:Lua REPL that can auto disambiguate expresssions and statements?Lua REPL 可以自动消除表达式和语句的歧义?
【发布时间】:2022-01-02 10:22:37
【问题描述】:

众所周知,Lua 5.3 以这种方式处理交互式 REPL 来区分表达式和语句:

在交互模式下,Lua 反复提示并等待一行。读完一行代码后,Lua 首先尝试将这行代码解释为一个表达式。如果成功,则打印其值。否则,它将该行解释为语句。如果您编写的语句不完整,解释器会通过发出不同的提示等待其完成。

但是,这不是我想要的行为。例如,我有一些代码“f()”要评估,无论发生什么,f 都会出错。它也改变了lua的内部状态。上述方法会导致错误,因为它会改变内部状态两次。

所以,我想知道,有没有办法实现自动消除表达式和语句歧义的 REPL?我是否必须添加一些语法分析才能实现这一点?

【问题讨论】:

  • 为什么不管发生什么函数都会抛出错误?那没有意义。你为什么要实现这样的功能?是什么阻止您正确处理这些错误?也许它会帮助分享一些代码以及你如何称呼它以使事情变得清晰
  • f() 怎么可能两次改变内部状态?当前的 REPL 如何不消除表达式和语句的歧义?
  • 你们说得对,我没搞清楚编译和运行的区别。

标签: lua read-eval-print-loop


【解决方案1】:

在 Lua REPL 中解释代码是一个两步过程。首先,您将输入转换为带有 loadstring 或类似函数的可运行代码。该代码已被验证为正确但尚未运行。然后你显式调用它。

fn = loadstring(“返回 42”); fn()

总而言之,只要不调用结果,使用 loadstring() 或类似函数解析和验证代码是没有副作用的。

【讨论】:

  • 在 Lua 5.3 及更高版本中,Loadstring() 函数已被 load() 取代
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
相关资源
最近更新 更多