Сообщение Re[17]: Метапрограммисты надоели от 08.10.2014 2:13
Изменено 08.10.2014 2:20 Evgeny.Panasyuk
Здравствуйте, alex_public, Вы писали:
_>P.P.S. А если говорить о сложном МП... Могу ли я сейчас реализовать на Немерле аналог этого http://vibed.org/features#diet-templates решения? ) Ну т.е. чтобы можно было создавать отдельные файлы, целиком написанные на некотором DSL (не имеющем нечего общего с C# или Немерле, но возможно имеющем вкрапления из них), а потом писать где-то create_page("dsl file name") и в этой точке компилятор вставлял (причём с полной последующей оптимизацией) сгенерированный по тому файлу код. Ну и естественно это всё должно быть реализовано просто как библиотека на Немерле, а не какой-то внешний инструмент препросессинга.
Да, возможно, вот пример
Насколько я понял, макросы компилируются в отдельную динамическую библиотеку, которая подцепляется компилятором во время обработки "остального" кода. Такая библиотека, по сути, и является внешним инструментом. Например, предполагаю что макрос не может ссылаться на какой-либо элемент сборки использующий этот макрос, так как во время "запуска библиотеки с макросом" ещё нет той самой сборки, использующей его.
Думаю что можно подобрать некий синтетический пример показывающий ограничения такого подхода по сравнению с "не внешним" инструментом. Например, что-то типа:
P.S. В Nemerle, также, есть и другая интересная возможность: при использовании внутри кода программы некоторой compile-time-строки-DSL, IDE может подсвечивать ошибки внутри этой DSL строки.
_>P.P.S. А если говорить о сложном МП... Могу ли я сейчас реализовать на Немерле аналог этого http://vibed.org/features#diet-templates решения? ) Ну т.е. чтобы можно было создавать отдельные файлы, целиком написанные на некотором DSL (не имеющем нечего общего с C# или Немерле, но возможно имеющем вкрапления из них), а потом писать где-то create_page("dsl file name") и в этой точке компилятор вставлял (причём с полной последующей оптимизацией) сгенерированный по тому файлу код. Ну и естественно это всё должно быть реализовано просто как библиотека на Немерле, а не какой-то внешний инструмент препросессинга.
Да, возможно, вот пример
Автор: catbert
Дата: 13.12.11
.Дата: 13.12.11
Насколько я понял, макросы компилируются в отдельную динамическую библиотеку, которая подцепляется компилятором во время обработки "остального" кода. Такая библиотека, по сути, и является внешним инструментом. Например, предполагаю что макрос не может ссылаться на какой-либо элемент сборки использующий этот макрос, так как во время "запуска библиотеки с макросом" ещё нет той самой сборки, использующей его.
Думаю что можно подобрать некий синтетический пример показывающий ограничения такого подхода по сравнению с "не внешним" инструментом. Например, что-то типа:
import std.stdio;
string generator(bool x)()
{
static if(x)
return test();
else
return `string r = "wri";`;
}
string test()
{
mixin(generator!(false)());
return r ~ `teln("test\n");`;
}
void main()
{
writeln(test());
mixin(generator!(true)());
} Сходу чего-то более реального не придумал.P.S. В Nemerle, также, есть и другая интересная возможность: при использовании внутри кода программы некоторой compile-time-строки-DSL, IDE может подсвечивать ошибки внутри этой DSL строки.
Re[17]: Метапрограммисты надоели
Здравствуйте, alex_public, Вы писали:
_>P.P.S. А если говорить о сложном МП... Могу ли я сейчас реализовать на Немерле аналог этого http://vibed.org/features#diet-templates решения? ) Ну т.е. чтобы можно было создавать отдельные файлы, целиком написанные на некотором DSL (не имеющем нечего общего с C# или Немерле, но возможно имеющем вкрапления из них), а потом писать где-то create_page("dsl file name") и в этой точке компилятор вставлял (причём с полной последующей оптимизацией) сгенерированный по тому файлу код. Ну и естественно это всё должно быть реализовано просто как библиотека на Немерле, а не какой-то внешний инструмент препросессинга.
Да, возможно, вот пример
Насколько я понял, макросы компилируются в отдельную динамическую библиотеку, которая подцепляется компилятором во время обработки "остального" кода. Такая библиотека, по сути, и является внешним инструментом. Например, предполагаю что макрос не может ссылаться на какой-либо элемент сборки использующий этот макрос, так как во время "запуска библиотеки с макросом" ещё нет той самой сборки, использующей его.
Думаю что можно подобрать некий синтетический пример показывающий ограничения такого подхода по сравнению с "не внешним" инструментом. Например, что-то типа:
P.S. В Nemerle, также, есть и другая интересная возможность: при использовании внутри кода программы некоторой compile-time-строки-DSL, IDE может подсвечивать ошибки внутри этой DSL строки, например ошибку в XML.
_>P.P.S. А если говорить о сложном МП... Могу ли я сейчас реализовать на Немерле аналог этого http://vibed.org/features#diet-templates решения? ) Ну т.е. чтобы можно было создавать отдельные файлы, целиком написанные на некотором DSL (не имеющем нечего общего с C# или Немерле, но возможно имеющем вкрапления из них), а потом писать где-то create_page("dsl file name") и в этой точке компилятор вставлял (причём с полной последующей оптимизацией) сгенерированный по тому файлу код. Ну и естественно это всё должно быть реализовано просто как библиотека на Немерле, а не какой-то внешний инструмент препросессинга.
Да, возможно, вот пример
Автор: catbert
Дата: 13.12.11
.Дата: 13.12.11
Насколько я понял, макросы компилируются в отдельную динамическую библиотеку, которая подцепляется компилятором во время обработки "остального" кода. Такая библиотека, по сути, и является внешним инструментом. Например, предполагаю что макрос не может ссылаться на какой-либо элемент сборки использующий этот макрос, так как во время "запуска библиотеки с макросом" ещё нет той самой сборки, использующей его.
Думаю что можно подобрать некий синтетический пример показывающий ограничения такого подхода по сравнению с "не внешним" инструментом. Например, что-то типа:
import std.stdio;
string generator(bool x)()
{
static if(x)
return test();
else
return `string r = "wri";`;
}
string test()
{
mixin(generator!(false)());
return r ~ `teln("test\n");`;
}
void main()
{
writeln(test());
mixin(generator!(true)());
} Сходу чего-то более реального не придумал.P.S. В Nemerle, также, есть и другая интересная возможность: при использовании внутри кода программы некоторой compile-time-строки-DSL, IDE может подсвечивать ошибки внутри этой DSL строки, например ошибку в XML.