1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.millscript.millscript.expr;
22
23 import org.millscript.millscript.action.MemoAction;
24 import org.millscript.millscript.vm.CompilerState;
25
26 /**
27 * This class implements a memo expression. A memo expression wraps a normal
28 * lambda expression, with the exception that the lambda expression must have
29 * one argument and return a single result. When the memo expression is applied
30 * the first time, the lambda expression is applied and it's result is
31 * remembered and returned. Subsequent applications of the memo expression with
32 * the same argument return the remembered value, rather than re-applying the
33 * function.
34 *
35 * @see org.millscript.millscript.syntax.DefineSyntax
36 * @see LambdaExpr
37 * @see MemoAction
38 */
39 public final class MemoExpr extends Expr< MemoAction > implements OneResult {
40
41 /**
42 * The lambda expression, whose results will be remembered.
43 */
44 private final LambdaExpr lambda;
45
46 /**
47 * Creates a new memo expression, for the specified lamba expression.
48 *
49 * @param e the lamba expression, whose results should be remembered
50 */
51 public MemoExpr( final LambdaExpr e ) {
52 lambda = e;
53 }
54
55 /**
56 * @see org.millscript.millscript.expr.Expr#compileIt()
57 */
58 @Override
59 public MemoAction compileIt() {
60 return new MemoAction( lambda.compileIt() );
61 }
62
63 /**
64 * @see org.millscript.millscript.expr.Expr#resolve(org.millscript.millscript.vm.CompilerState)
65 */
66 @Override
67 public void resolve( final CompilerState state ) {
68 this.lambda.resolve( state );
69 }
70
71 /**
72 * @see org.millscript.millscript.expr.Expr#showComponents(int)
73 */
74 @Override
75 void showComponents( final int n ) {
76 this.lambda.show( n );
77 }
78
79 }