通过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将其设为宏,使用:“**”而不是**。不知道为什么这不起作用......
有什么想法吗?
答案 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 parser和the Macro
module,则无法定义新的中缀运算符。