line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
=head1 NAME |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
Memoize::Once - memoise expression on first execution |
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
=head1 SYNOPSIS |
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
use Memoize::Once qw(once); |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
$value = once(expensive_computation()); |
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
=head1 DESCRIPTION |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
This module supplies an operator that causes an expression to be evaluated |
14
|
|
|
|
|
|
|
only once per program run, memoising its value for the remainder of |
15
|
|
|
|
|
|
|
the run. |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
=cut |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
package Memoize::Once; |
20
|
|
|
|
|
|
|
|
21
|
11
|
|
|
11
|
|
952989
|
{ use 5.006; } |
|
11
|
|
|
|
|
57
|
|
22
|
11
|
|
|
11
|
|
86
|
use warnings; |
|
11
|
|
|
|
|
35
|
|
|
11
|
|
|
|
|
434
|
|
23
|
11
|
|
|
11
|
|
86
|
use strict; |
|
11
|
|
|
|
|
34
|
|
|
11
|
|
|
|
|
465
|
|
24
|
|
|
|
|
|
|
|
25
|
11
|
|
|
11
|
|
4384
|
use Devel::CallChecker 0.003 (); |
|
11
|
|
|
|
|
16521
|
|
|
11
|
|
|
|
|
364
|
|
26
|
11
|
|
|
11
|
|
89
|
use XSLoader; |
|
11
|
|
|
|
|
34
|
|
|
11
|
|
|
|
|
481
|
|
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
our $VERSION = "0.002"; |
29
|
|
|
|
|
|
|
|
30
|
11
|
|
|
11
|
|
76
|
use parent "Exporter"; |
|
11
|
|
|
|
|
29
|
|
|
11
|
|
|
|
|
81
|
|
31
|
|
|
|
|
|
|
our @EXPORT_OK = qw(once); |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
XSLoader::load(__PACKAGE__, $VERSION); |
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
=head1 OPERATORS |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
=over |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
=item once(EXPR) |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
Evaluate I once and memoise its value. The first time a C |
42
|
|
|
|
|
|
|
expression is evaluated, I is evaluated, and (if everything proceeds |
43
|
|
|
|
|
|
|
normally) C stores the value it yielded and also yields the same |
44
|
|
|
|
|
|
|
value. When the same C expression is evaluated subsequently, it |
45
|
|
|
|
|
|
|
yields the value that I yielded the first time, without evaluating |
46
|
|
|
|
|
|
|
I again. There is one instance of this memoisation for each |
47
|
|
|
|
|
|
|
instance of the C operator in the source. |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
Because I is not evaluated until the C operator is being |
50
|
|
|
|
|
|
|
evaluated, it can refer to and use any aspects of the lexical and dynamic |
51
|
|
|
|
|
|
|
environment as they exist at runtime of the C operator. However, |
52
|
|
|
|
|
|
|
if I yields different results depending on variable aspects of the |
53
|
|
|
|
|
|
|
environment, such as arguments of the surrounding subroutine, then the |
54
|
|
|
|
|
|
|
memoisation is probably inappropriate. That is, I can't sensibly |
55
|
|
|
|
|
|
|
depend on the specific features of an invocation of the surrounding |
56
|
|
|
|
|
|
|
code, but can depend on the general features that are consistent to |
57
|
|
|
|
|
|
|
all invocations. |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
If evaluation of I results in an exception, rather than yielding |
60
|
|
|
|
|
|
|
a normal value, no value will be memoised. A value will be memoised |
61
|
|
|
|
|
|
|
the first time that I does yield a normal value. If multiple |
62
|
|
|
|
|
|
|
evaluations of I are in progress simultaneously (due to recursion), |
63
|
|
|
|
|
|
|
and multiple instances of it yield a normal value, then the first yielded |
64
|
|
|
|
|
|
|
value will be memoised and others will be ignored. A C expression |
65
|
|
|
|
|
|
|
will never yield a value other than the one it memoised. |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
I is always evaluated in scalar context, regardless of the |
68
|
|
|
|
|
|
|
context in which the C operator appears. To memoise a list, |
69
|
|
|
|
|
|
|
write C<@{once([...])}>. |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
=back |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=head1 BUGS |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
L will generate incorrect source when deparsing C |
76
|
|
|
|
|
|
|
expressions. The code that it displays gives a rough indication of |
77
|
|
|
|
|
|
|
how memoisation operates, but appears buggy in detail. In fact the |
78
|
|
|
|
|
|
|
C operator works through some custom ops that cannot be adequately |
79
|
|
|
|
|
|
|
represented in pure Perl. |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
=head1 SEE ALSO |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
L |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
=head1 AUTHOR |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
Andrew Main (Zefram) |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
=head1 COPYRIGHT |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
Copyright (C) 2011, 2017 Andrew Main (Zefram) |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
=head1 LICENSE |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
This module is free software; you can redistribute it and/or modify it |
96
|
|
|
|
|
|
|
under the same terms as Perl itself. |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
=cut |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
1; |