Erlang – exemple 03

Cet exemple propose quelques fonctions manipulant des listes, des atomes, des uplets et des variables.

Remarques Code

Le module listes.erl (mal nommé, je sais) à droite expose les fonctions suivantes :

  • La fonction combien/1 qui reçoit une liste et en retourne le nombre d'éléments
  • La fonction afficher/1 qui reçoit une liste et en affiche chacun des éléments
  • La fonction afficher/2 qui reçoit un atome (ici, celsius ou fahrenheit) et un uplet composé d'un nom de lieu et d'une valeur (de température), et qui affiche la température en celsius, invoquant au besoin la fonction convertir/3 pour convertir de fahrenheit en celsius, et
  • La fonction max_elem/1, qui retourne la valeur de l'élément de plus haute valeur dans une liste, et qui y arrive en sollicitant max_elem/2, une fonction interne au module. Notez que j'ai pris cette fonction de la documentation officielle du langage.

À titre de complément syntaxique, vous remarquerez que les commentaires sont précédés d'un %.

-module(listes).
-export([combien/1, afficher/1, afficher/2, convertir/3, max_elem/1]).

combien([]) ->
   0;
combien([_ | Queue]) ->
   1 + combien(Queue).

afficher([]) ->
   [];
afficher([Tete | Queue]) ->
   io:format("~w~n", [Tete]),
   afficher(Queue).

afficher(celsius,{Lieu,Temp}) ->
   io:format("Température sur ~w : ~w~n", [Lieu, Temp]);
afficher(fahrenheit,{Lieu,Temp}) ->
   afficher(celsius,{Lieu, convertir(fahrenheit,celsius,Temp)}).
	
convertir(fahrenheit,celsius,Temp) ->
   (Temp - 32) * 5 / 9;
convertir(celsius,fahrenheit,Temp) ->
   9 / 5 * Temp + 32.

%% point d'entrée: max_elem/1
max_elem([Tete|Queue]) ->
   max_elem(Queue, Tete).
%% le travail se fait dans max_elem/2
max_elem([], Res) ->
    Res;
max_elem([Tete|Queue], SoFar) when Tete > SoFar ->
    max_elem(Queue, Tete);
max_elem([_|Queue], SoFar) ->
    max_elem(Queue, SoFar).

Il y a plusieurs considérations intéressantes dans ce module :

Quelques exemples d'invocation de ces fonctions suivent.

Remarques Code

L'instruction 1> montre qu'une correspondance de Patterns entre deux listes ayant un nombre différent d'éléments est illégal, alors que les instructions 2>, 3> et 4> montrent qu'il est possible de s'y prendre autrement pour décomposer une liste en ses éléments constitutifs.

Les instructions subséquentes montrent des appels à diverses fonctions du module listes ci-dessus.

Erlang R14B (erts-5.8.1.1) [smp:2:2] [rq:2] [async-threads:0]
Eshell V5.8.1.1  (abort with ^G)
1> [A, B, C] = [ yo, man ].   
** exception error: no match of right hand side value [yo,man]
2> [A, B | C] = [ yo, man ].
[yo,man]
3> C.
[]
4> A.
yo
5> c(listes).
{ok,listes}
6> listes:combien([j_aime,mon,prof]).
3
7> listes:afficher([j_aime,mon,prof]).
j_aime
mon
prof
[]
8> listes:afficher(celsius,{montreal,10}). 
Température sur montreal : 10
ok
9> listes:afficher(fahrenheit,{montreal,10}).
Température sur montreal : -12.222222222222221
ok
10> listes:max_elem([1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]).
8
11> 

Quelques concepts :


Valid XHTML 1.0 Transitional

CSS Valide !