at:tutorial:modular
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
at:tutorial:modular [2007/06/19 16:05] – *renamed tvcutsem | at:tutorial:modular [2013/05/17 20:24] (current) – adjusted tvcutsem | ||
---|---|---|---|
Line 57: | Line 57: | ||
The downside of such as scheme is that the absolute path name of the '' | The downside of such as scheme is that the absolute path name of the '' | ||
- | The [[at: | + | The [[at: |
< | < | ||
Line 64: | Line 64: | ||
Whenever a new actor is created by the AmbientTalk interpreter, | Whenever a new actor is created by the AmbientTalk interpreter, | ||
+ | |||
+ | Think of AmbientTalk' | ||
< | < | ||
Line 117: | Line 119: | ||
In this section, we describe how the '' | In this section, we describe how the '' | ||
+ | |||
==== import as trait composition ==== | ==== import as trait composition ==== | ||
Line 160: | Line 163: | ||
}; | }; | ||
def each: clo { | def each: clo { | ||
- | start.to: end do: clo | + | start.to: end-1 do: clo |
}; | }; | ||
}; | }; | ||
Line 179: | Line 182: | ||
</ | </ | ||
- | So, '' | + | So, '' |
+ | |||
+ | Note that in AmbientTalk, | ||
+ | |||
+ | < | ||
+ | def Enumerable := object: { | ||
+ | def collect: clo { /* as before */ }; | ||
+ | def detect: pred { /* as before */ }; | ||
+ | def reject: pred { /* as before */ }; | ||
+ | def each: clo @Required; | ||
+ | } | ||
+ | </ | ||
==== Resolving conflicts: exclusion and aliasing ==== | ==== Resolving conflicts: exclusion and aliasing ==== | ||
Line 190: | Line 204: | ||
// do not import the slots collect: and detect: | // do not import the slots collect: and detect: | ||
import Enumerable exclude collect:, detect: | import Enumerable exclude collect:, detect: | ||
- | // do not import collect: and import reject: as remove | + | // do not import collect: and import reject: as remove: |
- | import Enumerable alias reject: := remove exclude collect: | + | import Enumerable alias reject: := remove: exclude collect: |
</ | </ | ||
If the compositor defines an alias for an imported slot, it is good practice to ensure that the compositor has (or imports) a slot with the original name as well. That way, if the trait object performs a self-send to invoke one of its own methods, it will find a matching slot in the compositor. If the compositor aliases a slot and does not define the slot itself, a lookup by the trait of the original slot name would fail. | If the compositor defines an alias for an imported slot, it is good practice to ensure that the compositor has (or imports) a slot with the original name as well. That way, if the trait object performs a self-send to invoke one of its own methods, it will find a matching slot in the compositor. If the compositor aliases a slot and does not define the slot itself, a lookup by the trait of the original slot name would fail. | ||
+ | |||
+ | < | ||
+ | '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Moreover, all methods of the trait object annotated with '' | ||
+ | </ | ||
===== Classifying objects using type tags ===== | ===== Classifying objects using type tags ===== | ||
Line 245: | Line 267: | ||
Type tags can best be compared to empty Java interface types. Such empty interfaces are sometimes used in Java purely for the purposes of marking an object. Examples are '' | Type tags can best be compared to empty Java interface types. Such empty interfaces are sometimes used in Java purely for the purposes of marking an object. Examples are '' | ||
</ | </ | ||
+ | |||
==== Native Type Tags ==== | ==== Native Type Tags ==== | ||
- | The module ''/ | + | The module ''/ |
< | < | ||
- | is: 1 taggedAs: / | + | is: 1 taggedAs: /.at.lang.types.Number |
>> true | >> true | ||
- | is: " | + | is: " |
>> true | >> true | ||
</ | </ | ||
- | The type ''/ | + | The type ''/ |
==== Type tags as annotated message sends ==== | ==== Type tags as annotated message sends ==== | ||
Line 269: | Line 292: | ||
In the [[at: | In the [[at: | ||
+ | |||
===== Exception Handling ===== | ===== Exception Handling ===== | ||
Line 292: | Line 316: | ||
</ | </ | ||
- | Note that a new instance of an object named '' | + | Note that a new instance of an object named '' |
< | < | ||
- | defstripe | + | deftype |
- | def XDivisionByZero := lobby.at.exceptions.createException(DivisionByZero); | + | def XDivisionByZero := lobby.at.lang.exceptions.createException(DivisionByZero); |
</ | </ | ||
Line 322: | Line 346: | ||
system.println(exc.message); | system.println(exc.message); | ||
}; | }; | ||
- | }) | + | } taggedAs: [/ |
</ | </ | ||
Line 335: | Line 359: | ||
calculateSomething(); | calculateSomething(); | ||
} catch: DivisionByZero using: { |e| | } catch: DivisionByZero using: { |e| | ||
- | system.println(e.message): | + | system.println(e.message); |
} catch: NoSolution using: { |e| | } catch: NoSolution using: { |e| | ||
calculateSomethingElse(); | calculateSomethingElse(); | ||
Line 344: | Line 368: | ||
Care has to be taken that handlers are listed in increasing order of " | Care has to be taken that handlers are listed in increasing order of " | ||
+ | |||
+ | ===== Escaping Continuations ===== | ||
+ | |||
+ | It is often useful to be able to abort the control flow within a method prematurely. In traditional imperative programming languages, this is done by means of a '' | ||
+ | |||
+ | < | ||
+ | def contains(tbl, | ||
+ | { |return| | ||
+ | 1.to: tbl.length do: { |i| | ||
+ | if: (tbl[i] == elt) then: { | ||
+ | return(true) | ||
+ | } | ||
+ | }; | ||
+ | false | ||
+ | }.escape() | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | When '' | ||
+ | |||
+ | As can be seen, an escaping continuation is more general than a return statement: the continuation is a first-class function object and can hence be passed on to other objects. Hence, it is possible to return from multiple nested function calls at once. | ||
+ | |||
+ | There is an important limitation to the use of escaping continuations. An escaping continuation is not a full-fledged continuation (such as the one provided by Scheme' |
at/tutorial/modular.1182261935.txt.gz · Last modified: 2007/06/19 16:06 (external edit)