Elixir Macro:Power ** function

时间:2015-05-02 21:23:54

标签: macros elixir

通过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: '*'

我尝试使用unquote将其设为宏,使用:“**”而不是**。不知道为什么这不起作用......

有什么想法吗?

2 个答案:

答案 0 :(得分:12)

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

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

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

import MyWeirdOperators
3 <~> 4
#=> 81.0

答案 1 :(得分:3)

Elixir没有**运算符。如果不更改和重新编译至少the Elixir parserthe Macro module,则无法定义新的中缀运算符。