Unlambda
Unlambda est un langage minimal de programmation fonctionnelle inventé par David Madore[1]. Il est fondé sur le principe de la logique combinatoire, une version du lambda-calcul qui omet l'opérateur lambda. Il repose principalement sur deux fonctions intégrées (s et k) et sur un opérateur apply (écrit `, le guillemet inversé). Il constitue de ce fait un langage Turing-complet et comporte en outre quelques fonctions d'E/S permettant une interaction avec l'utilisateur, diverses fonctions de raccourcis et une fonction d'évaluation paresseuse.
Principes de base
En raison de sa nature de langage de programmation exotique, Unlambda est plus une démonstration de programmation fonctionnelle poussée à l’extrême qu’un langage utilisable à des fins pratiques. Sa caractéristique principale est son manque d’opérateurs conventionnels et de variables typées. Le seul type de données utilisable est constitué par des fonctions à un seul paramètre. L’utilisateur peut cependant simuler d’autres données en appelant des fonctions adéquates, comme en lambda-calcul. Les fonctions à plusieurs paramètres peuvent être représentées grâce à la technique de la curryfication.
Le langage Unlambda s’appuie sur les principes de la logique combinatoire, notamment en ce qui concerne l’élimination de toutes les variables en mémoire ainsi que des fonctions. Comme il s’agit d’un langage purement fonctionnel, non seulement les fonctions d’Unlambda sont des objets de première classe, mais ce sont de plus les seuls.
Une version du Hello world en Unlambda peut être [2]:
`r```````````.H.e.l.l.o. .w.o.r.l.di
Fonctions internes
La notation .x indique une fonction prenant un argument et le retournant inchangé, avec pour effet secondaire d’afficher le caractère x lorsqu’on l’appelle. i est une version de la fonction identité qui ne présente pas cet effet secondaire. On l’utilise donc comme un paramètre fictif. Le code `.di applique l’affichage de d à l’argument fictif i, renvoie i et affiche d ce faisant. De façon similaire, ``.l.di applique d’abord .l à .d, affichant l et retournant .d, qui est ensuite appliqué à i comme dans l’exemple précédent. La fonction r est une forme de sucre syntaxique qui permet d’afficher un saut de ligne.
Parmi les autres fonctions importantes d’Unlambda, on retrouve les fonctions k et s. k permet de fabriquer des fonctions constantes : ainsi `kxy retourne x quand elle est appelée, et ``kxy retourne toujours x, quels que soient x et y.
s est un opérateur d’évaluation généralisé. ```sxyz est évalué comme ``xz`yz pour tout x, y et z. Il est remarquable que les fonctions s et k soient suffisantes pour effectuer n’importe quel calcul, comme montré par l’ordinateur combinatoire SKI. On peut citer en exemple une implémentation de la fonction i par ``skk, puisque ```skkx retourne x pour tout x.
Le flux de contrôle d’Unlambda est l’appel avec continuation courante, noté c. Quand une expression de la forme `cx est évaluée, un objet spécial de continuation est construit, qui représente l’état de l’interpréteur à ce moment précis. x est ensuite évalué, et le résultat est donné à la continuation comme argument. Si la continuation ne reçoit pas d’argument, la valeur de l’expression `cx est identique à celle de x. Mais si la continuation reçoit une valeur y, l’exécution de x est arrêtée, et la valeur de toute l’expression `cx est y.
Bien que l’évaluation d’Unlambda soit normalement stricte, l’opérateur d active une option d’évaluation paresseuse. Usuellement, pour évaluer une expression de la forme `xy, Unlambda évalue en premier x, puis y, puis applique x à y. Cependant, si x a pour valeur d, y n’est pas évalué ; à la place, la valeur de l’expression `dy devient un objet spécial de continuation retardée qui, appliqué à un objet z, évalue y, puis l’applique à z. On note qu’en l’absence d’effets secondaires, c’est équivalent à `iy. La différence est que `iy exécute tout de suite les effets secondaires, tandis que `dy les retarde jusqu’à l’application du résultat à un autre argument.
Notes et références
Liens externes
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.