Mutual definitions with records - vilinski/nemerle GitHub Wiki

Mutual Definitions with records

  • Category: Defining Types

  • Link: see Recursive definitions with variant for example of use variant as recursive collections

  • Description: Records can be defined simultaneously to give mutually recursive collections of types.

 using System; 
 using System.Console; 
 using Nemerle;

// define mutually recursive collections with the class and Record macro
[Record] 
class Airport 
{

    public Name : string;
    public Connections : list[AirportConnection];
         
    public override ToString() : string
    {
		$"Name: $Name; Connections: $Connections"
    }
         
}

variant AirportConnection 
{

    | Connection {Airport : Airport;}  
    | None
         
    public override ToString() : string
    {
        match (this)
        {
			| Connection(a) => $"Airport: $a"
			| _             => "no connection"
        }
    }
         
}

module MutualDefinition2 
{

    Main() : void
    {
		def lax = Airport("Los Angeles Intl Airport", [AirportConnection.None()]);
		def dtw = Airport(name = "Detroit Metro Wayne County", connections = [AirportConnection.None()]);
		def sea = Airport("Seattle-Tacoma Intl Airport", connections = [AirportConnection.Connection(dtw), AirportConnection.Connection(lax)]);
		WriteLine(lax);
		WriteLine(dtw);
		WriteLine(sea);  
    }
}

Name: Los Angeles Intl Airport; Connections: [no connection]
Name: Detroit Metro Wayne County; Connections: [no connection]
Name: Seattle-Tacoma Intl Airport; Connections: [Airport: Name: Detroit Metro Wayne County; Connections: [no connection], Airport: Name: Los Angeles Intl Airport; Connections: [no connection]]

[Copyright ©](Terms of use, legal notice)