Re[9]: Не пора ли нам перейти на D
От: Слоноежик  
Дата: 27.02.07 14:19
Оценка: +1
Здравствуйте, 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 это уже не относится.
для забивания гвоздя надо выбирать правильный микроскоп.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.