Let's just pretend we are binding values. There are ways to make perl look like you are doing parameter assignment.
sub {
my $builder = shift;
return sub {
my $n = shift;
return $builder->($builder)->($n);
};
}->(
sub {
my $recurse = shift;
return sub {
my $n = shift;
say "$n"; # Just a way to test
if (0 == $n) {
return 1;
}
else {
return $n * $recurse->($recurse)->($n - 1);
}
};
}
)->(5);
I was confused about the "perl can't do this" part.
Although the Fexl language itself has syntax for recursive definitions, it translates everything to combinators internally, so there are no "symbol tables" or "environments" at run time. Therefore it uses the Y combinator to implement those recursive definitions.
I would say that the y-combinator is interesting to the such a degree that it becomes useful. Sure you won't and shouldn't use the y-combinator in any real world applications. But first off it demonstrates the true power of the lambda calculus to represent computation, and more importantly to the practical programmer is that understanding it will provide a deep insight into the nature of computation, which is profoundly useful if you ask me.
It's useful for lambda functions that recursively call themselves, you don't need these in practice because you wouldn't use a lambda. You would use a named function, therefore, they are almost purely theoretical aspect of Lambda Calculus. I can't think of any programming language that is purely lambda calculus.
[+] [-] btilly|14 years ago|reply
[+] [-] Xurinos|14 years ago|reply
[+] [-] dionidium|14 years ago|reply
[+] [-] draegtun|14 years ago|reply
[+] [-] speckledjim|14 years ago|reply
I've never understood why y-combinator is useful or impressive. Interesting, maybe, but not really useful.
[+] [-] fexl|14 years ago|reply
Although the Fexl language itself has syntax for recursive definitions, it translates everything to combinators internally, so there are no "symbol tables" or "environments" at run time. Therefore it uses the Y combinator to implement those recursive definitions.
A while ago I wrote this detailed example: http://news.ycombinator.com/item?id=2719635
tl;dr here is a non-recursive definition of the append function for two lists:
If you need more parentheses for clarity, here you go:[+] [-] Homunculiheaded|14 years ago|reply
[+] [-] GregBuchholz|14 years ago|reply
http://www.dsi.uniroma1.it/~labella/absMcAdam.ps (or search with Google for an HTML translation).
[+] [-] ianl|14 years ago|reply
[+] [-] kotrin|14 years ago|reply
[+] [-] yters|14 years ago|reply
[+] [-] unknown|14 years ago|reply
[deleted]
[+] [-] guelo|14 years ago|reply
[+] [-] rjbond3rd|14 years ago|reply
[+] [-] de90|14 years ago|reply
People who see it and recognize it are the type of people he wants to catch attention from(hackers). Suits, would see it and ignore it.
[+] [-] sampsonjs|14 years ago|reply
[+] [-] SimHacker|14 years ago|reply
[+] [-] karmafeeder|14 years ago|reply