|
|
От: |
VladD2
|
www.nemerle.org |
| Дата: | 28.03.06 01:03 | ||
| Оценка: | |||
E>template< int N >
E>struct Factorial {
E> enum { value = N * Factorial< N-1 >::value };
E>};
E>template<>
E>struct Factorial< 1 > {
E> enum { value = 1 };
E>};
E>template<>
E>struct Factorial< 0 > {};
E>using System;
macro CompileTimeFactorial(x : uint)
{
// Приведение типов (второй : ulong) требуется из-за ошибки в компиляторе :(
<[ ($(Math.Factorial(x) : ulong) : ulong) ]>
}
public module Math
{
public static Factorial(x : uint) : ulong
{
def Loop(acc : ulong, x : uint)
{
if (x <= 1) acc else Loop(acc * x, x - 1)
}
Loop (1UL, x)
}
}using System.Console;
WriteLine(Math.Factorial(20));
WriteLine(Math.Factorial(0));
WriteLine(CompileTimeFactorial(0));
WriteLine(CompileTimeFactorial(1));
WriteLine(CompileTimeFactorial(7));
WriteLine(CompileTimeFactorial(20));2432902008176640000
1
1
1
5040
2432902008176640000private static void Main()
{
Console.WriteLine(Math.Factorial(20));
Console.WriteLine(Math.Factorial(0));
Console.WriteLine((ulong) 1);
Console.WriteLine((ulong) 1);
Console.WriteLine((ulong) 0x13b0);
Console.WriteLine((ulong) 0x21c3677c82b40000);
}using System.Console;
WriteLine(Math.Factorial(-1));
WriteLine(CompileTimeFactorial(-1));Жаль, правда, что по разному.test-014.n:3:11:3:25: error: in argument #1 (x), needed a System.UInt32, got int: System.Int32 is not a subtype of System.UInt32 [simple require]
test-014.n:3:11:3:25: error: typing error in call
test-014.n:4:11:4:31: error: macro `CompileTimeFactorial' expects following list of arguments: (uint) got some 1 parameters [-1]
using System.Console;
def x = 7;
WriteLine(CompileTimeFactorial(7));test-014.n:4:11:4:31: error: macro `CompileTimeFactorial' expects following list of arguments: (uint) got some 1 parameters [x]