une lambda objet ?
Une lambda, c'est quoi ? C'est une fonction anonyme. Ca a l'air assez etrange dit comme ca, pourtant, on ne peut pas le presenter autrement, ces fonctions peuvent-etre passees en parametre a d'autres fonctions, on peut les mettre comme "valeurs" a des variables, bref, ces fonctions sont des valeurs comme les autres.
Dans les langages de programmation fonctionnels, on peut creer des lambdas tres facilement : exemple en ocaml
(fun x -> x+1)(2);;
Ca donne 3
En javascript, la syntaxe est la suivante :
function(x){ return x+1; }
La syntaxe est plus lourde, mais c'est pour ce genre de bout de code, que javascript EST un langage fonctionnel (en plus d'etre imperatif)
Ces fonctions sont meme la caracteristique des langages fonctionnels, d'ailleur, le premier langage de programmation etait fonctionnel, et n'integrait QUE le principe des lambdas.
Un exemple d'application de ces fonctions :
List.map (fun x -> x+1) [1; 2; 3; 4; 5; 6; 7];;
ca donne [2; 3; 4; 5; 6; 7; 8]
Ces choses semblent vraiment propres aux langages de programmations fonctionnels, cependant, il parait que microsoft l'a implemente a C#.
Le langage php ne possede pas de closures, ni de type "function", ce qui limite ce genre de choses, cependant, on peut faire des choses comme :
$foo = 'function_name';
$result=$foo($param1, $param2);
et la fonction est appellee, sur le meme principe, on peut creer une fonction anonyme, grace a create_function, mais le typage est mauvais : ca renvoie un string...
En java, j'aurais bien voulu pouvoir en faire, pour pouvoir creer un "filtre d'iterateurs", qui serait parametrable, bien sur, j'aurais pu faire une classe abstraite : filtred_iterator<E> implements Iterator<E> et ensuite faire :
Iterator it = new FiltredIterator(malistechainee.iterator()){
private boolean filtre(Truc t){ return truc.isValide(); }
};
Ca aurait parfaitement fonctionne, sauf que le fait de pouvoir composer deux fonctions offre parfois un avantage majeur (pour filtre, pas forcement, mais pour map, l'avantage est evident), et donc, j'ai pense pousser le vice beaucoup plus loin : offrir a java des fausses lambdas, avec un type, et une vraie vie. Une lambda, c'est juste une fonction qui prend un parametre pour renvoyer une valeur. En pratique, on a jamais besoin de plusieurs parametres : on utilise la currification si on veut plusieurs parametres.
interface lambda{
E a(F p);
}
la lambda incrementer peut s'ecrire comme ceci :
lambda increment = new lambda(){
public Integer a(Integer i){
return new Integer(i.intValue()+1);
}
};
System.out.println(increment.a(new Integer(5)));
La syntaxe est tres lourde, on est oblige d'utiliser la methode "a" pour appliquer la fonction, mais ca fonctionne tres bien. Pour aller plus loin, voici un exemple de currification : une lambda qui renvoie une lambda :
lambda> increment = new lambda>(){
public lambda a(final Integer i){
return new lambda(){
public Integer a(Integer j){
return j.intValue()+i.intValue();
}
};
}
};
System.out.println(increment.a(new Integer(5)).a(new Integer(9)));
Pour la lambda de composition, elle se doit d'etre generique, on doit donc faire une classe pour elle :
class composer implements lambda{
private lambda f;
private lambda g;
public composer( lambda f, lambda g){
this.f = f; this.g=g;
}
public E a(F p){
return f.a(g.a(p));
}
}
et voici un exemple d'utilisation de la composition :
lambda f =new composer(
new lambda(){
public Integer a(Integer i){
return new Integer(i.intValue()+1); } },
new lambda(){
public Integer a(Integer i){
return new Integer(i.intValue() * 2); } }
);
System.out.println(f.a(new Integer(5)));
C'est tres particulier, mais tres interessant (et euh... a eviter dans des projets serieux, c'est tres marrant a taper, mais je doute que ca soit tres politiquement correct...)
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :