f3 = {__index = {}}
f4 = {__index = {}}
f3.__index.cross = function(a, b) return "cross 3" end
f4.__index.cross = function(a, b) return "cross 4" end
function float3() local ob = {}; setmetatable(ob, f3); return ob end
function float4() local ob = {}; setmetatable(ob, f4); return ob end
function is_compatible(a, b)
return getmetatable(a) == getmetatable(b)
end
function cross(a, b)
if not is_compatible(a, b) then return "error" end
return a.cross(b)
end
print("wariant 33: " .. cross(float3(), float3()))
print("wariant 44: " .. cross(float4(), float4()))
print("wariant 34: " .. cross(float3(), float4()))
print("wariant 43: " .. cross(float4(), float3()))
ZjMgPSB7X19pbmRleCA9IHt9fQpmNCA9IHtfX2luZGV4ID0ge319CmYzLl9faW5kZXguY3Jvc3MgPSBmdW5jdGlvbihhLCBiKSByZXR1cm4gImNyb3NzIDMiIGVuZApmNC5fX2luZGV4LmNyb3NzID0gZnVuY3Rpb24oYSwgYikgcmV0dXJuICJjcm9zcyA0IiBlbmQKCmZ1bmN0aW9uIGZsb2F0MygpIGxvY2FsIG9iID0ge307IHNldG1ldGF0YWJsZShvYiwgZjMpOyByZXR1cm4gb2IgZW5kCmZ1bmN0aW9uIGZsb2F0NCgpIGxvY2FsIG9iID0ge307IHNldG1ldGF0YWJsZShvYiwgZjQpOyByZXR1cm4gb2IgZW5kCgpmdW5jdGlvbiBpc19jb21wYXRpYmxlKGEsIGIpCglyZXR1cm4gZ2V0bWV0YXRhYmxlKGEpID09IGdldG1ldGF0YWJsZShiKQplbmQKCmZ1bmN0aW9uIGNyb3NzKGEsIGIpCglpZiBub3QgaXNfY29tcGF0aWJsZShhLCBiKSB0aGVuIHJldHVybiAiZXJyb3IiIGVuZAoJcmV0dXJuIGEuY3Jvc3MoYikKZW5kCgpwcmludCgid2FyaWFudCAzMzogIiAuLiBjcm9zcyhmbG9hdDMoKSwgZmxvYXQzKCkpKQpwcmludCgid2FyaWFudCA0NDogIiAuLiBjcm9zcyhmbG9hdDQoKSwgZmxvYXQ0KCkpKQpwcmludCgid2FyaWFudCAzNDogIiAuLiBjcm9zcyhmbG9hdDMoKSwgZmxvYXQ0KCkpKQpwcmludCgid2FyaWFudCA0MzogIiAuLiBjcm9zcyhmbG9hdDQoKSwgZmxvYXQzKCkpKQ==