Compare commits
1 Commits
nightly-v2
...
grackle-la
Author | SHA1 | Date | |
---|---|---|---|
c84c4ab578 |
@ -511,6 +511,7 @@ fn define_recursive_function() {
|
|||||||
let (plan, _scope) = must_plan(program);
|
let (plan, _scope) = must_plan(program);
|
||||||
assert_eq!(plan, Vec::new())
|
assert_eq!(plan, Vec::new())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn use_kcl_function_as_param() {
|
fn use_kcl_function_as_param() {
|
||||||
let program = "fn wrapper = (f) => {
|
let program = "fn wrapper = (f) => {
|
||||||
@ -538,6 +539,142 @@ fn use_kcl_function_as_param() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn use_kcl_function_y_combinator() {
|
||||||
|
let program = "
|
||||||
|
// TRUE := λx.λy.x
|
||||||
|
fn _TRUE = (x) => {
|
||||||
|
return (y) => { return x }
|
||||||
|
}
|
||||||
|
|
||||||
|
// FALSE := λx.λy.y
|
||||||
|
fn _FALSE = (x) => {
|
||||||
|
return (y) => { return y }
|
||||||
|
}
|
||||||
|
|
||||||
|
// constant false (no matter what is applied, the falsey value is returned)
|
||||||
|
fn cFalse = (x) => {
|
||||||
|
return _FALSE
|
||||||
|
}
|
||||||
|
|
||||||
|
// ISZERO := λn.n (λx.FALSE) TRUE
|
||||||
|
fn is_zero = (n) => {
|
||||||
|
let fa = n(cFalse)
|
||||||
|
return fa(_TRUE)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IFTHENELSE := λp.λa.λb.p a b
|
||||||
|
fn ifthenelse = (p) => {
|
||||||
|
return (a) => {
|
||||||
|
return (b) => {
|
||||||
|
let fa = p(a)
|
||||||
|
return fa(b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SUCC := λn.λf.λx.f (n f x)
|
||||||
|
// Inserts another (f x) in the church numeral chain
|
||||||
|
fn succ = (n) => {
|
||||||
|
return (f) => {
|
||||||
|
return (x) => {
|
||||||
|
let fa = n(f)
|
||||||
|
let fb = fa(x)
|
||||||
|
return f(fb)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PLUS := λm.λn.m SUCC n
|
||||||
|
fn plus = (m) => {
|
||||||
|
return (n) => {
|
||||||
|
let fa = m(succ)
|
||||||
|
return fa(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0 := λf.λx.x
|
||||||
|
fn _0 = (f) => {
|
||||||
|
return (x) => { return x }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cZero = (x) => {
|
||||||
|
return _0
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1 := λf.λx.f x
|
||||||
|
fn _1 = (f) => {
|
||||||
|
return (x) => { return f(x) }
|
||||||
|
}
|
||||||
|
|
||||||
|
let _2 = succ(_1)
|
||||||
|
let _3 = succ(_2)
|
||||||
|
let _4 = succ(_3)
|
||||||
|
let _5 = succ(_4)
|
||||||
|
let _6 = succ(_5)
|
||||||
|
// ...
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// PRED := λn.n (λg.λk.ISZERO (g 1) k (PLUS (g k) 1)) (λv.0) 0
|
||||||
|
fn pred = (n) => {
|
||||||
|
fn f1 = (g) => {
|
||||||
|
return (k) => {
|
||||||
|
let fa = is_zero(g(_1))
|
||||||
|
let fb = fa(k)
|
||||||
|
let fc1 = plus(g(k))
|
||||||
|
let fc2 = fc1(_1)
|
||||||
|
let fc = fb(fc2)
|
||||||
|
return fc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let f2 = n(f1)
|
||||||
|
let f3 = f2(cZero)
|
||||||
|
let f4 = f3(_0)
|
||||||
|
return f4
|
||||||
|
}
|
||||||
|
|
||||||
|
// MUL := λm.λn.m (PLUS n) 0
|
||||||
|
fn mul = (m) => {
|
||||||
|
return (n) => {
|
||||||
|
let fa = m(plus(n))
|
||||||
|
let fb = fa(_0)
|
||||||
|
return fb
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// G := λr. λn.(1, if n = 0; else n × (r (n−1)))
|
||||||
|
fn G = (r) => {
|
||||||
|
return (n) => {
|
||||||
|
let fa = ifthenelse(n)
|
||||||
|
let fb = fa(_1)
|
||||||
|
let fc1 = mul(n)
|
||||||
|
let fc2 = fc1(r(pred(n)))
|
||||||
|
let fc = fb(fc2)
|
||||||
|
return fc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Y := λg.(λx.g (x x)) (λx.g (x x))
|
||||||
|
fn Y = (g) => {
|
||||||
|
fn f1 = (x) => { return g(x(x)) }
|
||||||
|
let f2 = g(f1)
|
||||||
|
let f3 = f2(f1)
|
||||||
|
return f3
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fact = (n) => {
|
||||||
|
let fa = Y(G)
|
||||||
|
return fa(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
// x should be _6
|
||||||
|
let x = fact(_3)
|
||||||
|
";
|
||||||
|
|
||||||
|
let (plan, scope) = must_plan(program);
|
||||||
|
// Somehow check the result is the same as _6 definition
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn use_kcl_functions_with_params() {
|
fn use_kcl_functions_with_params() {
|
||||||
for (i, program) in [
|
for (i, program) in [
|
||||||
|
Reference in New Issue
Block a user