- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 式 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)
。
如果中缀表示法至关重要,但您无法使用可用的元方法,因为它们有限且不可读,您可以使用更多柯里化(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 值而不是数字。您将获得两个优势:
not
、and
和 or
起作用;您不必使用按位运算符(尽管它们也可以正常工作)。关于if-statement - lua中定义逻辑运算符隐含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71394581/
我正在使用 Fortran90,但我对它不太熟悉。 在代码的某些地方,我想在 t0 和 tf 之间创建一个由 n 个线性等距点组成的数组,所以我尝试了以下方法: t = t0+(/(i,i=0,n-1
我试图弄清楚为什么在数组构造函数内的 do 构造之前放置标量会产生它所得到的答案。 我一般理解 do 结构,(/(i,i=1,5)/) 相当于 (/1,2,3,4,5/)。 real, dimensi
我目前遇到的情况是,我需要能够通过应用程序 B 的隐式 Intent 广播来启动应用程序 A。应用程序之间没有数据传递。应用程序 A 被简单地启动,显示特定的 Activity。 我的问题是这样的;从
我是一名优秀的程序员,十分优秀!