Если вы представляете, что макрос просто раскрывается в то место, где он используется, то вы также можете представить, что если вы используете переменную a
в своем макросе, возможно, уже будет переменной a
определено в месте, где используется этот макрос.
Это , а не a
, который вы хотите!
Макросистема, в которой нечто подобное не может произойти, называется гигиеническая .
Существует несколько способов решения этой проблемы. Один из способов - просто использовать в своих макросах очень длинные, очень загадочные, очень непредсказуемые имена переменных.
Немного более изощренной версией этого подхода является gensym
, используемый некоторыми другими макрос-системами: вместо you программист придумал очень длинное, очень загадочное, очень непредсказуемое имя переменной, Вы можете вызвать функцию gensym
, которая генерирует очень длинное, очень загадочное, очень непредсказуемое и уникальное имя переменной для вас .
И, как я сказал, в гигиенической макросистеме такие столкновения не могут происходить в первую очередь. Как сделать макросистему гигиенической, сам по себе интересный вопрос, и сообщество Scheme потратило несколько десятилетий на этот вопрос, и они продолжают придумывать лучшие и лучшие способы сделать это.