fork download
  1. local $Y = sub {
  2. local ($h) = @_;
  3. sub { local ($x) = @_; $x->($x) }->(
  4. sub {
  5. local ($g) = @_;
  6. $h->(sub { local @args = @_; $g->($g)->(@args) })
  7. }
  8. )
  9. };
  10.  
  11. local $trampoline = sub {
  12. local ($f) = @_;
  13. sub {
  14. local @args = @_;
  15. local $result = $f->(@args);
  16. while (ref($result) eq 'CODE') {
  17. $result = $result->();
  18. }
  19. $result
  20. }
  21. };
  22.  
  23. local $fac = sub {
  24. local ($n) = @_;
  25. $trampoline->(
  26. $Y->(sub {
  27. local ($f) = @_;
  28. sub {
  29. local ($n, $acc) = @_;
  30. $n == 0
  31. ? $acc
  32. : sub { $f->($n - 1, $n * $acc) }
  33. }
  34. })
  35. )->($n, 1)
  36. };
  37.  
  38. print $fac->(5), "\n";
Runtime error #stdin #stdout #stderr 0s 17496KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Can't use an undefined value as a subroutine reference at prog.pl line 15.