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?
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?
Réponses:
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.
list
est 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 list
comme variable n'utilisent pas la list
fonction 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.
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.
funcall
et function
. Ceux-ci disparaissent dans un Lisp-1.