packages feed

ychr-0.1.0.0: test/golden/lambda_test/lambda_test.chr

:- module(lambda_test, [result/2, fun double/1, fun apply/2, fun apply2/3, fun make_adder/1, type(tags/0)]).
:- chr_constraint result/2.
:- chr_type tags ---> test1 ; test2 ; test3 ; test4 ; test5 ; test6 ; test7.
:- function double/1.
:- function apply/2.
:- function apply2/3.
:- function make_adder/1.

double(X) -> X + X.

apply(F, X) -> '$call'(F, X).
apply2(F, X, Y) -> '$call'(F, X, Y).

% Returns a 1-arg lambda that adds N.
make_adder(N) -> fun(X) -> X + N end.

% Test 1: function reference
result(test1, R) <=> R is apply(fun double/1, 5).

% Test 2: lambda
result(test2, R) <=> R is apply(fun(X) -> X + 1 end, 5).

% Test 3: lambda with free variable
result(test3, R) <=> Offset is 10, R is apply(fun(X) -> X + Offset end, 5).

% Test 4: 2-arg lambda
result(test4, R) <=> R is apply2(fun(X, Y) -> X + Y end, 3, 4).

% Test 5: function returning a lambda (closure)
result(test5, R) <=> F is make_adder(10), R is '$call'(F, 20).

% Test 6: direct call in body
result(test6, R) <=> R is '$call'(fun(X) -> X + 100 end, 1).

% Test 7: wildcards in lambdas
result(test7, R) <=> R is '$call'(fun(X, _) -> X end, 1, 2).