at:tutorial:appendix
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:appendix [2008/07/10 16:02] – added tvcutsem | at:tutorial:appendix [2008/07/10 17:33] – added tvcutsem | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Appendix ====== | + | ====== Appendix: Libraries |
In the appendix, we explain useful libraries available to the AmbientTalk/ | In the appendix, we explain useful libraries available to the AmbientTalk/ | ||
Line 392: | Line 392: | ||
=== Futures === | === Futures === | ||
- | The module ''/ | + | The module ''/ |
The module exports the type tags '' | The module exports the type tags '' | ||
Line 424: | Line 424: | ||
=== Multifutures === | === Multifutures === | ||
- | The module ''/ | + | The module ''/ |
+ | |||
+ | A multifuture is constructed as follows: | ||
+ | < | ||
+ | def [mf, resolver] := makeMultiFuture(n, | ||
+ | </ | ||
+ | |||
+ | The parameter '' | ||
+ | |||
+ | A multifuture accepts the following listeners: | ||
< | < | ||
Line 430: | Line 439: | ||
</ | </ | ||
- | This listener is invoked whenever the future is resolved with a new value. Its code can thus be executed multiple times. | + | The above listener is invoked whenever the future is resolved with a new value. Its code can thus be executed multiple times. |
< | < | ||
Line 438: | Line 447: | ||
</ | </ | ||
- | This listener invoked if all results have been gathered (only possible if the maximum number of results is known). If there are no exceptions, only the first code block is triggered. If there are only exceptions, the first block is still invoked with an empty value table. | + | The above listener |
Note the following properties of multifutures: | Note the following properties of multifutures: | ||
Line 455: | Line 464: | ||
==== Dynamic Variables ==== | ==== Dynamic Variables ==== | ||
+ | |||
+ | The module ''/ | ||
+ | |||
+ | A dynamic variable can be defined as follows: | ||
+ | < | ||
+ | def name := dynamicVariable: | ||
+ | </ | ||
+ | |||
+ | It can be read as follows: | ||
+ | < | ||
+ | ?name or name.value | ||
+ | </ | ||
+ | |||
+ | It can be assigned only within a limited dynamic scope, as follows: | ||
+ | < | ||
+ | with: name is: newval do: { code } | ||
+ | // or | ||
+ | name.is: newval in: { code } | ||
+ | </ | ||
+ | |||
+ | When '' | ||
+ | |||
+ | By convention, we prefix the names of dynamic variables with a '' | ||
+ | |||
+ | You can find more usage examples of dynamic variables in the unit test included in the file '' | ||
==== Ambient References ==== | ==== Ambient References ==== | ||
+ | |||
+ | Ambient references are defined in the module ''/ | ||
+ | |||
+ | < | ||
+ | import / | ||
+ | deftype Printer; | ||
+ | def printers := ambient: Printer; | ||
+ | </ | ||
+ | |||
+ | In the above code, '' | ||
+ | |||
+ | Ambient references ship with two so-called " | ||
==== Structural Types ==== | ==== Structural Types ==== | ||
+ | |||
+ | The module ''/ | ||
+ | |||
+ | A structural type can be branded with type tags. In this case, objects only conform to the type if they are structurally conformant **and** if they are tagged with the structural type's brands. | ||
+ | |||
+ | Use the '' | ||
+ | |||
+ | < | ||
+ | def PersonProtocol := protocol: { | ||
+ | def name; | ||
+ | def age; | ||
+ | } named: `Person; | ||
+ | </ | ||
+ | |||
+ | The '' | ||
+ | |||
+ | < | ||
+ | def tom := object: { | ||
+ | def name := " | ||
+ | def age() { 24 }; | ||
+ | } implements: PersonProtocol; | ||
+ | </ | ||
+ | |||
+ | You can also create a protocol from an object: | ||
+ | < | ||
+ | |||
+ | You can test protocol conformance in either of two styles: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | You can also force a '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | More usage examples of structural types can be found in the unit test defined in the file '' | ||
==== Traits ==== | ==== Traits ==== | ||
+ | |||
+ | The module ''/ | ||
+ | |||
+ | Using the '' | ||
+ | |||
+ | To define a " | ||
+ | < | ||
+ | trait: { | ||
+ | ... | ||
+ | } requiring: Protocol; | ||
+ | </ | ||
+ | |||
+ | The above code creates a trait that can only be composed into an object adhering to the specified protocol. To compose traits, use the following language construct: | ||
+ | |||
+ | < | ||
+ | object: { | ||
+ | use: { | ||
+ | import T1 exclude ...; | ||
+ | import T2 alias ...; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | The '' | ||
+ | |||
+ | Note that the place where '' | ||
+ | |||
+ | Usage examples can be found in the unit tests in the file '' | ||
+ | |||
+ | ===== Utilities ===== | ||
+ | |||
+ | The files in the '' | ||
+ | |||
+ | ==== Timing Utilities ==== | ||
+ | |||
+ | The module ''/ | ||
+ | |||
+ | < | ||
+ | def subscription := when: timeoutPeriod elapsed: { | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | The '' | ||
+ | |||
+ | The milliseconds used to define the timeout period must be provided as a Java '' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Additionally, | ||
+ | |||
+ | The timer module also defines a function '' | ||
+ | |||
+ | The timer module defines a small number of additional utility functions which can be found in the file '' | ||
+ | |||
+ | ==== Logging Framework ==== | ||
+ | |||
+ | The module ''/ | ||
+ | |||
+ | Here's a typical example of how to use a logger: | ||
+ | < | ||
+ | import / | ||
+ | def log := makeLogger(" | ||
+ | log("a message", | ||
+ | </ | ||
+ | |||
+ | The '' | ||
+ | |||
+ | The logging level determines which messages are shown on the output log. The available error levels are: '' | ||
+ | |||
+ | The output object is an object that understands '' | ||
+ | |||
+ | ==== Object Inspector ==== | ||
+ | |||
+ | The module ''/ | ||
+ | |||
+ | < | ||
+ | import / | ||
+ | inspect(o); | ||
+ | </ | ||
+ | |||
+ | This will pop up a graphical inspector on the object, listing the object' | ||
+ | |||
+ | ==== Symbiosis Utilities ==== | ||
+ | |||
+ | The module ''/ | ||
+ | |||
+ | < | ||
+ | long(anAmbientTalkNumber) -> aJavaLong | ||
+ | short(anAmbientTalkNumber) -> aJavaShort | ||
+ | float(anAmbientTalkFraction) -> aJavaFloat | ||
+ | byte(anAmbientTalkNumber) -> aJavaByte | ||
+ | </ | ||
+ | |||
+ | The module also defines the following function: | ||
+ | < | ||
+ | cast: obj into: Interface | ||
+ | </ | ||
+ | |||
+ | The '' | ||
+ | |||
+ | ==== Miscellaneous ==== |
at/tutorial/appendix.txt · Last modified: 2021/09/24 10:28 by elisag