Time for an 2014 update…
This commit is contained in:
parent
372c577f83
commit
09687c4926
2520 changed files with 34227 additions and 7318 deletions
|
|
@ -1,31 +1,25 @@
|
|||
import std.stdio, std.traits, std.algorithm, std.range;
|
||||
|
||||
auto Y(F)(F f) {
|
||||
alias D = void delegate();
|
||||
alias Ret = ReturnType!(ParameterTypeTuple!F);
|
||||
alias Args = ParameterTypeTuple!(ParameterTypeTuple!F);
|
||||
|
||||
return ((Ret delegate(Args) delegate(D) x) =>
|
||||
x(cast(D)x))(
|
||||
(D y) =>
|
||||
f((Args args) =>
|
||||
(cast(Ret delegate(Args))(cast(D delegate(D))y)(y))(args)
|
||||
)
|
||||
);
|
||||
auto Y(S, T...)(S delegate(T) delegate(S delegate(T)) f) {
|
||||
static struct F {
|
||||
S delegate(T) delegate(F) f;
|
||||
alias f this;
|
||||
}
|
||||
return (x => x(x))(F(x => f((T v) => x(x)(v))));
|
||||
}
|
||||
|
||||
void main() { // Demo code --------------------
|
||||
auto factorial = Y((int delegate(int) self) =>
|
||||
(int n) => 0 == n ? 1 : n * self(n - 1)
|
||||
);
|
||||
void main() { // Demo code:
|
||||
auto factorial = Y((int delegate(int) self) =>
|
||||
(int n) => 0 == n ? 1 : n * self(n - 1)
|
||||
);
|
||||
|
||||
auto ackermann = Y((ulong delegate(ulong, ulong) self) =>
|
||||
(ulong m, ulong n) {
|
||||
if (m == 0) return n + 1;
|
||||
if (n == 0) return self(m - 1, 1);
|
||||
return self(m - 1, self(m, n - 1));
|
||||
auto ackermann = Y((ulong delegate(ulong, ulong) self) =>
|
||||
(ulong m, ulong n) {
|
||||
if (m == 0) return n + 1;
|
||||
if (n == 0) return self(m - 1, 1);
|
||||
return self(m - 1, self(m, n - 1));
|
||||
});
|
||||
|
||||
writeln("factorial: ", 10.iota.map!factorial);
|
||||
writeln("ackermann(3, 5): ", ackermann(3, 5));
|
||||
writeln("factorial: ", 10.iota.map!factorial);
|
||||
writeln("ackermann(3, 5): ", ackermann(3, 5));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue