Здравствуйте, VladD2, Вы писали:
FDS>>Да, например в мае на C#, правда она у меня динамически компилировалась прямо в runtime в зависимости от ввода пользователя. Это было ужасно и я не знаю, как это сделать лучше... Вообще, с генерацией кода у меня всё плохо, но по ней совершенно нет ничего понятно написанного.
VD>Вот макросы — это способ сделать это не просто лучше, а почти идиально. Правда в компайлтайме, но все же.
Идеально?
FDS>>С макросами не так всё — я просто не понимаю как так можно что-то писать и я не вижу нормальной (строгой) документации по макросам.
VD>Документация есть. Зайти да nemerle.org или просто прочти статьи на нашем стайте.
Я именно их и смотрел (и там, и там). Первым делом. Но создалось впечатление, что они пытаются научить языку по примерам. Я так и не нашёл ничего похожего на спецификаию C#.
Например, где найти ответ на вопрос, как работает это:
def F2(x: int): int -> int
{
def FC(y: int): int
{
2*y + x
}
FC
}
def F1(x: int): int
{
F2(x)(5)
}
F1(5)
и работает ли вообще? Как это будет воспринято компилятором?
Или, например, я не нашёл ответ на вопрос: могу ли я во время компиляции выделить макросом кусок уже разобранного nemerle кода и выполнить с ним специфические действия (например, проверку на освобождение ресурсов или на диапазон выходных значений по заданным входным и выходным)? Могу ли я во время компиляции выполнить некоторые операции программы пользователя в штатном режиме (что-то вроде встроенного ЮТ)? [и как мне это сделать и где это описано]
Может это и есть где-то, но я не заметил
FDS>> У меня от них просто в глазах рябит (впечатление похуже, чем когда открываешь исполняемый файл в текстовом редакторе — там хоть что-то понятно).
VD>Давай конкретно. Что не понятно?
См. выше, про доступ к синтаксическому дереву.
Если я макросом генерирую другой макрос, как мне избавиться от квазицитирования, т.е. что бы компилятор не подставлял во время компиляции значение переменной Name в <[$Name]>
Почему это:
macro m(x: int)
{
for (mutable i = x - 1; i >= 0; i--)
{
<[
System.Console.WriteLine("ss {0}", $x);
]>
}
// <[()]>
};
----
macro1.n:14:1:14:25: ←[01;31merror←[0m: in argument #2 (tl) of list[System.Objec
t-], needed a list[Nemerle.Compiler.Parsetree.PExpr.Literal-], got list[int-]: c
ommon super type of types [Nemerle.Compiler.Parsetree.PExpr.Literal, int] is jus
t `System.Object', please upcast one of the types to `System.Object' if this is
desired
даёт ошибку (приведена после черты)?
В общем, некоторые вопросы рассеялись, когда я думал, что мне непонятно конкретно. Но всё равно, ощущение такое, что макросам нехватает целостности (строгости концепции).
FDS>>Не очень понял, какие вещи нужно попытаться использовать, да ещё если они непонятны? Можно приблизительный списочек: я попытаюсь.
VD>Пожалуйста. По убыванию "прикольности".
Спасибо
VD>1. Сопоставление с образцом (в том числе и в foreach) и алгеброические типы (variant-ы).
Локальные функции круче

Хотя теперь не придётся создавать массивы.
VD>2. Локальные функции.
В Delphi есть, кстати, безопаснее (хотя и менее функционально). Там, по крайней мере, нельзя написать то, что я привёл выше

.
Вообще говоря, непонятно, почему они безопасностью пожертвовали ради передачи вложенных функций в вызовы другим [невложенным] функциям
VD>4. Вывод типов.
Так и не понял, что это даёт. Кроме экономии кода, конечно (кажется, это уже обсуждали на форуме?)
VD>7. Отсуствие граблей (например, оператора as).

Мне то же понравилось
VD>8. Частичное применение функций и операторов.
VD>9. Сплайсебл-строки.
Не нашёл ни 9, ни 8. Может дадите ссылку на конкретный документ?
VD>11. Бесплатная концевая рекурсия.
Не заметил, спасибо. Я думал, что они там все на функциональном программировании совсем свихнулись
VD>12. Краткий синтаксис работы со спискам и встроенные в язык списки.
А за чем они такие нужны (если их нельзя изменять)? В документации написано, что часто используются, но я так и не понял где
VD>Пунктов еще много, но уже этих более чем достаточно. Да если честно.