Quelle est la différence entre Lisp-1 et Lisp-2?

94

J'ai essayé de comprendre la différence entre Lisp-1 et Lisp-2 et comment cela se rapporte à Clojure mais je ne comprends toujours pas correctement. Quelqu'un peut-il m'éclairer?

appshare.co
la source

Réponses:

68

Selon wikipedia :

La question de savoir si un espace de noms séparé pour les fonctions est un avantage est une source de discorde dans la communauté Lisp. Il est généralement appelé le débat Lisp-1 contre Lisp-2. Lisp-1 fait référence au modèle de Scheme et Lisp-2 fait référence au modèle de Common Lisp.

Il s'agit essentiellement de savoir si les variables et les fonctions peuvent avoir le même nom sans se heurter. Clojure est un Lisp-1 signifiant qu'il ne permet pas d'utiliser le même nom pour une fonction et une variable simultanément.

Pauldoo
la source
11
Un Lisp-2 n'est-il pas plus déroutant d'avoir des fonctions et des variables avec les mêmes noms alors?
appshare.co
39
Une partie de la raison en est que les programmeurs utilisant les dialectes Lisp-2 ne font pas tout leur possible pour avoir des fonctions et des variables portant les mêmes noms. listest souvent utilisé comme paramètre de fonction et rien, OMG qui est si déroutant car (list ...)est une fonction standard. De nombreuses fonctions qui ont listcomme variable n'utilisent pas la listfonction ou ne l'utilisent pas à proximité de cette variable. Même quand cela ne se produit il est pas trop mal: (list foo list). Ce n'est pas plus déroutant qu'une phrase comme "combattez le bon combat" où le même mot apparaît comme un nom et un verbe.
Kaz
5
@Zubair Java a encore plus d'espaces de noms. Vous pouvez définir une classe, une méthode et une variable avec le même nom.
ceving
19
En tant que mnémonique, je pense que Lisp 1s a 1 espace de noms, et Lisp 2s 2 espaces de noms (un pour les fonctions et un pour les variables).
Nick McCurdy
4
@NickMcCurdy En tant que mnémonique, je pense qu'un vélo a deux roues et un tricycle en a trois.
Kaz
71

Vous aimerez peut-être lire cet article de Richard Gabriel. C'est un résumé des problèmes que la communauté Lisp discutait dans Lisp1 vs Lisp2. C'est un peu dense et lent dans les premières sections, mais c'est beaucoup plus facile à lire au moment où vous dépassez la section 5.

Fondamentalement, Lisp1 a un environnement unique qui mappe des symboles sur des valeurs, et ces valeurs peuvent être soit "régulières", soit des fonctions. Lisp2 a (au moins) deux espaces de noms (les symboles ont un emplacement pour leur valeur de fonction et un pour une valeur régulière). Ainsi, en Lisp2, vous pouvez avoir une fonction nommée foo et une valeur nommée foo, alors qu'en Lisp1, le nom foo ne peut faire référence qu'à une seule valeur (fonction ou autre).

Il y a plusieurs compromis et différences de goût entre les deux, mais lisez l'article pour plus de détails. Le livre de Christian Queinnec, "Lisp in Small Pieces", discute également des différences tissées dans le texte.

Peter McLain
la source
7
L'une des sections les plus énigmatiques de l'article de Gabriel est la section 11 sur le multitraitement. Dans cette section, il laisse entendre que Lisp1 est plus propice à un style de programmation fonctionnel, donc plus propice au multitraitement. De toute évidence, cela présente un intérêt pour Clojure. Mais je ne sais pas vraiment pourquoi Lisp1 est plus propice à la FP. Quelqu'un a-t-il un aperçu de cela?
Peter McLain
40
probablement parce que le point majeur de FP est de traiter les fonctions comme des valeurs de première classe, il est donc beaucoup plus pratique et conceptuellement plus propre de les traiter de la même manière que toutes les autres valeurs
mikera
10
@PeterMcLain Lorsque les utilisateurs de dialectes Lisp-1 disent que Lisp-1 est plus conducteur pour la programmation fonctionnelle, ce qu'ils veulent dire, c'est que vous n'avez pas à remplir le code d' opérateurs funcallet function. Ceux-ci disparaissent dans un Lisp-1.
Kaz
3
Un exemple de ce qui se passe lorsqu'un Schemer essaie d'écrire Lisp: emacs.stackexchange.com/q/28979/2787
ceving
2
vous avez utilisé l'expression "au moins" à propos de Lisp-2. La différenciation simple entre les 2 cas est la suivante: si le symbole est à la position de tête d'une expression s ou non (si c'est le cas, alors recherche dans l'espace de noms de fonction, sinon dans l'espace de noms de variable). Pouvez-vous donner des exemples d'autres cas que ces 2 cas?
Daniel Dinnyes