2010-07-22 16 views
6

Ho scritto un modulo di Erlang in cui non tutte le funzioni interne vengono richiamate direttamente. Invece, c'è un paio di funzioni che assomigliano a questo:Soppressione degli avvisi di "funzione inutilizzata" di Erlang

weird_func(Cmd, Args) -> 
    ?MODULE:Cmd(Args). 

È un esempio semplificato, ma si ottiene l'idea. Il compilatore di Erlang sputa avvertimenti su funzioni inutilizzate, quando in realtà sono effettivamente utilizzate, ma non direttamente. C'è un modo per sopprimere questi avvertimenti? Idealmente non voglio sopprimere tutti questi avvertimenti, ma piuttosto vorrei dire al compilatore di Erlang di considerare alcune funzioni specifiche come casi speciali.

+2

chiamare una funzione in questo modo funziona solo se è stato esportato. In effetti stai facendo una chiamata "esterna" anche se usi '? MODULE', che è solo una macro predefinita che si espande al nome del modulo e passa il nome della funzione come argomento. N.B. che 'Args' sarà una lista degli argomenti e la funzione chiamata avrà solo un argomento. – rvirding

risposta

6

Se una funzione non viene né esportata né chiamata in modo esplicito, viene segnalata come non utilizzata. Quindi hai due modi per andare:

1) Esportare le funzioni che vengono utilizzate indirettamente. Se non si desidera che tali funzioni da chiamare dagli all'esterno del modulo, è possibile evidenziare questo nella documentazione

2) Chiamare ogni funzione in modo esplicito nel weird_func (e nei commenti.):

weird_func(fun1, [A1,A2]) -> 
    fun1(A1, A2); 
weird_func(fun2, []) -> 
    fun2(); 
weird_func(fun3, [A1,A2,A3]) -> 
    fun3(A1,A2,A3). 

Questo quest'ultimo è un po 'più prolisso, ma fornirà un errore migliore agli utenti, se chiamano una funzione non esistente

+1

Immagino che 2) non sia un'opzione quando usi {weird_result} -> spawn (? MODULE, fun1, [params]); – Daniel

11

Non si tratta solo di sopprimere l'avviso. Una funzione non esposta non può essere chiamata nel modo in cui intendi.

-module(foo). 
-export([f/0]). 
f() -> ?MODULE:g(). 
g() -> ok. 

1> c(foo). 
./foo.erl:4: Warning: function g/0 is unused 
{ok,foo} 
2> foo:f(). 
** exception error: undefined function foo:g/0 

Il compilatore è libero di cadere completamente i, funzione non esportare inutilizzato. Esportare semplicemente la funzione rendendola disponibile utilizzando la sintassi? MODULE: F.

2

Fondamentalmente hai due opzioni.

Il primo è di esportare le funzioni, quindi "utilizzarle". Questo è anche necessario per il tuo esempio originale per funzionare.

secondo è quello di richiamare le funzioni a livello locale utilizzando qualcosa di simile: (.. Si noti che il mio esempio non compilare Bisogna dividere l'argomento Args in pezzi a seconda di quale si sta chiamando func)

weird_func(Cmd, Args) -> 
    case Cmd of 
     func1 -> func1(Arg1, Arg2, Arg3); 
     func2 -> func2(Arg1); 
     ... 

+0

Penso che in questo caso sia preferibile l'uso della corrispondenza del modello: 'weird_func (func1, Args) -> ...; weird_func (func2, Args) -> ...; ' –

12

v'è un'opzione di compilazione appositamente per questo:

http://www.erlang.org/doc/man/compile.html

così, per l'esempio di inserimento annuncio DIRETTIVA come questo:

-compile([{nowarn_unused_function, [{ wierd_function_1,Arity1 }, 
             ... ]}]). 

ma quanto sopra avvertimento circa il compilatore in silenzio scartando le funzioni si trova ancora per quanto ne so.

1

È possibile anche passare Cmd nel formato fun func1/3, ad esempio:

weird_func(fun func1/3, [1, 2, 3])

In questo modo non sarà abbandonato la funzione.

Edit: appena aggiunto il mio commento in modo che possa essere utile per i lettori futuri

Problemi correlati