org.erights.e.elang.evm
Class DefineExpr

java.lang.Object
  |
  +--org.erights.e.elang.evm.ParseNode
        |
        +--org.erights.e.elang.evm.ENode
              |
              +--org.erights.e.elang.evm.EExpr
                    |
                    +--org.erights.e.elang.evm.DefineExpr
All Implemented Interfaces:
Cloneable, EPrintable, MatchMaker

public class DefineExpr
extends EExpr

Safe: BNF: "def" pattern ":=" eExpr

Introduce a binding for 'pattern' in the nearest layer of the current environment. 'pattern' must not yet have a binding in this layer.

For a DefineExpr to be well formed, none of the variables defined by pattern (ie, pattern.staticScope().outNames()) may be used by eExpr (ie, eExpr.staticScope().namesUsed()), and vice versa. By imposing this restriction in the kernel language, the kernel language may evaluate these two in the wrong order (right to left) without violating the left to right scoping rule. Therefore, the kernel language remains a valid subset of the user language, in that all kernel programs are valid user programs with the same meaning. A user-level def-expression that violates the above rules is expanded into a kernel-level one that satisfies it.

Author:
Mark S. Miller

Field Summary
private  Pattern myPattern
           
private  EExpr myRValue
           
 
Fields inherited from class org.erights.e.elang.evm.ENode
 
Fields inherited from class org.erights.e.elang.evm.ParseNode
NUM_PR, PR_ASSIGN, PR_CALL, PR_COMP, PR_EEXPR, PR_LISTPATT, PR_ORDER, PR_PATTERN, PR_PRIM, PR_START
 
Constructor Summary
DefineExpr(SourceSpan optSpan, Pattern pattern, EExpr rValue)
          Enabled: If the resulting DefineExpr isn't well formed (see class comment), this throws a (XXX to be defined) exception.
 
Method Summary
protected  StaticScope computeStaticScope()
          When staticScope() is first requested on a given node, it calls computeStaticScope() to do the actual computation, which is then remembered.
private  void ensureWellFormed()
           
 boolean matchBind(ConstList args, Object specimen, FlexList bindings)
          Enabled:
 Pattern pattern()
          Enabled:
 EExpr rValue()
          Enabled:
protected  Object subEval(EvalContext ctx, boolean forValue)
          The recursive part that does the work
 void subPrintOn(TextWriter out, int priority)
          Enabled:
 Object welcome(ETreeVisitor visitor)
          Enabled:
 
Methods inherited from class org.erights.e.elang.evm.EExpr
__printOn, appendAllTo, appendTo, eval, eval, evalBool, printAsBlockOn, substitute, transform
 
Methods inherited from class org.erights.e.elang.evm.ENode
cleanCopy, copy, getOptPatternMap, getOptScopeMap, getPatternMap, getScopeMap, qbuild, setPatternMap, setScopeMap, staticScope, synEnv
 
Methods inherited from class org.erights.e.elang.evm.ParseNode
asText, getOptSpan, lnPrintOn, lnPrintOn, matchBind, matchBind, matchBind, printListOn, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

myPattern

private final Pattern myPattern

myRValue

private final EExpr myRValue
Constructor Detail

DefineExpr

public DefineExpr(SourceSpan optSpan,
                  Pattern pattern,
                  EExpr rValue)
Enabled: If the resulting DefineExpr isn't well formed (see class comment), this throws a (XXX to be defined) exception.

Method Detail

ensureWellFormed

private void ensureWellFormed()

welcome

public Object welcome(ETreeVisitor visitor)
Enabled:

Specified by:
welcome in class ENode

computeStaticScope

protected StaticScope computeStaticScope()
Description copied from class: ENode
When staticScope() is first requested on a given node, it calls computeStaticScope() to do the actual computation, which is then remembered.

Specified by:
computeStaticScope in class ENode

subEval

protected Object subEval(EvalContext ctx,
                         boolean forValue)
Description copied from class: EExpr
The recursive part that does the work

Specified by:
subEval in class EExpr

matchBind

public boolean matchBind(ConstList args,
                         Object specimen,
                         FlexList bindings)
Enabled:

Specified by:
matchBind in interface MatchMaker
Specified by:
matchBind in class ParseNode

pattern

public Pattern pattern()
Enabled:


subPrintOn

public void subPrintOn(TextWriter out,
                       int priority)
                throws IOException
Enabled:

Specified by:
subPrintOn in class ParseNode
IOException

rValue

public EExpr rValue()
Enabled:



comments?