【问题标题】:Compile Lua without automatic conversion between strings and numbers编译 Lua 而不在字符串和数字之间自动转换
【发布时间】:2014-04-08 08:04:52
【问题描述】:

Lua 一般是strongly-typed 语言,几乎不提供数据类型之间的隐式转换。

但是,数字和字符串确实会得到automatically coerced in a few cases

Lua 在运行时提供字符串和数字值之间的自动转换。任何应用于字符串的算术运算都会尝试将此字符串转换为数字,遵循 Lua 词法分析器的规则。 (字符串可能有前导和尾随空格和一个符号。)相反,只要在需要字符串的地方使用数字,该数字就会以合理的格式转换为字符串

因此:

local x,y,z = "3","8","11"
print(x+y,z)  --> 11   11
print(x+y==z) --> false
print(x>z)    --> true

我不想要这个。如何重新编译 Lua 解释器以消除所有自动转换?

我希望拥有:

print(x+y)    --> error: attempt to perform arithmetic on a string value
print(x>1)    --> error: attempt to compare number with string
print(x..1)   --> error: attempt to concatenate a number value

【问题讨论】:

  • 可行,但不是开箱即用。您必须编辑 Lua 的内部结构。从lua.org/source/5.2/lvm.c.html#luaV_tonumber开始。
  • 您可能也想“修复”这样的情况:print("one="..1)
  • 创建自己的 lua 方言,巧妙地(并且默默地!)不同于主流真的值得吗?
  • @vonbrand 好吧,我们已经使用 32 位数字而不是 64 位进行编译,这有其自身微妙的含义(例如,os.time() 不会每秒增加)。不过,这是由编译时标志支持的。
  • 您能否明确说明您想要的输出(对于您各自的示例)?

标签: c lua strong-typing


【解决方案1】:

杰出的LHF上面评论说这是不可能开箱即用的,需要编辑Lua的内部结构,从http://www.lua.org/source/5.2/lvm.c.html#luaV_tonumber开始

将此标记为答案以结束此问题。如果以后有人选择提供详细说明需要做什么的答案,我很乐意将接受标记切换为该答案。

【讨论】:

  • 同意,参数在传递给函数之前被评估,在这种情况下是“打印”。因此,表达式求值(IE 强制)的内部功能需要改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 2011-11-06
  • 2021-09-13
  • 2010-11-29
相关资源
最近更新 更多