Time for an 2014 update…

This commit is contained in:
Ingy döt Net 2014-01-17 05:32:22 +00:00
parent 372c577f83
commit 09687c4926
2520 changed files with 34227 additions and 7318 deletions

View file

@ -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));
}

View file

@ -23,5 +23,5 @@ labda f:
1
set :fib Y
. fac 6
. fib 6
!. fac 6
!. fib 6

View file

@ -1,14 +1,11 @@
irb(main):001:0> Y = lambda do |f|
irb(main):002:1* lambda {|g| g[g]}[lambda do |g|
irb(main):003:3* f[lambda {|*args| g[g][*args]}]
irb(main):004:3> end]
irb(main):005:1> end
=> #<Proc:0x00000204f5e6e0@(irb):1 (lambda)>
irb(main):006:0> Fac = lambda{|f| lambda{|n| n < 2 ? 1 : n * f[n-1]}}
=> #<Proc:0x00000202a88aa0@(irb):6 (lambda)>
irb(main):007:0> Array.new(10) {|i| Y[Fac][i]}
=> [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
irb(main):008:0> Fib = lambda{|f| lambda{|n| n < 2 ? n : f[n-1] + f[n-2]}}
=> #<Proc:0x00000201a968b8@(irb):8 (lambda)>
irb(main):009:0> Array.new(10) {|i| Y[Fib][i]}
=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
y = lambda do |f|
lambda {|g| g[g]}[lambda do |g|
f[lambda {|*args| g[g][*args]}]
end]
end
fac = lambda{|f| lambda{|n| n < 2 ? 1 : n * f[n-1]}}
p Array.new(10) {|i| y[fac][i]} #=> [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
fib = lambda{|f| lambda{|n| n < 2 ? n : f[n-1] + f[n-2]}}
p Array.new(10) {|i| y[fib][i]} #=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

View file

@ -4,10 +4,10 @@ def y(&f)
end.tap {|g| break g[g]}
end
Fac = y {|&f| lambda {|n| n < 2 ? 1 : n * f[n - 1]}}
Fib = y {|&f| lambda {|n| n < 2 ? n : f[n - 1] + f[n - 2]}}
fac = y {|&f| lambda {|n| n < 2 ? 1 : n * f[n - 1]}}
fib = y {|&f| lambda {|n| n < 2 ? n : f[n - 1] + f[n - 2]}}
p Array.new(10) {|i| Fac[i]}
p Array.new(10) {|i| fac[i]}
# => [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
p Array.new(10) {|i| Fib[i]}
p Array.new(10) {|i| fib[i]}
# => [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]