Elixir 宏:Power ** 函数

Elixir Macro: Power ** function

查看 Elixir 源代码,我看到乘法是这样定义的:

@spec (number * number) :: number
def left * right do
  :erlang.*(left, right)
end

我想做一个**功能来锻炼力量。然而,当我尝试时,我遇到了异常,我不知道如何正确地做。

@spec (number ** number) :: number
def left ** right do
  :math.pow(left, right)
end

总是抛出如下错误:

** (SyntaxError) iex:7: syntax error before: '*'

我试着把它变成一个宏,使用反引号,使用 :"**" 而不是 **。不确定为什么这不起作用...

有什么想法吗?

二元运算符是在 Elixir 中预定义的,这意味着 Elixir 解析器只会解析一堆运算符(显然,其中包括 *)。您可以在解析器的 this section 中大致看到运算符列表。有一些 "free" 运算符,即 Elixir 能够解析但语言本身不使用的运算符(例如 <~>),但 ** 不在其中。

只是为了表明可解析运算符可以做你想做的事:

defmodule MyWeirdOperators do
  def left <~> right do
    :math.pow(left, right)
  end
end

import MyWeirdOperators
3 <~> 4
#=> 81.0

Elixir 没有 ** 运算符。您不能在不更改和重新编译至少 the Elixir parser and the Macro module.

的情况下定义新的中缀运算符