159 votes

Quels sont les outils sont là pour la programmation fonctionnelle en C ?

J'ai beaucoup réfléchi ces derniers temps sur la façon de faire de la programmation fonctionnelle en C (pas C++). De toute évidence, C est un langage procédural et n'a pas vraiment de soutien de la programmation fonctionnelle en mode natif.

Existe-il un compilateur/extensions de langage que d'ajouter quelques constructions de programmation fonctionnelle, à la langue? GCC fournit des fonctions imbriquées comme une extension du langage; fonctions imbriquées peuvent accéder à des variables de la mère cadre de la pile, mais c'est encore un long chemin loin de la maturité des fermetures.

Par exemple, une chose qui je pense pourrait être vraiment utile dans C est que, partout où un pointeur de fonction est prévue, vous pourriez être en mesure de passer d'une expression lambda, la création d'un système de verrouillage qui se désintègre en un pointeur de fonction. C++0x va inclure les expressions lambda (qui je pense est génial); cependant, je suis à la recherche d'outils applicables à droite C.

[Edit] Pour être clair, je ne suis pas en train de résoudre un problème particulier en C qui serait plus adapté à la programmation fonctionnelle; je suis simplement curieux de savoir quels sont les outils sont là, que si je voulais le faire.

92voto

Joe D Points 1545

Vous pouvez utiliser les fonctions imbriquées du CCG pour simuler les expressions lambda, en fait, j’ai une macro de le faire pour moi :

Utiliser comme ceci :

71voto

Andy Till Points 1619

Programmation fonctionnelle n’est pas sur les expressions lambda, il s’agit de fonctions pures. Donc ce qui suit largement promouvoir style fonctionnel :

  1. Utilisez uniquement les arguments de la fonction, n’utilisez pas l’état global.
  2. Réduire au minimum les effets secondaires c'est-à-dire printf, ou n’importe quel IO. Retourner des données décrivant des e/s qui peuvent être exécutées au lieu de provoquer les effets secondaires directement dans toutes les fonctions.

Ceci peut être réalisé en c clair, pas besoin de magie.

42voto

ephemient Points 87003

FFCALL vous permet de construire des fermetures en C -- callback = alloc_callback(&function, data) renvoie un pointeur de fonction telles que callback(arg1, ...) est équivalent à l'appel de function(data, arg1, ...). Vous aurez à gérer la collecte des ordures manuellement, cependant.

Par ailleurs, les blocs ont été ajoutés à Apple fourche de la GCC; ils ne sont pas des pointeurs de fonction, mais ils vous permettent de passer des lambdas, tout en évitant la nécessité de construire et de stockage gratuit pour les variables à la main (en fait, une certaine forme de reproduction et de comptage de référence qui se passe, caché derrière un sucre syntaxique de l'exécution et des bibliothèques).

17voto

FooF Points 1388

Hartel & de Muller can livre, C fonctionnelle, de nos jours (2012-01-02) se trouve à : http://eprints.eemcs.utwente.nl/1077/ (il y a un lien vers la version PDF).

15voto

Robert Gamble Points 41984

Au lieu de chercher de hacks et les extensions non portable pour essayer de transformer quelque chose il n’est pas C pourquoi ne pas juste utiliser un langage qui fournit la fonctionnalité vous cherchez ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X