!
это не функция отрицания, это макрос.
См. Код в эликсире, lib/elixir/lib/kernel.ex: 1552
,
defmacro !value
defmacro !{:!, _, [value]} do
optimize_boolean(
quote do
case unquote(value) do
x when :"Elixir.Kernel".in(x, [false, nil]) -> false
_ -> true
end
end
)
end
defmacro !value do
optimize_boolean(
quote do
case unquote(value) do
x when :"Elixir.Kernel".in(x, [false, nil]) -> true
_ -> false
end
end
)
end
Раскрытый макрос !
- это case statement
, что недопустимо в страже эликсира.
А не является функцией Эрланга:
@spec not true :: false
@spec not false :: true
def not value do
:erlang.not(value)
end