Je commence avec Clojure, qui est aussi mon premier LISP. Il y a évidemment beaucoup à prendre, et dans une tentative de diminuer la charge cognitive, j'essaie de trouver les pièces que je peux ignorer en toute sécurité (pour l'instant).
peut-on traiter en toute sécurité des formes avec des macros et des formes avec des constructions intégrées De même, ou y a-t-il des pièges qui vont sortir plus tard? p>
En d'autres termes, vais-je rencontrer une situation où j'ai besoin de savoir que (defn F1 []) code> se développe à p>
3 Réponses :
Je suis moi-même un clojure, mais un peu plus de temps à essayer la langue. P>
Je peux dire que les macros intégrées de clojure sont très sûres pour que vous puissiez les utiliser sans même savoir qu'ils sont des macros. P>
En particulier, parce que Clojure se concentre beaucoup plus sur l'immuabilité que la LISP commune, il est plus difficile pour vous de tomber dans un bug résultant d'une macro macro. p>
Donc, non, vous ne rencontrerez pas une situation où vous devez savoir sur les internes d'une macro intégrée. Mais si vous voulez comprendre les internes de votre macro personnalisée, il y a toujours
Les macros en général composent très différemment. Les macros ne sont pas des "citoyens de première classe": vous ne pouvez pas les transmettre à le fait que si c'est pas une fonction em> deviendra très apparent. Il suffit de garder à l'esprit que les macros ne sont pas des fonctions et que vous devriez être aussi bien :) p> PS: les macros sont mapper code>, etc., vous ne pouvez pas les stocker dans des variables et que vous ne pouvez pas appliquer code> eux à une liste d'arguments. Initialement, vous n'avez pas besoin de vous inquiéter de ceux-ci car ils seront évidemment em> ne fonctionnent pas: une erreur subtile et difficile à détecter serait beaucoup plus troublante. Si vous essayez d'exécuter (fn (fn (fn :-d): ^ p): o) Code> p> p>
Merci, je n'avais pas pensé à passer par inadvertance une macro à une fonction d'ordre supérieur.
Cela semble aborder le contraire de la préoccupation de l'OP: vous éliminez une distinction entre les macros et les formes spéciales, et (b) des fonctions. Ni des formes spéciales ni des macros ne peuvent être transmises comme des arguments à une fonction d'ordre supérieur, comme la carte; Il demande s'il y a des moyens dans quelles formes spéciales sont de manière significative différente des macros.
Le "si" dans "si c'est pas une fonction i>" devrait vraiment être dans un bloc de code.
Dans presque tous les cas, vous pouvez ignorer complètement la distinction. (Et en fait, vous avez, car fn n'est pas intégré non plus - c'est une macro expansion à fn *) p>
La seule exception que j'ai rencontrée est que les macros et les intégrés se comportent différemment si vous essayez de les redéfinir. Ne redéfinissez aucune fonctionnalité existante et vous allez bien les traiter de la même manière. P>