org.erights.e.elang.evm
Class VarPattern

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

public class VarPattern
extends NounPattern

Safe: BNF: 'var' ID ':' expr

The identifier on the left is the defining occurrence of a variable name. The expression on the right is a "slot guard expression". The object it evaluates to will be treated as a SlotGuard, and asked to make a slot initialized from a specimen, as if:


      def slot := slotGuard makeSlot(specimen, XXX)

 

This slot is then defined as the slot for a variable of this name in the scope starting immediately after this name.

But wait! That scope includes the slot guard expression?!? As with the def-expression, this circularity is indeed allowed and correct in the user-level language, but the kernel-level language (ie, the parse node VarPattern) imposes a well-formedness criterea that allows us to evaluate in the wrong order without effect. A circular user-level VarPattern is also statically rejected.

Author:
Mark S. Miller
See Also:
org.erights.e.elang.evm.DefineExpr, org.erights.e.elang.evm.FinalPattern

Field Summary
private  EExpr mySlotGuard
           
 
Fields inherited from class org.erights.e.elang.evm.NounPattern
 
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
VarPattern(SourceSpan optSpan, String varName, AtomicExpr noun, EExpr guardExpr)
          Enabled: If 'varName' would shadow a non-shadowable, throw a (XXX to be defined) exception instead.
VarPattern(SourceSpan optSpan, String varName, EExpr guardExpr)
          Enabled:
 
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.
(package private)  EExpr guardExpr()
           
 void subPrintOn(TextWriter out, int priority)
          Enabled:
(package private)  void testMatch(EvalContext ctx, Object specimen, OneArgFunc optEjector)
          If this pattern matches the specimen, add macthing bindings to the scope.
 Object welcome(ETreeVisitor visitor)
          Enabled:
 
Methods inherited from class org.erights.e.elang.evm.NounPattern
ensureWellFormed, getNoun, matchBind, optName
 
Methods inherited from class org.erights.e.elang.evm.Pattern
__printOn, substitute
 
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

mySlotGuard

private final EExpr mySlotGuard
Constructor Detail

VarPattern

public VarPattern(SourceSpan optSpan,
                  String varName,
                  AtomicExpr noun,
                  EExpr guardExpr)
Enabled: If 'varName' would shadow a non-shadowable, throw a (XXX to be defined) exception instead.

If the VarPattern would not be well-formed, throw a (XXX to be defined) exception instead.


VarPattern

public VarPattern(SourceSpan optSpan,
                  String varName,
                  EExpr guardExpr)
Enabled:

Method Detail

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

guardExpr

EExpr guardExpr()
Specified by:
guardExpr in class NounPattern

subPrintOn

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

Overrides:
subPrintOn in class NounPattern
IOException

testMatch

void testMatch(EvalContext ctx,
               Object specimen,
               OneArgFunc optEjector)
Description copied from class: Pattern
If this pattern matches the specimen, add macthing bindings to the scope.

Otherwise report the reason why not according to optEjector.

Specified by:
testMatch in class Pattern


comments?