at:tutorial:reflection
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
at:tutorial:reflection [2008/09/15 17:41] – tvcutsem | at:tutorial:reflection [2008/09/15 17:58] – rewritten tvcutsem | ||
---|---|---|---|
Line 79: | Line 79: | ||
- | A complete overview of all meta-operations will be presented near the end of this chapter. | + | A complete overview of all meta-operations will be presented near the end of this chapter |
===== Mirages ===== | ===== Mirages ===== | ||
- | Extending the AmbientTalk core language involves adding objects which have a different implementation for some of the default meta-operations. In this part of the tutorial, we describe how a programmer | + | |
+ | Extending the AmbientTalk core language involves adding objects which have a different implementation for some of the default meta-operations. In this part of the tutorial, we describe how a programmer | ||
+ | |||
+ | As a simple example, we show how to trace all method calls made on an object. The first step is to define | ||
< | < | ||
- | def dynamicExtensionMirror | + | def createTracingMirror(baseObject) { |
- | def doesNotUnderstand(selector) { | + | extend: defaultMirror with: { |
- | system.println(" | + | def invoke(slf, invocation) { |
- | system.println(" | + | system.println(" |
- | def input := system.readln(); | + | super^invoke(slf, invocation); |
- | if: !( "" | + | } |
- | def definition := read: input; | + | } |
- | eval: definition in: base; | + | |
- | } else: { | + | |
- | super^doesNotUnderstand(selector); | + | |
- | }; | + | |
- | }; | + | |
} | } | ||
</ | </ | ||
- | < | + | The primitive '' |
- | This mirror | + | < |
+ | def createTracingMirror(baseObject) { | ||
+ | | ||
+ | def invoke(slf, invocation) { | ||
+ | system.println(" | ||
+ | super^invoke(slf, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | The next step is to create objects | ||
< | < | ||
def mirage := object: { | def mirage := object: { | ||
- | def m() { self.x | + | def foo() { 42 }; |
- | } mirroredBy: | + | } mirroredBy:{ |emptyBase| createTracingMirror(emptyBase) }; |
</ | </ | ||
- | When invoking | + | In the code above, |
- | < | + | When invoking |
- | Note that the use of '' | + | |
- | </note> | + | < |
+ | > mirage.m(); | ||
+ | invoked m on < | ||
+ | >> 42 | ||
+ | </code> | ||
- | Whereas the example provided above may seem a little contrived, the reflective capabilities of AmbientTalk allow it to be extended with many abstraction relating to distributed computing for mobile ad hoc networks (AmbientTalk' | + | Whereas the example provided above may seem a little contrived, the reflective capabilities of AmbientTalk allow it to be extended with many abstraction relating to distributed computing for mobile ad hoc networks (AmbientTalk' |
===== The Metaobject Protocol ===== | ===== The Metaobject Protocol ===== |
at/tutorial/reflection.txt · Last modified: 2010/11/16 16:32 by tvcutsem