Re[32]: Вопрос к Vlad2: Nemerle & R#
От: Vermicious Knid  
Дата: 27.03.06 11:19
Оценка: 5 (2)
Здравствуйте, eao197, Вы писали:

E>Вот только синтаксический оверхэд в виде template<> struct под ногами путается


А теперь вариант на D. Как говорится почувствуйте разницу.
import std.stdio;

// можно и специализацию использовать(или вообще тернарный оператор ? : )
// но я намеренно выбрал самый непохожий на C++ вариант
template fact(uint n)
{
    static if (n <= 1)
        const ulong fact = 1;
    else
        const ulong fact = n * fact!(n - 1);
}

void main()
{
    auto x = fact!(6);
    auto y = fact!(50);
    // 720 15188249005818642432
    writef("%d %d\n", x, y);
}

Правда и D, и C++ не позволяют достичь той же функциональности, что и Nemerle. Хотя D в принципе к этому чуть ближе, т.к. позволяет шаблонам принимать идентификаторы в качестве параметров(а вот выражения к сожалению нет).

E>Зато компилятор не дает вычислять факториал нуля

Это неправильно с точки зрения математики.

Самый близкий к истине вариант привел xbit. А вот полностью идеологически правильный и грамотный(имхо) вариант:
fact(n : uint) : ulong
{
  | 0 => 1
  | 1 => 1
  | _ => (x :> ulong) * fact(x - 1) 
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.