Qu'est-ce qu'un langage lambda?

89

Je lisais "JavaScript: The Good Parts" et l'auteur mentionne que JavaScript est le premier des langages lambda à être lancé.

Les fonctions de JavaScript sont des objets de première classe avec une portée lexicale (principalement). JavaScript est le premier langage lambda à se généraliser. Au fond, JavaScript a plus en commun avec Lisp et Scheme qu'avec Java. C'est Lisp dans les vêtements de C. Cela fait de JavaScript un langage remarquablement puissant.

Je n'ai pas compris ce qu'est un langage lambda. Quelles sont les propriétés d'un tel langage et en quoi est-il différent des langages comme Java, C, C ++ et Php?

sushil bharwani
la source
6
Lambda signifie expression anonyme. So lambda language -> language with anonymous expressions
bevacqua
Lien Google Livres, FYI: books.google.co.uk/…
Lucas Jones
3
Voir le calcul lambda sur wikipedia.
Oded
beaucoup de bonnes réponses. Ce que j'ai compris de loin, c'est que si vous utilisez une fonction anonyme, vous travaillez sur le langage lambda. est-ce correct de comprendre à quel point les langages lamda sont différents d'un langage comme java.
sushil bharwani
4
"Je lisais" JavaScript: The Good Parts "et l'auteur mentionne que JavaScript est le premier des langages lambda à être lancé." J'ai donc cherché le langage lambda sur Google et j'ai trouvé cette question sur SO :)
Bugs Bunny

Réponses:

38

Je n'ai jamais entendu personne utiliser le terme «langage lambda», et les seules définitions plausibles auxquelles je puisse penser excluraient JavaScript comme «le premier».

Cela dit, je soupçonne qu'il veut dire soit:

  • Langages fonctionnels: classe de langages dans lesquels le calcul est (ou peut être) modélisé comme une composition sans état de fonctions (éventuellement d'ordre supérieur). LISP, Scheme, ML, Haskell, etc. sont fréquemment attribués à cette classe, bien que plusieurs d'entre eux soient des paradigmes plus correctement mixtes ou des langages "fonctionnels optionnels". Javascript contient sans doute les fonctionnalités nécessaires pour rendre possible un «style fonctionnel» de programmation.
  • Langages permettant la création de fonctions anonymes (en utilisant le function syntaxe en JavaScript; ceci est écrit lambdadans de nombreux langages, d'où éventuellement des «langages lambda».

Les deux usages sont dérivés de l'utilisation de la lettre grecque lambda pour désigner l'abstraction de fonction dans le calcul lambda, le modèle de calcul conçu par Alonzo Church et sur lequel la programmation fonctionnelle est basée.

Edit: regardé le résultat de Google Livres --- "premier à devenir grand public"; eh bien, c'est discutable. J'avais avancé que LISP était à un moment au moins raisonnablement courant. C'est un bon point cependant, la sémantique de JavaScript est directement inspirée de Scheme et a certainement atteint un public plus large que tout autre langage pouvant faire des déclarations similaires.

Derrick Turk
la source
s'il vous plaît voir le lien publié par Lucas Jones lien du livre Google où il mène à la page exacte dont je parle. merci pour votre réponse.
sushil bharwani
5
La raison pour laquelle JavaScript est décrit comme étant «le premier» est que la déclaration est qualifiée de «pour devenir grand public». Je pense qu'il est assez clair que JavaScript est en effet le premier langage de style fonctionnel à être utilisé par les programmeurs de tous les jours dans leurs tâches quotidiennes.
rfunduk
1
que voulez-vous dire quand vous dites "style fonctionnel" du langage de programmation. Je viens d'un fond java et j'essaie d'apprendre javascript en quoi est-ce différent.
sushil bharwani
9
C'est un sujet énorme à explorer. L'année dernière, j'étais là où vous êtes maintenant: j'avais trouvé les essais et les conférences de Crockford et je voulais comprendre les fermetures. Je vous recommanderais de commencer par Wikipedia, puis de passer à quelques essais: John Hughes "Pourquoi la programmation fonctionnelle est importante" scribd.com/doc/26902/whyfp , Slava Akhmechet "La programmation fonctionnelle pour le reste d'entre nous" defmacro.org/ramblings /fp.html Il existe une multitude de livres pour élargir votre esprit: consultez le Little Schemer pour avoir une idée de Scheme, puis passez à la structure et à l'interprétation des programmes informatiques.
michiakig
5
@sushil: il y a beaucoup de littérature d'introduction sur le sujet. En termes généraux cependant, c'est un style de programmation qui met l'accent sur le traitement des programmes comme des objets mathématiques plutôt que comme des instructions séquentielles ou des interactions entre des objets abstraits. Par exemple, les langages fonctionnels préféreront la récursion à l'itération, utiliseront des structures de données immuables et utiliseront des fonctions d'ordre supérieur de préférence aux «objets fonction» ou aux «modèles de stratégie». Fonctions d'ordre supérieur, c'est-à-dire des fonctions qui peuvent agir (en tant qu'arguments) ou produire (en tant que valeurs de retour) d'autres fonctions.
Derrick Turk
48

Un langage lambda, en termes simples, est un langage qui permet de passer une fonction à une autre fonction, où la fonction est traitée comme n'importe quelle autre variable. De plus, vous devriez pouvoir définir cette fonction pour qu'elle soit transmise de manière anonyme (ou en ligne). PHP 5.3 a ajouté la prise en charge des fonctions lambda. JavaScript était-il le premier langage courant? Lisp a été largement utilisé dans les environnements éducatifs avant JavaScript et aussi dans la personnalisation de notre bien-aimé Emacs http://www.gnu.org/software/emacs/manual/html_node/eintr/

Voici un exemple

function applyOperation(a, b, operation) {
  return operation(a,b);
}

function add(a,b) { return a+ b; }
function subtract(a,b) {return a - b;}

// Can be called like
applyOperation(1,2, add);
applyOperation(4,5, subtract);
// Anonymous inline function
applyOperation(4,7, function(a,b) {return a * b})

En quoi est-ce différent de C? En C, vous pouvez passer un pointeur vers des fonctions, mais vous ne pouvez pas le définir en ligne de manière anonyme.

En Java (avant la version 8), pour obtenir le même effet, vous devez passer un objet qui implémente une interface, qui peut en fait être définie de manière anonyme en ligne.

Juan Mendes
la source
1
"Lisp a été largement utilisé" par qui? J'en ai toujours su, car les professeurs en parlaient toujours, mais en pratique, je n'ai jamais rencontré personne qui ait utilisé Lisp. Je dirais que n'importe qui pourrait trouver quelqu'un de sa connaissance qui a utilisé Javascript, ce qui rend Javascript beaucoup plus "courant".
palswim
"PHP 5 a ajouté le support des fonctions lambda". En fait, c'est PHP 5.3 qui a introduit les fonctions lambda.
Crozin
J'ai rencontré peu de personnes qui l'ont utilisé dans un contexte professionnel, mais comme Pascal l'a été une fois, il est largement utilisé dans les milieux éducatifs.
Juan Mendes
4

Il se réfère au calcul Lambda .

Le calcul lambda, également écrit comme λ-calcul, est un système formel de définition de fonction, d'application de fonction et de récursivité. [...]

[...] avec le calcul lambda non typé étant l'inspiration originale pour la programmation fonctionnelle, en particulier Lisp, et les calculs lambda typés servant de base aux systèmes de type modernes.

BenoitParis
la source
4

J'ai vu un lambda défini comme une fonction anonyme et comme une référence à une fonction. Javascript prend en charge à la fois:

setTimeout(function(){ /* an anonymous function */ }, 100)

var f = function(){ /* function ref */ }

C'est là que JS tire une grande partie de sa puissance et de sa flexibilité. Java prend en charge la première dans une certaine mesure (implémentations d'interface anonyme), mais pas la dernière - voir ci-dessous pour la mise à jour de Java 8.

Je ne sais pas laquelle (ou les deux) de ces éléments est la bonne définition d'un lambda.

JS n'est certainement pas le premier langage à prendre en charge ces fonctionnalités. Partant de mémoire, je pense que son petit discours dit que les amateurs de langues sont toujours ravis de soutenir les lambdas.

BTW: En Java, une classe anonyme est généralement utilisée pour passer une définition de classe à la volée pour un argument (beaucoup utilisé en swing). Quelque chose comme ça (de mémoire, non compilé):

someGuiContainer(new WidgetInterface()
      {
           public void importantMethodToDefine(){
             // Handle having the method called in my special widget way
           }
        }
)

Mettre à jour

Java, à partir de 8, est désormais officiellement un langage Lambda.

Vous pouvez maintenant utiliser la syntaxe suivante:

MathOperation addition = (int a, int b) -> a + b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));

Source du code

mtyson
la source
1

Dans le cours ouvert du MIT appelé structure et interprétation des programmes informatiques, un livre de Hal Abelson, Jerry Sussman et Julie Sussman. Ils discutent Scheme, qui est un dialecte de LISP et y expliquent une explication très détaillée et claire de ce qu'est lambda et Scheme LISP et des langues en général. Je vous recommande fortement de le regarder si vous souhaitez avoir une compréhension vraiment claire et approfondie de la programmation informatique. Vous expliquer prendrait trois fois plus de temps que si vous y alliez et lisez simplement le livre ou regardez les tutoriels qui l'expliquent parfaitement, c'est du génie.

Javascript est principalement basé sur le langage Scheme et son père Lisp, et en plus il a pris sa structure lamda et est devenu courant avec elle.

Max
la source
0

De wikipedia: Dans les langages de programmation tels que Lisp et Python, lambda est un opérateur utilisé pour désigner des fonctions anonymes ou des fermetures, suivant l'utilisation du calcul lambda. Un exemple de cette utilisation de lambda dans le langage Python est cette section de code informatique qui trie une liste par ordre alphabétique du dernier caractère de chaque entrée:

>>> list = ['woman', 'man', 'horse', 'boat', 'plane', 'dog']
>>> sorted(list, key=lambda word: word[-1])
['horse', 'plane', 'dog', 'woman', 'man', 'boat']

* In the C# programming language a lambda expression is an anonymous function that can contain expressions and statements
r3nrut
la source
0
  • JavaScript permet de définir une fonction anonyme qui est une fonction qui n'est pas liée à un identifiant. Cette fonction est également connue sous le nom d'abstraction Lambda et puisque JS la prend en charge, elle est appelée langage Lambda.

  • Propriétés: Cette fonction est nécessaire en cas d'exécution immédiate d'une fonction ou pour une utilisation à court terme, où il n'y a aucune signification de donner un nom à une fonction.

  • Il est différent des langages comme Java, C, C ++ et PHP, car dans JS, les fonctions anonymes sont utilisées pour la fermeture et le currying.

MERLIN THOMAS
la source