【问题标题】:Elixir Macro: Power ** functionElixir 宏:Power ** 函数
【发布时间】:2015-07-12 12:17:28
【问题描述】:

查看 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: '*'

我尝试将其设为宏,使用取消引用,使用 :"**" 而不是 **。不知道为什么这不起作用...

有什么想法吗?

【问题讨论】:

    标签: macros elixir


    【解决方案1】:

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

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

    defmodule MyWeirdOperators do
      def left <~> right do
        :math.pow(left, right)
      end
    end
    
    import MyWeirdOperators
    3 <~> 4
    #=> 81.0
    

    【讨论】:

    • 这给了我一个啊哈!昨天的片刻,我以为我理解了功能模式匹配,但它比匹配参数更深,它匹配很多! - 只是想说声谢谢:)
    • ** 曾经是一个可重载的运算符,但已被删除。这是因为人们期望将其用作pow 运算符,但不可能在保护子句中使用此幂运算。所有默认的长生不老药操作符都可以在保护子句中使用,如果不是这样,人们可能会感到困惑。所以:** 被删除了。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 2016-09-03
      • 2016-01-08
      • 2016-04-25
      • 2016-05-05
      • 2020-05-25
      • 2020-07-17
      • 1970-01-01
      • 2016-09-05
      相关资源
      最近更新 更多