LINUX.ORG.RU

История изменений

Исправление q0tw4, (текущая версия) :

Смысл макросов в том, что программирование (особенно в статически типизированных языках) порой становится очень монотонным процессом и кодер превращается в подмастерье, выполняя монотонную повторяющуюся работу. К примеру если надо реализовать индесацию туплов, приходится мало того что выписывать инстанцы для всех размерностей туплов так еще и в реализации каждого индексатора делать свич на каждый индекс, что приводит к квадратичному количеству кода от количества поддерживаемых размерностей. В некоторых особо запущенных случаях количество кода и вовсе экспоненциально зависит от параметров. Вот тут как раз и приходят на выручку макросы. И пусть идут лесом те, кто заставляют меня генерировать код в виде строки, так как невозможно в компилтайме убедится, что генерируемый код при любых входных данных будет хотя бы синтаксически корректен.

И еще, нет особой разницы вкомплировать ли строку внутри кода в самого себя или запустить из мейкфайла отдельный скрипт, который сгенерит отдельный файл с кодом. Единственная тонкость в том, как смешивать сгенерированый код с ручным, и тут есть 2 подхода: задать куски ручного кода на вход генератору кода или, как сделано в сишарпе, пойти навстречу кодогенераторам в синтаксисе самого языка, разрешая сборку одного класса из разных файлов. Ну еще можно инклюдить сгенерированый код внутрь ручного, но для этого нужен препроцессор, который по сути тоже строковый кодогенератор с ручными кусками кода на входе. И вся эта головная боль запросто лечится АСТ-шными макросами, если использовать их с умом.

Исходная версия q0tw4, :

Смысл макросов в том, что программирование (особенно в статически типизированных языках) порой становится очень монотонным процессом и кодер превращается в подмастерье, выполняя монотонную повторяющуюся работу. К примеру если надо реализовать индесацию туплов, приходится мало того что выписывать инстанцы для всех размерностей туплов так еще и в реализации каждого индексатора делать свич на каждый индекс, что приводит к квадратичному количеству кода от количества поддерживаемых размерностей. В некоторых особо запущенных случаях количество кода и вовсе экспоненциально зависит от параметров. Вот тут как раз и приходят на выручку макросы. И пусть идут лесом те, кто заставляют меня генерировать код в виде строки, так как невозможно в компилтайме убедится, что генерируемый код при любых входных данных будет хотя бы синтаксически корректен.

И еще, нет особой разницы вкомплировать ли строку внутри кода в самого себя или запустить из мейкфайла отдельный скрипт, который сгенерит отдельный файл с кодом. Единственная тонкость в том, как смешивать сгенерированый код с ручным, и тут есть 2 подхода - задать куски ручного кода на вход генератору кода или, как сделано в сишарпе, пойти навстречу кодогенераторам в синтаксисе самого языка, разрешая сборку одного класса из разных файлов. Ну еще можно инклюдить сгенерированый код внутрь ручного, но для этого нужен препроцессор, который по сути тоже строковый кодогенератор с ручными кусками кода на входе. И вся эта головная боль запросто лечится АСТ-шными макросами, если использовать их с умом.