Unary operators

Operator overloading

local Point = {}
Point.__index = Point

function Point.new(x, y)
  return setmetatable({x = x, y = y}, Point)
end

-- Bitwise not: ~p
function Point.__bnot(p)
  return Point.new(p.y, p.x)
end

-- Unary minus: -p
function Point.__unm(p)
  return Point.new(-p.x, -p.y)
end

local p = Point.new(1, 3)

-- An operator is an expression:
-- its result has to be used
local swapped = ~p
-- swapped = 3, 1

local negative = -p
-- negative = -1, -3

print("swapped = " .. swapped.x
      .. ", " .. swapped.y)
print("negative = " .. negative.x
      .. ", " .. negative.y)