2015-05-02 18 views
8

Guardando attraverso la fonte Elisir Vedo che la moltiplicazione è definita in questo modo:Elixir Macro: Potenza ** funzione

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

ho voluto fare una funzione ** per fare il potere come esercizio. Tuttavia, quando provo, ottengo un'eccezione e non riesco a capire come farlo correttamente.

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

tiri sempre un errore del tipo:

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

Ho provato a fare una macro, utilizzando unquote, utilizzando: "**" invece di **. Non sei sicuro del motivo per cui questo non funziona ...

Qualche idea?

risposta

11

Gli operatori binari sono predefiniti in elisir, il che significa che il parser elisir analizza solo un gruppo di operatori (che, ovviamente, includono *). È possibile visualizzare l'elenco degli operatori all'incirca nello this section del parser. Esistono alcuni operatori "liberi", ovvero operatori che Elixir è in grado di analizzare ma che non sono utilizzati dalla lingua stessa (ad esempio, <~>), ma ** non è tra questi.

Giusto per dimostrare che gli operatori parseable può fare ciò che si vuole:

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

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

Questo mi ha dato uno di quegli aha! Momenti di ieri, pensavo di aver capito l'abbinamento funzionale dei pattern, ma è più profondo degli argomenti corrispondenti, si abbina perfettamente! - Volevo solo dire grazie :) –

+0

'**' usato per essere un operatore sovraccarico, ma è stato rimosso. Questo perché le persone _expect_ lo usano come un operatore 'pow', ma sarebbe impossibile usare questo esponenziale all'interno delle clausole di guardia. Tutti gli operatori elisir predefiniti * sono * ammessi nelle clausole di guardia e, quando qualcosa non lo è, potrebbe essere fonte di confusione per le persone. Quindi: '**' è stato rimosso. – Qqwy

3

Elixir non ha un operatore di **. Non è possibile definire un nuovo operatore di infisso senza modificare e ricompilare almeno the Elixir parser e the Macro module.