NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.

Full
Abbreviated
Hidden
• not in HOP(Score:1)

by brev (1827) on 2005.05.24 3:24 (#40683)
I haven't even finished HOP yet, but I just digested a large Javascript tome [oreilly.com] for work reasons. JS has a few higher-ordery features that Perl doesn't.

An interesting twist on eval, Function() creates a function reference out of an array of strings.

And this JS 1.5 syntax, which gives an anonymous closure a temporary name so it can refer to itself.

var f = function fact(x) { if (x <=1) return 1; else return x*fact(x-1); }

Despite appearances, there is no fact(). That was just a name for use during the definition of f.

I have tried to do this in Perl and failed. Someone told me one could do it with a Y combinator.

• Re:not in HOP(Score:2)

One is tempted to do this:

my \$f = sub { (\$_[0] <=1) ? 1 : ( \$_[0] * \$f->(\$_[0] - 1)) };
print \$f->(4);

But that doesn't work, because sub is defined outside the scope of \$f. So you've got to do this:

my \$f;
\$f = sub { (\$_[0] <=1) ? 1 : ( \$_[0] * \$f->(\$_[0] - 1)) };
print \$f->(4);

That works!

(GC note: now \$f and that sub constitute a circular data structure, so you need to do \$f='whatever'; (or just undef(\$f)) to break the circularity.)

• Re:not in HOP(Score:1)

Huh. Now I wonder why what I was trying didn't work. That seems relatively straightforward, with the slight inconvenience of defining the variable first. Callee was another weirdness I noticed too. Thanks.
• And with arguments.callee(Score:2)

Also:
var f = function (x) { if (x <=1) return 1; else return x * arguments.callee(x-1); };