Этот вопрос имеет некоторую ссылку на вопрос Определение логического оператора подразумевается в lua. Следующий код работает нормально.
local function _implies(a, b)
if a == 1 and b == 0 then return 0
else return 1 end
end
local my_right = {
__mul = function(self, b)
return _implies(self.a, b)
end
}
local _mt = {
__mul = function(a)
return setmetatable({a=a}, my_right)
end
}
local my_left = {}
setmetatable(my_left,_mt)
imp = my_left
local names = {}
for i = 0,1 do
for j=0,1 do
names.i=i;names.j=j
print(i, j, names.i *imp* names.j)
end
end
Следующий код аналогичен приведенному выше коду. Это для логический и. Вопрос, который я хочу задать, таков: требуются ли и и влево, и и_право в этом случае? Были ли они необходимы, потому что подразумевает не является коммутативным? Другими словами, можно ли сделать код более эффективным для определения логанд?
local function _and(a, b)
if a == 1 and b == 1 then return 1
else return 0 end
end
local right_and = {
__mul = function(self, b)
return _and(self.a, b)
end
}
local and_mt = {
__mul = function(a)
return setmetatable({a=a}, right_and)
end
}
local and_left = {}
setmetatable(and_left,and_mt)
log_and = and_left
local names = {}
for i = 0,1 do
for j=0,1 do
names.i=i;names.j=j
print(i, j, names.i *log_and* names.j)
end
end
Примечание. Я знаю побитовый оператор &, но по некоторым причинам я не хочу его использовать.





Are both and_left and and_right are required
Они были введены, потому что задействованы два семантически разных умножения.
Но код можно оптимизировать.
Версия ниже не создает новую таблицу при каждом умножении.
Он также использует только одну метатаблицу вместо двух.
do
local function _implies(a, b)
if a == 1 and b == 0 then
return 0
else
return 1
end
end
local temp, imp = {}, {}
local _mt = {
__mul = function(a, b)
if b == imp then
temp[1] = a
return temp
elseif a == temp then
return _implies(temp[1], b)
end
end
}
setmetatable(temp, _mt)
setmetatable(imp, _mt)
_G.imp = imp
end
local names = {}
for i = 0, 1 do
for j = 0, 1 do
names.i=i
names.j=j
print(i, j, names.i *imp* names.j)
end
end