11
votes

C utilise-t-il des expressions Lambda?

Et, si c'est le cas, comment utilisez-vous un? (Syntaxe)

Aussi, pourquoi fait ou pourquoi ne pas prendre en charge les expressions Lambda?


0 commentaires

4 Réponses :


10
votes

Non, c n'a pas de soutien pour les expressions Lambda.

Si vous êtes prêt à utiliser C ++, Boost a une bibliothèque qui émule Lambdas. En outre, C ++ 0X aura une prise en charge intégrée aux expressions Lambda.

Il n'y avait pas une demande énorme de soutien d'expression de Lambda en C à l'époque, la langue ne l'appuie pas.


1 commentaires

... je t'aime. Et maintenant j'aime le débordement de la pile, parce que c'était rapide!



3
votes

Non, C n'a pas d'expressions Lambda (ni autre moyen de créer des fermetures).

Ceci est probable, car c est une langue de bas niveau qui évite les fonctionnalités qui pourraient avoir une mauvaise performance et / ou rendre le système de langue ou de temps d'exécution plus complexe.


0 commentaires

5
votes

C ne prend pas en charge les expressions Lambda, ni aucune autre manière (dans la norme de la langue) de créer de manière dynamique des fonctions - toutes les fonctions, conformément à la norme, sont créées au moment de la compilation. Je suppose que la raison est de garder la langue petite, simple, maigre et très rapide, avec pratiquement aucune "bibliothèque d'exécution" nécessaire - cruciale pour une langue si largement utilisée dans les systèmes d'exploitation de programmation, les pilotes de périphérique, les applications intégrées et ainsi de suite.


5 commentaires

L'expression de Lambda ne nécessite pas de créer de manière dynamique une fonction. Il s'agit simplement de créer un objet qui fait référence à une fonction (éventuellement nominale) qui est déjà compilée.


@Mike, en C, vous pouvez vous reporter aux fonctions existantes via un pointeur (en effet, une mention du nom de la fonction "désintègre" à un pointeur, c'est donc assez élégant et faisable).


Je pense que Mike a un point. Vous pouvez en théorie chez C une syntaxe de style Lambda sans fermetures, pour définir dans une expression une fonction comme x => x * x et évaluer à un pointeur sur cette fonction, tout sans casser la contrainte que vous mentionnez. Ce n'est que lorsque vous voulez que votre Lambda accède à sa portée environnante qu'il devient impossible avec un pointeur de fonction C typique composé de l'adresse du code. Si ces fonctions sans contexte devraient être appelées à juste titre "lambdas" ou non, je ne sais pas.


Et maintenant je me demande quoi (si quelque chose) pourrait être fait dans une implémentation C dans laquelle les pointeurs de fonction sont plus gros que les pointeurs d'objet, de sorte qu'ils peuvent contenir une adresse de code comme normale mais aussi un pointeur de contexte (qui serait nommé pour nommé C Fonctions et pointez sur un morceau de pile pour des fonctions anonymes définies en utilisant une syntaxe d'extension). De toute évidence, cela se passe bien plus que la norme C veut infliger des exécutants. Mais éventuellement moins de tracas que c ++ des classes de base à des membres virtuels.


@Steve, clang a un support "lambda" en C utilisant blocs . Voir la spécification à clang.llvm.org/docs/blocklanguagesPec.txt et Stackoverflow.com/questions/2395040/how-do-Clang-Blocks -work



0
votes

J'ai vu ceci aujourd'hui: https://github.com/wd5gnr/ clambda / blob / maître / clambda2.c

Voir ici le code du lien ci-dessus: xxx

et fonctionne bien dans GCC.


0 commentaires