Mercurial > hg > octave-lojdl
changeset 14331:9a276049f18b
maint: add file omitted from last commit
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sun, 05 Feb 2012 15:35:32 -0500 |
parents | 23782766da08 |
children | affda9a8f7d0 |
files | test/test_bug_31371.m |
diffstat | 1 files changed, 40 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/test/test_bug_31371.m @@ -0,0 +1,40 @@ +%!test +%! % Work around MATLAB bug where f(x)(y) is invalid syntax +%! % (This bug does not apply to Octave) +%! C = @(f,x) f(x); +%! C2 = @(f,x,y) f(x,y); +%! +%! % Church Booleans +%! T = @(t,f) t; +%! F = @(t,f) f; +%! +%! % Church Numerals in MATLAB +%! Zero = @(f,x) x; +%! One = @(f,x) f(x); +%! Two = @(f,x) f(f(x)); +%! Three = @(f,x) f(f(f(x))); +%! Four = @(f,x) f(f(f(f(x)))); +%! +%! % Arithmetic Operations +%! Inc = @(a) @(f,x) f(a(f,x)); % Increment +%! Add = @(a,b) @(f,x) a(f,b(f,x)); +%! Mult = @(a,b) @(f,x) a(@(x) b(f,x),x); +%! Dec = @(a) @(f,x) C(a(@(g) @(h) h(g(f)), @(u) x), @(u) u); % Decrement +%! Sub = @(a,b) b(Dec, a); +%! +%! % Renderer - Convert church numeral to "real" number +%! render = @(n) n(@(n) n+1,0); +%! +%! % Predicates +%! iszero = @(n) n(@(x) F, T); +%! +%! % Y combinator implements recursion +%! Y = @(f) C(@(g) f(@(x) C(g(g), x)), ... +%! @(g) f(@(x) C(g(g), x))); +%! +%! Factorial = Y(@(f) @(n) C(C2(iszero(n), ... +%! @(d) One, @(d) Mult(n, f(Dec(n)))),0)); +%! +%! assert (render(Factorial(Two), 2)) +%! assert (render(Factorial(Three), 3)) +%! assert (render(Factorial(Four), 12))