J'ai utilisé Clojure beaucoup récemment mais je ne comprends toujours pas quelles fonctionnalités je ne comprends pas que les macros de lecteur Lisp commun. Peut expliquer expliquer cela en termes simples?Quel est l'avantage des macros du lecteur Lisp commun que Clojure n'a pas?
Répondre
En bref, les macros de lecteur vous permettent de redéfinir la syntaxe du langage de programmation dans un contexte délimité. Par exemple, vous pouvez implémenter des littéraux d'expression régulière (par exemple, #"pattern"
) en tant que macros de lecteur. Sans eux, vous seriez obligé d'échapper correctement les expressions régulières dans les littéraux de chaîne transmis à re-pattern
.
BTW, alors qu'il n'y a pas d'API Clojure publique pour modifier le lecteur, il est impossible, comme illustré dans ces messages:
Un exemple simple. Common Lisp a une syntaxe de lecteur différente pour les vecteurs #() au lieu de []. Mais avec la possibilité de créer des macros de lecteur personnalisées, vous pouvez avoir une macro de lecteur qui traslate [2 3 4 5] à un vecteur dans Common Lisp. Comme la plupart des utilisateurs ne connaissent pas la signification des macros de lecteurs que l'on a créées, ils sont rarement utilisés et pour éviter toute confusion, Rich Hickey a décidé de supprimer la possibilité d'avoir des macros de lecture définies par l'utilisateur dans Clojure. Clojure, cependant, a prédéfini des macros lecteur - citation, vecteur, regex, carte, etc
en Common Lisp la Le lecteur est extensible par l'utilisateur avec des macros de lecteur. Le lecteur est responsable de lire s-expressions. S-expressions sont une syntaxe textuelle externe pour les types de données de Lisp comme des nombres, des chaînes, des symboles, des listes, conses, des structures, des tableaux, des personnages, ...
Le lecteur n'est pas responsable de la syntaxe du langage de programmation Lisp - juste pour s-expressions.
Ainsi, le but principal, du point de vue de l'utilisateur, pour les macros de lecture est d'étendre ou de modifier la syntaxe des expressions-s. Par exemple, l'utilisateur peut ajouter une syntaxe textuelle pour différentes classes CLOS (comme les URL, ...), les tables de hachage, les identifiants spéciaux, les nouveaux types de nombres, ...
Parfois, il est également utilisé pour intégrer la syntaxe d'autres langages/syntaxe, qui ont des règles différentes pour former des jetons: Embedded SQL, Embedded C, des expressions infixes, des appels intégrés à Objective C, des langages de règles incorporées, du XML embarqué, du JSON incorporé et plus encore.
Une autre utilisation est de permettre à l'utilisateur d'avoir un contrôle supplémentaire sur les expressions s, le lecteur lit réellement. Par exemple des expressions d'entités conditionnelles. Ainsi, les macros de lecteur programmables par l'utilisateur permettent à l'utilisateur de personnaliser le lecteur en fonction des fonctionnalités décrites ci-dessus. On peut imaginer que cela est utile pour les utilisateurs qui souhaitent personnaliser la langue au niveau de la syntaxe/jeton de données, mais cela ajoute une autre couche de complexité.
- 1. Livre pour apprendre à écrire des macros Clojure/Lisp
- 2. Gestion des macros de lecteur dans Common Lisp
- 3. Évaluation Clojure des macros
- 4. Clojure # = lecteur macro
- 5. Clojure REPL du lecteur USB
- 6. Lisp commun, CFFI, et l'instanciation des structures
- 7. Traitement des paramètres & rest en Lisp commun
- 8. Répétition des éléments dans le lisp commun
- 9. Clojure/Conception du client LISP REST
- 10. Problème avec les macros Lisp
- 11. Conception par contrat (s) pour Lisp commun?
- 12. Chemin idiomatique pour remplacer (null x) la fonction du Lisp commun dans clojure
- 13. Incrustation d'une fonction avec des macros Clojure
- 14. macros et fonctions dans Clojure
- 15. Quel est l'équivalent clojure de l'idiome Python "if __name__ == '__main__'"?
- 16. Est-ce que ce code Clojure est indenté correctement?
- 17. Implémentation de macros de style de schéma dans clojure
- 18. Qu'est-ce que | 5E | signifie en Lisp commun?
- 19. Portée Lisp commun (dynamique vs lexical)
- 20. tours de hanoi en lisp commun
- 21. Différence entre let * et set? en commun Lisp
- 22. Apprenez les macros dans le schéma de On Lisp
- 23. une question sur le lisp commun
- 24. idiome commun de lisp - est-il un meilleur moyen?
- 25. lisp commun comment transformer la liste des paramètres de repos
- 26. Quel est l'ancêtre commun des éléments visuels en C#?
- 27. read-line dans le lisp commun
- 28. Quel est l'équivalent idiomatique des structures C dans Lisp?
- 29. Comment créer des variables en séquence dans Lisp commun?
- 30. lisp commun: comment une macro peut-elle définir d'autres méthodes/macros avec des noms générés par programme?