I'm working on a new module that exports some interesting functions. These functions describe other functions or variables with a closure, so naturally I'd assume the syntax to be something as light and snazzy as this:
somefunction foo { $bar++ };
sub foo { ... };
Or, if describing a variable:
somefunction $foo { $bar++ };
Turns out that you can't do this, as the documentation clearly states: An & requires an anonymous subroutine, which, if passed as the first argument, does not require the "sub" keyword or a subsequent comma.
Hopefully, my final syntax will appear like the following:
# for subroutines
somefunction foo => sub { $bar++}
# for lvalues
somefunction $foo => sub { $bar++ }
It's a little repetitive with the equal-arrows and sub keyword, but at least I've used prototypes (specifically, *&) to save the typing of excess parenthesis.
somefunction foo => sub { $bar++ };
There's no escaping it, except maybe via source filtering. (Did I just hear something heavy falling onto the floor?)
Yes, I admit it, I've been thinking along the same lines a long time ago.
Re:Semicolon
statico on 2005-05-23T22:24:44
Ah, yes. I meant to include it.
And no, no source filtering. (The axe that fell missed you by a few inches. Whew!)
You can omit the sub keyword only when the closure is the first thing in the parameter list.
The usual workaround is a do-nothing function with only the closure as prototyped parameter:
sub as(&;*) { @_ }
Then you can say
describe $foo as { $bar + $baz };
or whatever. Though this is questionable in the sense that it has to be looked up in the documentation, whereas the not-so-pretty solution is plainly obvious to anyone who knows enough Perl.