OK, in primo luogo definire la funzione:
printEven(I,N) when I >= N -> ok;
printEven(I,N) ->
if
I rem 2 == 0 -> io:format("~p~n",[I]), printEven(I+1,N);
I rem 2 == 1 -> printEven(I+1,N)
end.
Erlang è un linguaggio di programmazione funzionale e (per definizione) le funzioni di 'avere' un valore in modo che si sta per ottenere il 'qualcosa' indietro. Per convenzione, la cosa che si ottiene dopo aver completato una funzione che si sta utilizzando per gli effetti collaterali è atom ok, è il migliore da usare qui.
È possibile "silenziare" il valore restituito se lo si desidera. Tu fai che quando si richiama la funzione pattern matching al 'non interessa' variabile (che è di sottolineatura):
_ = printEven(3,9),
o chiamando la funzione senza un pattern match:
printEven(3,9),
Tuttavia, si sta molto meglio di controllare sempre i valori di ritorno da pattern matching quando si richiama una funzione:
ok = printEven(3,9),
Questo è aa davvero buona abitudine di entrare in quanto si prevede di utilizzare un sacco di lib funzioni nee che restituiscono i codici di errore, come si può vedere dalle loro specifiche:
@spec funky(X) -> [ok | {error, bad_op} | {error, wig_out}]
Se funky ha effetti collaterali che si vogliono sapere non è riuscita ora invocando con un pattern match quindi si arresterà qui e ora se funky fallisce:
ok = funky(99),
Se corrispondono a '_'
o ignorare il valore di ritorno andrà in crash 268 linee più tardi, quando il vostro mojo aspetta funky di aver fatto il suo thang, e poi è molto più difficile da trovare.
Questa è la felice programmazione del percorso che è la cosa fatta in Erlang. "Let it crash" è il motto. Se sei nuovo di Erlang lo troverai molto sconcertante, come camminare nudi. Non ti preoccupare di abbracciarlo, è una buona cosa. Porta a un sacco di codice "non scritto".
(Si dovrebbe anche prendere l'abitudine di mettere la clausola che termina la ricorsione come la clausola superiore come indicato qui - rende la lettura del codice sooo molto più facile quando si dispone di una funzione multi-clausola.)
Umm, questo codice non può essere compilato - la prima clausola dovrebbe terminare con un punto e virgola non a punto. Lo stai eseguendo nella shell? Se lo sei, stamperà sempre ciò che restituisce e restituisce sempre qualcosa. Se non lo si esegue nella shell, basta rilasciare il formato io: ... –