2015-05-02 15 views
8

Patrząc przez źródła Elixir widzę, że mnożenie jest zdefiniowany następująco:Elixir Makro: Power ** Funkcja

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

chciałem zrobić ** funkcji do władzy jako ćwiczenie. Jednak gdy próbuję, otrzymuję wyjątek i nie mogę wymyślić, jak zrobić to poprawnie.

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

zawsze zgłasza błąd jak:

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

Próbowałem czyniąc to makro, używając cytatu, używając: "**" zamiast **. Nie wiesz, dlaczego to nie zadziała ...

Jakieś pomysły?

Odpowiedz

11

Operatory binarne są wstępnie zdefiniowane w eliksiru, co oznacza, że ​​analizator składni Elixir przeanalizuje tylko kilka operatorów (które, oczywiście, obejmują *). Listę operatorów można zobaczyć w przybliżeniu w this section analizatora składni. Istnieją operatory "wolne", to znaczy operatory, które Elixir może analizować, ale które nie są używane przez sam język (np. <~>), ale ** nie znajduje się wśród nich.

Wystarczy pokazać, że operatorzy parsowalnym może robić to, co chcesz:

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

import MyWeirdOperators 
3 <~> 4 
#=> 81.0 
+0

Dało mi to jedno z tych aha! chwile wczoraj, myślałem, że rozumiem funkcjonalne dopasowywanie wzorców, ale jego głębsze niż dopasowanie argumentów, pasuje do partii! - Chciałem tylko podziękować :) –

+0

'**' był kiedyś operatorem przeciążonym, ale został usunięty. To dlatego, że ludzie _expect_ używać go jako operatora 'pow', ale byłoby niemożliwe, aby użyć tej potęgowanie wewnątrz klauzul strażniczych. Wszystkie domyślne operatory eliksirów * są * dozwolone w klauzulach strażników, a gdy coś nie jest, może to być mylące dla ludzi. A więc: '**' został usunięty. – Qqwy