edu.vub.at.objects.natives
Class NATClosureMethod

java.lang.Object
  extended byedu.vub.at.objects.natives.NATNil
      extended byedu.vub.at.objects.natives.NATByRef
          extended byedu.vub.at.objects.natives.NATClosureMethod
All Implemented Interfaces:
ATAbstractGrammar, ATConversions, ATExpression, ATMethod, ATNil, ATObject, ATStatement, java.io.Serializable

public final class NATClosureMethod
extends NATByRef
implements ATMethod

A 'closure method' is literally a function that sits in between of a full closure and a method. It is a method that captures only its lexical scope of definition, but not the value of 'self' and 'super' which are active at that time. When invoked, the method is evaluated in its lexical scope, but with the values of 'self' and 'super' equal to those given to it at method invocation time. Closure methods are used to implement 'externally added' methods to objects. In such cases, the external methods can only access their own surrounding lexical scope (and not that of the actual object to which they are added), but their values for 'self' and 'super' will act as if the method was actually defined within the object itself. See the description of the ATDefExternalMethod interface for more information.

Author:
tvcutsem
See Also:
Serialized Form

Field Summary
private  ATObject lexicalScope_
           
private  ATMethod method_
           
 
Fields inherited from class edu.vub.at.objects.natives.NATNil
_INSTANCE_
 
Constructor Summary
NATClosureMethod(ATObject scope, ATMethod method)
           
 
Method Summary
 ATObject base_apply(ATTable arguments, ATContext ctx)
          A closure method application acts exactly like a regular direct method application, except that the given lexical scope is disregarded and replaced by the lexical scope encapsulated by the closure method.
 ATObject base_applyInScope(ATTable arguments, ATContext ctx)
          Applies the method to the given arguments in the given context.
 ATMethod base_asMethod()
           
 ATBegin base_getBodyExpression()
          Structural access to the body of the method.
 ATSymbol base_getName()
          Structural access to the name of the method.
 ATTable base_getParameters()
          Structural access to the parameter list of the method, which is normally a table of symbols.
 boolean base_isMethod()
           
 ATTable meta_getStripes()
          Returns the stripes of this object.
 NATText meta_print()
          Prints out the object in a human-readable way.
 
Methods inherited from class edu.vub.at.objects.natives.NATByRef
meta_pass, meta_resolve
 
Methods inherited from class edu.vub.at.objects.natives.NATNil
asAmbientTalkObject, asJavaClassUnderSymbiosis, asJavaObjectUnderSymbiosis, asNativeBoolean, asNativeException, asNativeFarReference, asNativeFraction, asNativeNumber, asNativeNumeric, asNativeTable, asNativeText, base__opeql__opeql_, base_asActorMirror, base_asAsyncMessage, base_asBegin, base_asBoolean, base_asClosure, base_asDefinition, base_asExpression, base_asFarReference, base_asField, base_asHandler, base_asMessage, base_asMessageCreation, base_asMirror, base_asNumber, base_asSplice, base_asStatement, base_asStripe, base_asSymbol, base_asTable, base_asUnquoteSplice, base_asVariableAssignment, base_init, base_isBoolean, base_isCallFrame, base_isClosure, base_isFarReference, base_isMessageCreation, base_isMirror, base_isSplice, base_isStripe, base_isSymbol, base_isTable, base_isUnquoteSplice, base_isVariableAssignment, base_new, createChild, equals, isAmbientTalkObject, isJavaObjectUnderSymbiosis, isNativeBoolean, isNativeField, isNativeText, meta_addField, meta_addMethod, meta_assignField, meta_assignVariable, meta_clone, meta_defineField, meta_doesNotUnderstand, meta_eval, meta_extend, meta_getDynamicParent, meta_getLexicalParent, meta_grabField, meta_grabMethod, meta_invoke, meta_isCloneOf, meta_isRelatedTo, meta_isStripedWith, meta_listFields, meta_listMethods, meta_lookup, meta_newInstance, meta_quote, meta_receive, meta_respondsTo, meta_select, meta_send, meta_share, readResolve, toString, writeReplace
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface edu.vub.at.objects.ATObject
base__opeql__opeql_, base_init, base_new, meta_addField, meta_addMethod, meta_assignField, meta_assignVariable, meta_clone, meta_defineField, meta_doesNotUnderstand, meta_eval, meta_extend, meta_getDynamicParent, meta_getLexicalParent, meta_grabField, meta_grabMethod, meta_invoke, meta_isCloneOf, meta_isRelatedTo, meta_isStripedWith, meta_listFields, meta_listMethods, meta_lookup, meta_newInstance, meta_pass, meta_quote, meta_receive, meta_resolve, meta_respondsTo, meta_select, meta_send, meta_share
 
Methods inherited from interface edu.vub.at.objects.coercion.ATConversions
asAmbientTalkObject, asJavaClassUnderSymbiosis, asJavaObjectUnderSymbiosis, asNativeBoolean, asNativeException, asNativeFarReference, asNativeFraction, asNativeNumber, asNativeNumeric, asNativeTable, asNativeText, base_asActorMirror, base_asAsyncMessage, base_asBegin, base_asBoolean, base_asClosure, base_asDefinition, base_asExpression, base_asFarReference, base_asField, base_asHandler, base_asMessage, base_asMessageCreation, base_asMirror, base_asNumber, base_asSplice, base_asStatement, base_asStripe, base_asSymbol, base_asTable, base_asUnquoteSplice, base_asVariableAssignment, base_isBoolean, base_isCallFrame, base_isClosure, base_isFarReference, base_isMessageCreation, base_isMirror, base_isSplice, base_isStripe, base_isSymbol, base_isTable, base_isUnquoteSplice, base_isVariableAssignment, isAmbientTalkObject, isJavaObjectUnderSymbiosis, isNativeBoolean, isNativeField, isNativeText
 

Field Detail

lexicalScope_

private final ATObject lexicalScope_

method_

private final ATMethod method_
Constructor Detail

NATClosureMethod

public NATClosureMethod(ATObject scope,
                        ATMethod method)
                 throws InterpreterException
Method Detail

base_apply

public ATObject base_apply(ATTable arguments,
                           ATContext ctx)
                    throws InterpreterException
A closure method application acts exactly like a regular direct method application, except that the given lexical scope is disregarded and replaced by the lexical scope encapsulated by the closure method. The bindings for 'self' and 'super' remain intact. Closure methods are a result of external method definitions.

Specified by:
base_apply in interface ATMethod
Parameters:
arguments - the evaluated actual arguments
ctx - the context whose 'self' binding will be used during the execution of the method. The lexical scope, however, will be replaced by the closure method's own lexical scope. A call frame will be inserted into this lexical scope before executing the method body. To ensure that 'super' points to the parent of the actual 'self' and not the parent of the object performing the external method definition, a 'super' field is added to the call frame shadowing the defining object's 'super' field.
Returns:
the value of evaluating the function body
Throws:
InterpreterException

base_applyInScope

public ATObject base_applyInScope(ATTable arguments,
                                  ATContext ctx)
                           throws InterpreterException
Description copied from interface: ATMethod
Applies the method to the given arguments in the given context. The context is usually supplied by a closure and is necessary in order to pair a method with its current receiver (its 'self') The method will use the given context 'as-is', and will *not* insert an additional call frame.

Specified by:
base_applyInScope in interface ATMethod
Parameters:
arguments - the actual arguments, already eagerly evaluated
ctx - the context in which to evaluate the method body, to be used without inserting a call frame
Returns:
the value of evaluating the method body in the given context
Throws:
InterpreterException

base_getBodyExpression

public ATBegin base_getBodyExpression()
                               throws InterpreterException
Description copied from interface: ATMethod
Structural access to the body of the method.

Specified by:
base_getBodyExpression in interface ATMethod
Throws:
InterpreterException

base_getName

public ATSymbol base_getName()
                      throws InterpreterException
Description copied from interface: ATMethod
Structural access to the name of the method. Note that all methods (defined using def name( ...args... ) { ... } of def foo: arg bar: arg { ... }) retain the name with which they were first bound. Literal blocks which may be created outside of a definition are implicitly named 'lambda'.

Specified by:
base_getName in interface ATMethod
Throws:
InterpreterException

base_getParameters

public ATTable base_getParameters()
                           throws InterpreterException
Description copied from interface: ATMethod
Structural access to the parameter list of the method, which is normally a table of symbols.

Specified by:
base_getParameters in interface ATMethod
Throws:
InterpreterException

meta_print

public NATText meta_print()
                   throws InterpreterException
Description copied from interface: ATObject
Prints out the object in a human-readable way.

Specified by:
meta_print in interface ATObject
Overrides:
meta_print in class NATNil
Throws:
InterpreterException

base_asMethod

public ATMethod base_asMethod()
                       throws XTypeMismatch
Specified by:
base_asMethod in interface ATConversions
Overrides:
base_asMethod in class NATNil
Throws:
XTypeMismatch

base_isMethod

public boolean base_isMethod()
Specified by:
base_isMethod in interface ATConversions
Overrides:
base_isMethod in class NATNil

meta_getStripes

public ATTable meta_getStripes()
                        throws InterpreterException
Description copied from interface: ATObject
Returns the stripes of this object. Note that only the stripes that were attached directly to this object are returned, not all of the parent's stripes as well.

Specified by:
meta_getStripes in interface ATObject
Overrides:
meta_getStripes in class NATNil
Throws:
InterpreterException