Note: Je ne demande pas qui apprendre, ce qui est mieux, ou quelque chose comme ça.
I picked up the free version of SICP because I felt it would be nice to read (I’ve heard good stuff about it, and I’m interestd in that sort of side of programming).
Je sais que Scheme est un dialecte de Lisp et je me suis demandé: quelle est la différence entre Scheme et Common Lisp?
Il semble y avoir beaucoup de choses à propos de ‘CL a un stdlib plus grand … Le schéma n’est pas bon pour la programmation du monde réel ..’ mais pas de chose réelle disant ‘c’est parce que CL est ceci / a ceci’.
C’est une question un peu délicate, car les différences sont à la fois techniques et (à mon avis) culturelles. Une réponse ne peut que fournir une vue imprécise et subjective. C’est ce que je vais vous fournir ici. Pour des détails techniques bruts, voir le schéma Wiki .
Scheme est un langage basé sur le principe de fournir un substrat de langage de base élégant, cohérent, bien pensé, sur lequel des langages d’application pratiques et académiques peuvent être construits.
Il est rare que vous trouviez quelqu’un écrivant une application dans un schéma R5RS (ou R6RS) pur, et en raison de la norme minimaliste, la plupart du code n’est pas portable dans les implémentations Scheme. Cela signifie que vous devrez choisir soigneusement votre implémentation Scheme, si vous souhaitez écrire une sorte d’application utilisateur final, car le choix déterminera en grande partie quelles bibliothèques sont à votre disposition. D’un autre côté, la liberté relative dans la conception du langage d’application réel signifie que les implémentations de schémas fournissent souvent des fonctionnalités inconnues ailleurs; Le PLT Racket, par exemple, vous permet d’utiliser le typage statique et fournit un IDE très compatible avec les langages.
L’interopérabilité au-delà du langage de base est assurée par le processus SRFI piloté par la communauté, mais la disponibilité de chaque SRFI donnée varie selon la mise en œuvre.
La plupart des dialectes et bibliothèques de schémas se concentrent sur les idiomes de programmation fonctionnels tels que la récursivité au lieu de l’itération. Il existe différents systèmes d’objects que vous pouvez charger en tant que bibliothèques lorsque vous voulez faire de la POO, mais l’intégration avec le code existant dépend fortement du dialecte Scheme et de sa culture (le schéma de poulet semble plus orienté object que Racket, par exemple).
La programmation interactive est un autre point dans lequel les sous-communautés de Scheme diffèrent. MIT Scheme est connu pour son fort soutien à l’interactivité, tandis que le PLT Racket est beaucoup plus statique. Dans tous les cas, la programmation interactive ne semble pas être une préoccupation centrale pour la plupart des sous-communautés Scheme, et je n’ai pas encore vu un environnement de programmation aussi interactif que la plupart des Common Lisps ».
Common Lisp est un langage usé conçu pour la programmation pratique. Il est plein de verrues moche et de hacks de compatibilité – tout le contraire du minimalisme élégant de Scheme. Mais il est aussi beaucoup plus caractéristique lorsqu’il est pris pour lui-même.
Common Lisp a créé un écosystème relativement important de bibliothèques portables. Vous pouvez généralement changer d’implémentation à tout moment, même après le déploiement de l’application, sans trop de problèmes. En général, Common Lisp est beaucoup plus uniforme que Scheme, et des expériences de langage plus radicales, si elles sont effectuées, sont généralement intégrées à une bibliothèque portable plutôt que de définir un nouveau dialecte de langue. De ce fait, les extensions de langage ont tendance à être plus conservasortingces, mais aussi plus combinables (et souvent facultatives).
Les extensions de langage universellement utiles, telles que les interfaces de fonctions étrangères, ne sont pas développées par des moyens formels mais s’appuient sur des bibliothèques quasi standard disponibles sur toutes les principales implémentations Common Lisp.
Les langages de langage sont un mélange sauvage d’approches fonctionnelles, impératives et orientées object, et en général, Common Lisp ressemble plus à un langage impératif qu’à un langage fonctionnel. Il est également extrêmement dynamic, sans doute plus que n’importe quel langage de script dynamic (la redéfinition des classes s’applique aux instances existantes, par exemple, et le système de gestion des conditions intègre l’interactivité), et la programmation exploratoire interactive joue un rôle important. “la voie commune de Lisp.” Cela se reflète également dans les environnements de programmation disponibles pour Common Lisp, qui offrent pratiquement toutes une interaction directe avec le compilateur Lisp en cours d’exécution.
Common Lisp dispose d’un système d’object intégré (CLOS), un système de gestion des conditions nettement plus puissant que la simple gestion des exceptions, une capacité de traçabilité à l’exécution et divers types de structures de données et d’utilisations intégrées (notamment la macro LOOP notoire, une itération). le sous-langage beaucoup trop laid pour Scheme mais beaucoup trop utile pour ne pas le mentionner, ainsi qu’un mécanisme de formatage ressemblant à printf avec le support de GOTO dans les chaînes de format.
En raison du développement interactif basé sur l’image et du langage plus large, les implémentations Lisp sont généralement moins portables entre les systèmes d’exploitation que les implémentations Scheme. Faire fonctionner un Common Lisp sur un périphérique embarqué, par exemple, n’est pas adapté aux faibles. De même que pour la machine virtuelle Java, vous avez également tendance à rencontrer des problèmes sur les machines sur lesquelles la mémoire virtuelle est restreinte (comme les serveurs virtuels basés sur OpenVZ). Les implémentations de schémas, en revanche, ont tendance à être plus compactes et portables. La qualité croissante de l’implémentation ECL a quelque peu atténué ce point, même si son essence est toujours vraie.
Si vous vous souciez du support commercial, quelques sociétés proposent leurs propres implémentations Common Lisp, notamment des générateurs graphiques, des systèmes de bases de données spécialisés, etc.
En résumé , Scheme est un langage plus élégant. C’est principalement un langage fonctionnel avec des fonctionnalités dynamics. Ses implémentations représentent différents dialectes incompatibles avec des caractéristiques distinctives. Common Lisp est un langage à part entière, très dynamic et à paradigmes multiples avec diverses fonctionnalités laides mais pragmatiques, dont les implémentations sont largement compatibles entre elles. Les dialectes de schémas tendent à être plus statiques et moins interactifs que Common Lisp; Les implémentations courantes de Lisp ont tendance à être plus lourdes et plus difficiles à installer.
Quelle que soit la langue que vous choisissez, je vous souhaite beaucoup de plaisir! 🙂
Quelques différences pratiques de base:
(function ...)
, et appeler explicitement une fonction stockée dans une valeur en utilisant (funcall ...)
nil
(la liste vide) est considéré comme faux (par exemple dans if
), et est la seule valeur fausse. Dans Scheme, la liste vide est considérée comme vraie et (le distinct) #f
est la seule valeur fausse C’est une question difficile à répondre avec impartialité, surtout parce que beaucoup de personnes du LISP classeraient Scheme comme un LISP.
Josh Bloch (et cette analogie n’est peut-être pas son invention) décrit le choix d’une langue comme étant le choix d’un pub local. Dans cette optique, alors:
Le pub “Scheme” a beaucoup de chercheurs en langages de programmation. Ces personnes accordent beaucoup d’attention à la signification de la langue, à sa définition, à sa simplicité et à la discussion de nouvelles fonctionnalités innovantes. Chacun a sa propre version du langage, conçue pour lui permettre d’explorer son propre coin de langage de programmation. Les gens du Scheme aiment vraiment la syntaxe entre parenthèses qu’ils ont prise du LISP; Il est flexible, léger et uniforme et élimine de nombreux obstacles à l’extension de la langue.
Le pub “LISP”? Eh bien … je ne devrais pas commenter; Je n’ai pas passé assez de temps là-bas :).
schème:
lisp commun:
Ce sont des points, bien sûr, il y en a beaucoup d’autres, dont je ne me souviens plus en ce moment.