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 the lift 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 the lift operator. Lexical variables visible at the location of the lift 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

Memoize::Once

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.