2012-06-02 14 views
9

Ho un modulo che esegue alcune riduzioni non vincolate. Mi piacerebbe mantenere la sua interfaccia il più semplice possibile, quindi la scelta migliore sarebbe ridurla a una singola funzione, ad esempio: min_of (F).Come dovrei definire qualcosa di costante come in Erlang

Ma non appena si tratta di calcoli brutali, avrei a che fare con almeno due costanti: precisione dell'algoritmo di minimizzazione e numero massimo di iterazioni, quindi non si impiccherebbe se la funzione target non ha un minimo locale a tutti.

In ogni caso, la scelta migliore è: min_of (F, Iterazioni, EPS). Va bene, ma non mi piace. Mi piacerebbe avere ancora un altro min_of (F) definito qualcosa del genere:

min_of(F) -> 
    min_of(F, 10000, 0.0001). 

Ma senza numeri magici.

Sono nuovo di Erlang, quindi non so come gestirlo correttamente. Devo definire una macro, una variabile o forse una funzione che restituisce una costante? O anche qualcos'altro? Ho trovato Erlang piuttosto espressivo, quindi questa domanda sembra essere più una buona pratica, che una domanda tecnica.

risposta

19

È possibile definire le macro come questo

-define(ITERATIONS, 10000). 
-define(EPS, 0.0001). 

e poi usarli come

min_of(F, ?ITERATIONS, ?EPS). 
5

È possibile utilizzare le macro, ma è anche possibile utilizzare le funzioni in-allineati.

-compile({inline, [iterations/0, eps/0]}). 

iterations() -> 10000. 
eps() -> 0.0001. 

e poi utilizzarlo nel modo

min_of(F) -> 
    min_of(F, iterations(), eps()). 

Il vantaggio è che si può utilizzare tutti gli strumenti di sintassi senza bisogno di epp. In questo caso anche il richiamo della funzione non è critico dal punto di vista delle prestazioni, quindi puoi anche andare senza la direttiva inline.

Problemi correlati