Defining a Trait

TIntGetter.lf:
let

  Services = "Services.lf"        // import system services
  load "LanguageOfTraits.lf"    // import language support for traits
  
in

  let
  
    TReadInt = 
      let

        readInt = (\():: Services.Print "Input number: ";
                                  Services.StringToInt (Services.ReadString (||)))

        TReadIntProvides =
          (|
             readInt = (\():: (self (||)).setIntField (| aIntField = readInt (||) |)) 
          |)

        TReadIntRequires =
          (|
             readInt = (| setIntField = "Int -> Unit" |)
          |)
        
      in

        trait "TReadInt" provides TReadIntProvides requires TReadIntRequires
      
      end
  
    TWriteInt =
      let

        writeInt = (\aArg:: Services.Print "TWriteInt.writeInt: ";
                                        Services.PrintLn aArg )  

        TWriteIntProvides =
          (|
             writeInt = (\():: writeInt ((self (||)).getIntField (||)) )
          |)

        TWriteIntRequires =
          (|
             writeInt = (| getIntField = "Unit -> Int" |)
          |)

      in

        trait "TWriteInt" provides TWriteIntProvides requires TWriteIntRequires

      end

  in
  
    trait "TIntGetter" 
        join (refine TReadInt aliases (| readInt = "get" |))
        with (refine TWriteInt aliases (| writeInt = "set" |))
  
  end  
  
end
    

Last modified: 2006-02-11 — Markus Lumpe