gpt4 book ai didi

if-statement - lua中定义逻辑运算符隐含

转载 作者:行者123 更新时间:2023-12-02 18:17:28 26 4
gpt4 key购买 nike

print("i", "j", "i & j")
for i = 0,1 do
for j=0,1 do
print(i, j, i & j)
end
end

上面的代码在Lua中运行良好。它给出以下输出。

i   j   i & j
0 0 0
0 1 0
1 0 0
1 1 1

我想定义另一个运算符implies。它是条件逻辑运算符。仅当 p 为真且 q 为假时,结果p 暗示 q 为假。

print("i", "j", "i implies j")
for i = 0,1 do
for j=0,1 do
print(i, j, i implies j)
end
end

我希望上面的代码能够工作。它应该输出以下内容。

i   j   i implies j
0 0 1
0 1 1
1 0 0
1 1 1

到目前为止,我已经成功地定义了隐含函数,但这似乎没有多大用处。当然我可以写implied(i,j)但我想要类似于&或|的运算符我可以使用。所以基本问题是复制逻辑运算符 & 或 | 的定义来自卢阿。这是隐含函数(不是运算符)的代码。

function implies(a,b)
if a then
return b
else
return True
end
end

最佳答案

OOP 风格的调用

如果它确实必须是中缀的话,这会变得相当棘手。简单地使用 OOP 式 object:method(params) 语法的元表怎么样?

假设implies定义为

local function _implies(a, b)
if a ~= 0 then return b end
return 1
end

这将实现为

debug.setmetatable(0, {__index = {
implies = _implies
}})

并用作

i:implies(j)

如果您想要更简单的点语法,请考虑使用柯里化(Currying):

debug.setmetatable(0, {__index = {
implies = function(a) return function(b) return _implies(a, b) end end
}})

用作

i.implies(j)

通过使用 __call 元方法并传递函数名称,可以实现更“中缀式”的表示法:

debug.setmetatable(0, {__index = {
implies = function(a) return function(b) return _implies(a, b) end end
}, __call = function(self, index) return self[index] end})
(i)("implies")(j)

如果implies = "implies",甚至可以缩短为(i)(implies)(j)

Hacky,“真正的”中缀表示法

如果中缀表示法至关重要,但您无法使用可用的元方法,因为它们有限且不可读,您可以使用更多柯里化(Currying)和变通方法来使用其他元方法来创建看似可以改变您的函数的运算符(在至少在语法上)使用“代理”元表而不是函数转换为中缀运算符。您可以使用任何您喜欢的运算符;只需确保它们在关联性和优先级方面满足您的需求即可:

local implies_right_hand_mt = {
__mul = function(self, b)
return _implies(self.a, b)
end
}
local implies_left_hand = setmetatable({}, {
__mul = function(a)
return setmetatable({a = a}, implies_right_hand_mt)
end
})
implies = implies_left_hand

在您的示例中,语法将是 i *implies* j"i *implies* j" (使用乘法运算符)。但是,您也可以使用所有其他运算符(比较运算符除外),包括其他算术运算符,因为暗示不是数字而是表格,因此可能会覆盖数字元方法。

旁注

考虑使用 bool 值而不是数字。您将获得两个优势:

  1. 大多数元方法不被 bool 值使用(尤其是所有算术和按位元方法);
  2. 逻辑运算符 notandor 起作用;您不必使用按位运算符(尽管它们也可以正常工作)。

关于if-statement - lua中定义逻辑运算符隐含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71394581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com