User Tools

Site Tools


at:tutorial:appendix

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
at:tutorial:appendix [2008/07/10 16:22] – added tvcutsemat:tutorial:appendix [2008/07/10 16:32] – * tvcutsem
Line 392: Line 392:
 === Futures === === Futures ===
  
-The module ''/.at.lang.futures'' provides support for futures. Futures have already been described as part of the [[concurreny|concurrency]] section in the tutorial.+The module ''/.at.lang.futures'' provides support for futures. Futures have already been described as part of the [[:at:tutorial:actors#futures|concurrency]] section in the tutorial.
  
 The module exports the type tags ''OnewayMessage'', ''FutureMessage'' and ''Due'': The module exports the type tags ''OnewayMessage'', ''FutureMessage'' and ''Due'':
Line 502: Line 502:
 In the above code, ''printers'' refers to all nearby objects exported by means of  the ''Printer'' type tag. An more in-depth explanation of ambient references can be found on the [[:research:ambientrefs|research page of ambient references]]. In the above code, ''printers'' refers to all nearby objects exported by means of  the ''Printer'' type tag. An more in-depth explanation of ambient references can be found on the [[:research:ambientrefs|research page of ambient references]].
  
-Ambient references ship with two so-called "implementation modules": the module /.at.ambient.ar_extensional_impl'' amd the module ''/.at.m2mi.ar_intensional_impl''. By default, the extensional implementation is used, but this can be changed by passing the desired implementation module as a parameter to the ''/.at.lang.ambientrefs'' module.+Ambient references ship with two so-called "implementation modules": the module ''/.at.ambient.ar_extensional_impl'' and the module ''/.at.m2mi.ar_intensional_impl''. By default, the extensional implementation is used, but this can be changed by passing the desired implementation module as a parameter to the ''/.at.lang.ambientrefs'' module.
  
 ==== Structural Types ==== ==== Structural Types ====
 +
 +The module ''/.at.lang.structuraltypes'' implements a small library to use structural typing. The library allows for the creation of 'protocols', which are first-class structural types. A structural type is simply a set of selectors. An object o conforms to a protocol P <=> for all selectors s of P, o respondsTo s where respondsTo is determined by o's mirror.
 +
 +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 ''protocol:'' function to create a new protocol:
 +
 +<code>
 +def PersonProtocol := protocol: {
 +  def name;
 +  def age;
 +} named: `Person;
 +</code>
 +
 +The ''`Person'' argument is used to give the protocol a name simply for display purposes. The ''object:implements:'' function automatically checks whether an object conforms to any declared types:
 +
 +<code>
 +def tom := object: {
 +  def name := "Tom";
 +  def age() { 24 };
 +} implements: PersonProtocol;
 +</code>
 +
 +You can also create a protocol from an object:
 +<code>def tomsProtocol := protocolOf: tom;</code>
 +
 +You can test protocol conformance in either of two styles:
 +  * ''does: tom implement: PersonProtocol'' => true or false
 +  * ''PersonProtocol <? tom'' => true or false
 +
 +You can also force a ''StructuralTypeMismatch'' exception to be raised if the object does not conform to the type:
 +  *  ''ensure: tom implements: PersonProtocol'' => true or exception
 +  *  ''PersonProtocol.checkConformance(tom)'' => true or exception
 +
 +More usage examples of structural types can be found in the unit test defined in the file ''at/lang/structuraltypes.at''.
  
 ==== Traits ==== ==== Traits ====
at/tutorial/appendix.txt · Last modified: 2021/09/24 10:28 by elisag