("Откочевал" из темы про О7)


> -- budden писал(а):
> Возвращаясь к макросам, если взглянуть на заголовочники ядра линукса, то там макрос на макросе и макросом погоняет. Конечно, можно много изображать благородство и говорить, что макросы не нужны, но тогда встаёт вопрос, а как же писать переносимые программы? В A2 этот вопрос решён, но препроцессор там всё же есть, состоящий из двух отдельных инструментов, которые в сумме дают часть функционала cpp, а также решается на уровне конфигурации. Часть решения зашита и в сам язык в виде переменного размера некоторых типов. Помогает здесь и возможность переименовывать модули при импорте. В итоге получается целостное и работающее решение, которое даже можно похвалить. Видимо, в Oberon07 такого нет, при том, что язык сам по себе не абстрактен от железа, ведь SET же имеет переменный размер. Поскольку в A2 возможность писать переносимые программы возникает только в комплексе из языка, его реализации и системы сборки, которая не является частью языка. Здесь можно говорить о том, что какого-то необходимого функционала в O7 недостаёт. Конечно, всегда есть такой вариант, как клонировать весь код, который прямо или косвенно зависит от особенностей платформы, но ведь в условии задачи было "не выкидывать то, что потом придётся делать".
В Modula-3 экосистеме сумели сделать переносимость без макросов, а разными наборами .i3 и .m3 модулей для пар ОS-CPU и(или) разных разрядностей процессора. Но в последнее время переносят многое на уровне кода на Си/C++ ( cm3 двуязычная система). Т.о. неясно удалось ли полностью избежать применения макросов, или они "изящно" спрятаны на ближнем к аппаратуре слое модулей.


> -- budden писал(а):
> Я сделал какие-то макросы для Яра-22, учитывающие синтаксис, т.е. отличающие выражение, оператор и составной оператор, однако они получились сильно неэлегантными. Также и в Scala были большие проблемы с внедрением макросов. По сути дела элегантных вариантов я вижу только два: как в Си на уровне текста, где производится упрощённый анализ, как в препроцессоре (шаблоны с <> являются в принципе в каком-то смысле разновидностью оных) и как в лиспе. В полновесной AST слишком много полей и слишком много разных видов узлов. Например, отдельный узел для составного оператора, для простого оператора (как присваивание) и для выражения. С другой стороны, в лиспе макросы мешают отладке и нужно много с этим возиться. Можно ещё посмотреть, как сделано в Расте - вроде язык модный. Хотя конечно, в лиспе макросы пишутся слишком легко и соблазн их писать велик, поскольку язык без этого довольно неудобный. Возможно, что золотая середина находится где-то в другом месте, но я её пока что не нашёл.Честно говоря, я хотел про макросы Julia написать детальнее, но не нашёл компактного технологического описания обработки оных на этапе компиляции. Насколько я понял, первым же шагом "человеко-читаемый" синтаксис преобразуется в нечто. И оно обрабатывается кодом(?) на Schеme.