DESCRIPTION
Kavorka provides the "fun" keyword for the purpose of defining functions (as against methods, etc).The anatomy of a function:
- 1.
- The keyword introducing the function.
- 2.
- The function name (optional).
- 3.
- The signature (optional).
- 4.
- Traits (optional).
- 5.
- The prototype (optional).
- 6.
- The attribute list (optional).
- 7.
- The function body.
Example:
# (1) (2) (3) (4) (5) (6) (7)
fun foobar ($foo, $bar) is cool :($$) :cached { return $foo + $bar }
# (1) (6)
my $f = fun { return $_[0] + $_[1] };
The Keyword
This requires very little explanation. If you're no fun, and don't like the name "fun", you can export it with a different name:
use Kavorka fun => { -as => 'function' };
The Function Name
If present, it specifies the name of the function being defined. If no name is present, the declaration is an expression that evaluates to a reference to the function in question.Functions are automatically forward-declared; a la
sub foobar ($$);
but are installed into the symbol table at run-time. So this works:
if ($ENV{DEBUG}) {
fun foobar { ... }
}
else {
fun foobar { ... }
}
It is possible to install the function at compile time using the "begin" trait:
fun foobar but begin { ... }
It is possible to define lexical functions using a lexical variable for a function name:
fun my $add ($x, $y) {
$x + $y;
}
my $sum = $add->(20, 22);
The Signature
See Kavorka::Manual::Signatures.Traits
See Kavorka::Manual::ExtendingKavorka.The Prototype
See Kavorka::Manual::PrototypeAndAttributes.The Attributes
Attributes may alternatively be provided before the signature.See Kavorka::Manual::PrototypeAndAttributes.
The Function Body
This is more or less what you'd expect from the function body you'd write with sub, however the lexical variables for parameters are pre-declared and pre-populated.f, func, and function
These are all aliases for "fun", though not exported by default.
use v5.14;
use Kavorka qw( function f );
function make_plusser (Num $x = 1)
{
return f(Num $y) { $x + $y };
}
my $plusser = make_plusser();
say $plusser->(41); # says 42
BUGS
Please report any bugs to <http://rt.cpan.org/Dist/Display.html?Queue=Kavorka>.AUTHOR
Toby Inkster <[email protected]>.COPYRIGHT AND LICENCE
This software is copyright (c) 2013-2014 by Toby Inkster.This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
DISCLAIMER OF WARRANTIES
THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.

