Здравствуйте, VladD2, Вы писали:
[вытоптано]
VD>и на Nemerle:
VD>VD>Factorial(n : uint) : ulong
VD>{
VD> | 0 | 1 => 1
VD> | _ => n * Factorial(n - 1)
VD>}
VD>
[тут тоже немного затоптано]
VD>На Nemerle мы получили просто функцю. Мы можем вызвать ее в программе как любую другую. Теперь чтобы вычислить эту функцию во время компляции мы просто помещаем ее вызов в макрос:
VD>VD>macro CompileTimeFactorial(n : uint)
VD>{
VD> def res = Util.Factorial(n);
VD> <[ $(res : ulong) ]>
VD>}
VD>
VD>в котором мы производим вычисление и помещаем результат вычисления код генерируемый макросом.
Вот пример эквивалентного кода из D
ulong factorial(uint index)
{
if (index == 0 || index == 1)
{
return index;
}
return index * factorial(index - 1);
}
и макроса который заставляет вычислить ф-цию в время компиляции
template eval(A...) { alias A eval; }
//использование
static result = eval!(factorial(5));
И в отличии от Nemerle не надо для каждой функции писать макрос обертку.
VD>В обличии от D или C++ мы вольны произвести в макросе вычисления любой сложности. Так если у нас уже есть нужная функция которую нужно вычислить во время компиляции, то мы просто вызваем ее в макросе и получаем требуемый результатм.
VD>То есть для нас нет разницы между кодом программы и метакодом. В D же и в С++ мы вынждены писать метакод на птичьех языках которые сильно отличаются от того языка что мы вынуждены применять в реальной программе.
Ну D это уже не относится.