NAME
Memoize::Lift - lift expression evaluation to compile time
SYNOPSIS
use Memoize::Lift qw(lift);
$value = lift(expensive_computation());
DESCRIPTION
This module supplies an operator that causes an expression to be evaluated immediately at compile time, memoising its value for use at runtime.
OPERATORS
- lift(EXPR)
-
Evaluate EXPR at compile time and memoise its value. Whenever a
lift
expression is evaluated at runtime, it yields the value that EXPR yielded at compile time. There is one instance of this memoisation for each instance of thelift
operator in the source.EXPR is lexically located where the
lift
operator is, and can use static aspects of the lexical environment normally. However, because EXPR is evaluated at compile time, it cannot use any aspects of the dynamic environment as it would exist at runtime of thelift
operator. Lexical variables visible at the location of thelift
operator remain visible to EXPR, but referencing them is an error.If evaluation of EXPR results in an exception, that exception will terminate compilation.
EXPR is always evaluated in scalar context, regardless of the context in which the
lift
operator appears. To memoise a list, write@{lift([...])}
.
BUGS
B::Deparse will generate incorrect source when deparsing lift
expressions. It will show the constant value of the expression as best it can, which is not perfect if the value is non-trivial. It has no chance at all to show the original expression that yielded that value, because the expression is not kept: the value determined at compile time is built into the op tree as a constant item.
The custom parsing code required for lift
to operate is only invoked if lift
is invoked using an unqualified name. That is, referring to it as Memoize::Lift::lift
won't work. This limitation should be resolved if Devel::CallParser or something similar migrates into the core in a future version of Perl.
SEE ALSO
AUTHOR
Andrew Main (Zefram) <zefram@fysh.org>
COPYRIGHT
Copyright (C) 2011 Andrew Main (Zefram) <zefram@fysh.org>
LICENSE
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.