В чем разница между макросом и плагином компилятора?
Что может сделать макрос, что плагин компилятора не может, и наоборот?
Под "не могу" я подразумеваю, что невозможно достичь той же цели, а не то, что ее можно достичь другим способом.
Например, макрос может impl
некоторая черта для структуры, плагин компилятора может derive
некоторая черта для структуры. Оба они могут автоматически impl
черта для структуры.
1 ответ
Макросы плагинов компилятора могут делать все macro_rules!
Макросы могут сделать, и многое другое. Плагины компилятора могут регистрировать макросы деривации, синтезировать новые идентификаторы, деконструировать узлы AST, анализировать строки, выполнять IO файлов и т. Д. И т. Д. Перечислять все будет бессмысленно, поскольку это будет равносильно воспроизведению внутреннего API компилятора, который меняется на регулярной основе.,
Единственное главное ограничение заключается в том, что они могут получить доступ только к тому, с чем они вызваны, или что может быть получено из того, с чем они вызываются (кроме некоторой дополнительной, уже существующей контекстной информации): они не могут получить доступ или работать с чем-либо, что не существует Как типы, или что означают имена, или какое значение имеет выражение.
Хорошо, хорошо, что плагины компилятора не могут сделать то, что могут макросы: стабильно работать в разных версиях компилятора. (Пока.)