Y combinator: Difference between revisions

Add lang example
(→‎{{header|SuperCollider}}: clarify why we need z to make the call lazy)
(Add lang example)
Line 3,815:
-> 34
 
</syntaxhighlight>
 
=={{header|Lang}}==
Y combinator function:
<syntaxhighlight lang="lang">
# Disable warning for shadowing of predefined function
lang.errorOutput = -1
 
fp.combY = (fp.f) -> {
# fp.f must be provided by the function with a partially called combinator function, because fp.f will not be available in the callee scope
fp.func = (fp.f, fp.x) -> {
fp.callFunc = (fp.f, fp.x, &args...) -> return fp.f(fp.x(fp.x))(&args...)
return fn.combAN(fp.callFunc, fp.f, fp.x)
}
return fn.combM(fn.combA2(fp.func, fp.f))
}
 
# Re-enable warning output
lang.errorOutput = 1
</syntaxhighlight>
 
Usage (Factorial):
<syntaxhighlight lang="lang">
fp.fac = (fp.func) -> {
fp.retFunc = (fp.func, $n) -> {
return parser.op($n < 2?1:$n * fp.func(parser.op($n - 1)))
}
return fn.combAN(fp.retFunc, fp.func)
}
 
# Apply Y combinator
fp.facY = fp.combY(fp.fac)
 
# Use function
fn.println(fp.facY(10))
</syntaxhighlight>
 
Usage (Fibonacci):
<syntaxhighlight lang="lang">
fp.fib = (fp.func) -> {
fp.retFunc = (fp.func, $x) -> {
return parser.op($x < 2?$:fp.func(parser.op($x - 2)) + fp.func(parser.op($x - 1)))
}
return fn.combAN(fp.retFunc, fp.func)
}
 
fp.fibY = fp.combY(fp.fib)
 
fn.println(fp.fibY(10))
</syntaxhighlight>
 
168

edits