Macros Elixir宏:电源**功能

Macros Elixir宏:电源**功能,macros,elixir,Macros,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 总是抛出一个

通过长生不老药的来源,我看到乘法的定义如下:

@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: '*'
我试着把它变成一个宏,用unquote,用“**”代替**。不知道为什么这不起作用


有什么想法吗?

二进制运算符是在Elixir中预定义的,这意味着Elixir解析器将只解析一组运算符(显然包括
*
)。您可以在解析器中大致看到运算符列表。有一些“免费”运算符,即Elixir能够解析但语言本身不使用的运算符(例如,
),但
**
不在其中

只是为了说明可解析运算符可以执行您想要的操作:

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

import MyWeirdOperators
3 <~> 4
#=> 81.0
defmodule MyWeirdOperators做什么
def左行右行
:math.pow(左、右)
结束
结束
导入MyWeirdOperators
3  4
#=> 81.0

Elixir没有
**
操作符。你不能定义一个新的中缀操作符而不进行更改和重新编译。这给了我一个很好的解释!昨天,我以为我理解了函数模式匹配,但它比匹配参数更深,它匹配很多只是想说声谢谢:)
**
以前是一个可重载的操作符,但被删除了。这是因为人们希望将其用作
pow
运算符,但在guard子句中不可能使用此幂运算。guard子句中允许使用所有默认的elixir运算符,当某些内容不允许时,可能会让人感到困惑。因此:
**
被删除。