2011-04-21 3 views

Répondre

10

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:

8

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

6

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é.

Questions connexes