Lisp a-t-il encore une fonction spéciale qui N'A PAS été adoptée par d'autres langages de programmation?
Par Lisp, j'entends tous les langages de programmation Lisp dans leur ensemble. On m'a dit à quel point Lisp est incroyable et je sais que de nombreuses langues ont été inspirées par Lisp. Mais Lisp a-t-il toujours une fonctionnalité de design exclusive qui ne peut tout simplement pas être réalisée dans une autre langue?
La raison pour laquelle j'ai posé la question est que récemment, étant moi-même un programmeur amateur, j'ai commencé à apprendre Clojure juste pour le plaisir, et le résultat est que j'ai trouvé beaucoup de commentaires et de messages liés à Lisp, ne disant qu'une chose: "Lisp est unique ", mais d’autres langages de programmation modernes ont déjà adopté et volé de nombreuses idées de Lisp, telles que les conditions, la récursivité et la fonction de citoyen de premier plan. Et même la métaprogrammation peut être faite en plusieurs langues.
Ai-je oublié quelque chose et est-ce que "Lisp est toujours différent"?
Ou j'ai de la chance parce que d'autres langues modernes ont volé toutes les bonnes parties à Lisp, de sorte qu'il n'est pas nécessaire de creuser dans le monde Lisp entre parenthèses et que "Lisp était différent".
Réponses:
Ce qui a rendu Lisp différent est une référence canonique pour ce type de question . Les deux caractéristiques clés restantes de Lisp qui ne sont pas largement disponibles, selon cet article au moment de sa rédaction, sont:
Le commentaire aborde chaque point et nomme les langues populaires où cette fonctionnalité est disponible.
Notez que cet article a été révisé pour la dernière fois en 2002 et qu'au cours des 11 dernières années, de nombreux nouveaux langages ont été créés, dont certains peuvent incorporer toutes ces fonctionnalités Lisp dans leur conception.
la source
eval
ou similaire, et beaucoup peuvent faire de la métaprogrammation, par exemple Template Haskell. La chose (sans doute) unique à propos de Lisp est que la représentation des données, du code et du méta-code est la même - pas seulement dans la syntaxe, mais en réalité, c'est la même chose.Il est difficile de répondre à cette question, car il faudrait connaître toutes les langues pour savoir qu'aucune autre fonctionnalité ne dispose d'une fonctionnalité particulière disponible dans Lisp. Ce qui suit est basé sur les langues que j'ai expérimentées.
De mémoire, les conditions sont quelque chose que je n'ai pas vu dans une autre langue. Pensez aux "exceptions", mais si la pile d'appels n'est pas déroulée et si l'appelant peut envoyer une valeur de récupération au site d'exception, sans perturber la pile d'appels entre le gestionnaire et la source de l'exception. Pour être juste, il ne s'agit en réalité que d'une application spéciale des continuations, de sorte que Ruby et Scheme (au moins) peuvent le faire.
Le système macro de Lisp bénéficie de la régularité / homoiconicité, mais Scala envisage de les incorporer en tant que fonctionnalité stable dans la version 2.12 et Template Haskell revendique des fonctionnalités similaires. Je dirais qu'ils seront plus complexes sur le plan syntaxique qu'avec Lisp, mais la génération de code au moment de la compilation existe malgré tout.
En y pensant bien, la construction simple de formulaires n’est qu’un type de macro disponible dans Lisp: je n’ai jamais vu d’équivalent de macros de compilation ou de lecture.
La capacité de certains dialectes (par exemple, SBCL ) à enregistrer une image de processus complète et pouvant être reprise est cool, mais encore une fois, elle n’est pas unique: Smalltalk le fait depuis des décennies.
Beaucoup d'autres langages autorisent l'assignation de déstructuration lors du renvoi de tableaux, mais les méthodes # 'valeurs et #' affectations / valeurs multiples semblent toujours être spécifiques à Common Lisp et Scheme (qui peut également effectuer une déstructuration 'régulière' ). "Wantarray" de Perl permet à une fonction de déterminer si elle est appelée dans un contexte scalaire, list ou vide afin de pouvoir ajuster sa valeur de retour de manière similaire (-ish), mais je n'ai pas vu de "vraies" valeurs de retour multiples en dehors du régime / CL.
En termes de fonctionnalités linguistiques, Lisp ne peut probablement pas faire beaucoup plus que les autres langues (la complétude de Turing étant ce qu'elle est). Ce qu'il est , cependant, est une langue où le code est exprimé en termes de ses propres structures de données, ce qui rend la Big Idea ™ -Que code de données quelque chose qui est relativement facile à travailler.
la source
Après tant de décennies, je ne pense pas qu'il y ait quelque chose d'exclusif à Lisp. Mais même aujourd'hui, il y a beaucoup de choses intéressantes difficiles à trouver en dehors de Lisps. Quelques choses qui me viennent à l’esprit:
Enfin, il y a beaucoup plus à apprendre de Lisp qui ne concerne pas la langue elle-même mais qui est devenue une partie de l'histoire de Lisp et qui s'est perdue dans le temps. Par exemple, Interlisp, Symbolics Genera, etc ... si vous ne mettez jamais la main sur Genera, consultez ce fil de discussion comp.lang.lisp où Kent Pitman décrit comment "Emacs n’est qu’une ombre pâle des Zmacs de Genera" - qui a été activé par ayant un système Lisp puissant dont Zmacs faisait partie, qui fonctionnait sur une machine Lisp.
la source
Ce n'est pas nécessairement une caractéristique unique . C’est l’apparence et la convivialité de certains ensembles de fonctionnalités.
JavaScript ou Java ont beaucoup de fonctionnalités de Lisp (machine virtuelle, compilateur / évaluateur, garbage collection, etc.). Mais JavaScript, par exemple, manque de la partie programmation symbolique, des capacités mathématiques (en interne, il n’a que des flottants), de la gestion des erreurs, etc.
De nombreux systèmes Common Lisp sont optimisés pour une voie de développement où l'on étend de nouveaux logiciels de manière incrémentielle, en développant le langage Lisp dans diverses dimensions en utilisant diverses techniques de méta-programmation - sans redémarrer le logiciel pendant longtemps. Il doit donc être flexible et extensible, mais en même temps robuste. Changer la langue (les macros sont essentiellement un moyen pour l’utilisateur d’étendre le compilateur) sans faire planter le programme.
Maintenant, quelque chose comme JavaScript est également utilisé pour étendre un programme, généralement un navigateur Web. Mais la plupart du temps, on ne fait pas beaucoup de méta-programmation en JavaScript - à part du piratage POO .
Exemple:
On peut mettre en oeuvre un logiciel général avancé de mathématiques pour le domaine de la calcul formel de deux manières: écrire le moteur en C avec un langage spécialisé au dessus (comme Mathematica ) ou dans un dialecte Lisp plus avancé. Macsyma / Maxima en Common Lisp, Réduire en Standard Lisp, Axiom en Common Lisp.
(Il y a aussi un ou plusieurs écrits en Python.)
Il n'y a pas beaucoup de systèmes qui offrent l'ensemble des fonctionnalités de quelque chose comme Axiom , qui s'exécute sur Common Lisp.
Ce qui a rendu Lisp attractif pour ce type d’applications, c’est un mélange de fonctionnalités: mathématiques de base avancées (bignums, ratios, ...), calcul symbolique, compilateur interactif, etc. Il est tout à fait possible d’obtenir ces éléments en les implémentant dans niveau de langue. De cette façon, on aura implémenté 50% ou plus d’un système Lisp typique.
la source
Pas autant que je sache. Forth est facilement aussi dynamique que Lisp, peut-être davantage car le code dynamique dans Forth ressemble à du code Forth standard, tandis que les macros Lisp ont tendance à utiliser des fonctionnalités différentes de celles du code Lisp standard (dans Clojure au moins, je n'ai jamais utilisé de citation de syntaxe en dehors d'une macro) et Par conséquent, leur apparence est très différente du code Lisp habituel. Pour illustrer le dynamisme de Forth, voici un moyen d'implémenter des commentaires dans Forth :
la source
Lisp a de nombreux dialectes et chacun d’eux a son propre ensemble de fonctionnalités. Ma fonctionnalité préférée qui n’a probablement pas été adoptée par une autre langue est la "pile de spaghettis" d’ Interlisp .
La pile de spaghettis est comme une fermeture, mais sur des stéroïdes. Il enregistre non seulement la fonction actuelle, mais tout le contexte jusqu'au sommet de la pile. Quelque chose qui ressemble à une co-routine , sauf que vous pouvez les créer de manière arbitraire, ce qui entraîne une hiérarchie des contextes de pile.
la source