Interview: Qu’est-ce que l’expression Lambda?

J’ai eu récemment deux entretiens téléphoniques.

Dans les deux interviews, on m’a demandé comme dernière question de définir une expression Lambda.

J’ai affirmé que l’expression Lambda est une méthode sans nom à la place d’un délégué. Mais ça ne suffisait pas.

Je trouve très difficile d’expliquer cela précisément lors d’un entretien téléphonique.

Est-ce que quelqu’un sait mieux?

Les expressions Lambda sont des fonctions sans nom données en tant que valeurs constantes. Ils peuvent apparaître n’importe où que n’importe quelle autre constante, mais sont généralement écrits en tant que paramètre pour une autre fonction. L’exemple canonique est que vous passerez une fonction de comparaison à une routine générique de «sorting», et que, au lieu de vous efforcer de définir une fonction entière (et de provoquer la discontinuité lexicale et la pollution des espaces de nommage), passer une expression lambda décrivant la comparaison.

Cependant, l’une des caractéristiques les plus importantes des expressions Lambda est qu’elles s’exécutent dans le contexte de leur apparence. Par conséquent, ils peuvent utiliser les valeurs des variables définies dans ce contexte. Cela différencie les pointeurs de fonctions des expressions lambda vraies. Dans les langages prenant en charge les variables mutables, les expressions lambda appropriées permettent de modifier les valeurs de ces variables.

Les expressions Lambda apparaissent (avec une syntaxe différente) dans tous les LISPs, Perl, Python et dans les versions suffisamment récentes de C ++, Objective C, C # et Java 8, mais pas dans C même si une excuse pour eux) autour de parameters. Ils sont un élément de syntaxe avec une sémantique particulière, et ces sémantiques imposent plus d’exigences à l’exécution que C n’a été conçu.

Une expression lambda est une suspension de code sans nom.

Considérez cette fonction anonyme “multiplier deux choses” (aussi appelée expression lambda), en utilisant une notation très non spécifique.

λ(x, y) -> x * y 

Votre réponse était très spécifique à un endroit où vous avez utilisé des lambdas (je suppose que C #?), Et je pense que l’intervieweur demandait une compréhension plus générale. Le concept de délégué, le langage C # et l’idée d’une méthode sont tous secondaires par rapport à ce qu’est un lambda et à son fonctionnement. Vous pouvez, par exemple, utiliser des expressions lambda sur papier , sans aucune méthode.

Peut-être qu’ils voulaient juste entendre que LINQ était “Language-Integrated Query”.

Cela étant dit, s’ils veulent vraiment une explication de “ce que” LINQ est composé, j’aurais probablement inclus plus d’informations que vous avez fournies. Quelque chose comme:

LINQ, ou Language-Integrated Query, est un ensemble d’ajouts de langues et de classes d’infrastructure ajoutées à .NET 3.5 qui permettent une approche plus fonctionnelle des opérations d’interrogation. Il est basé sur des méthodes d’extension pour IEnumerable et IQueryable et leurs contreparties génériques qui permettent l’exécution différée dans LINQ to Objects et le traitement à distance via IQueryable, ainsi que de nombreuses autres fonctionnalités. Des modifications de langage ont également été apscopes à C # et VB.NET pour prendre en charge une syntaxe de requête plus “naturelle” directement dans le langage.

Eh bien, j’ai dit que Linq est une méthode sans nom à la place d’un délégué.

En fait, ce n’est pas du tout LINQ, mais une “expression lambda”. Et techniquement, LINQ ne les utilise même pas.

LINQ signifie “Language Integrated Query”. Plus précisément, ce sont les mots-clés “from … where .. select” (c’est-à-dire la syntaxe de requête intégrée au langage ).

Maintenant, pour que ces mots-clés fassent les choses, beaucoup plus a été ajouté au langage (et au CLR) (tels que lambdas, les méthodes d’extension, la classe Enumerable, etc.).

Pour répondre à votre question révisée, pour cela, vous répondez que c’est vraiment bien. Le seul changement que je ferais serait de souligner le mot “inline”.

L’expression Lambda est une méthode sans nom écrite en ligne à l’emplacement où un délégué est requirejs.

Vous devriez regarder dans Expression Lambda en msdn

Ils recherchent probablement que vous sachiez que LINQ est le nouveau DSL pour interroger les objects IQueryable et IEnumerable . La syntaxe “from … where … select …”, essentiellement. Le fait de savoir qu’il est implémenté sous les couvertures avec des lambda et un style fonctionnel vous permettra probablement d’obtenir des points bonus.