Usually, you would define `action` as `proc(l,r: T): T`. But this does not work
for `xor` because of this paragraph in the manual ([see
also](https://github.com/nim-lang/Nim/issues/2172)):
> Assigning/passing a procedure to a procedural variable is only allowed if one
> of the following conditions hold:
>
> * The procedure that is accessed resides in the current module.
>
> * The procedure is marked with the procvar pragma (see procvar pragma).
>
> * The procedure has a calling convention that differs from nimcall.
>
> * The procedure is anonymous.
`xor` is not in the current module, not marked with `{.procvar.}`, has the
calling convention `nimcall` and is not anonymous, so it may not be passed to a
procedural variable.
You can, however, use a template:
template bitWise*[T](buff: openArray[T], action: untyped, mask:
openArray[T]): seq[T] =
var result = newSeq[T]()
for i in 0..<buff.len:
result.add(action(buff[i], mask[i]))
result
echo bitWise([1, 0, 0], `xor`, [1, 0, 1])