object address {
sealed abstract class T
case class IntT(a:Int) extends T
case class ByteT(a:Int) extends T
var address = 0
def main(argv:Array[String]) {
val vars = List(("a",IntT(2)),("b",ByteT(5)),("a",IntT(3)),("d",IntT(5)),("e",ByteT(6)));
val addressMap = calcAddress(vars,Map())
println("addressMap "+ addressMap)
}
def calcAddress(vars:List[(String,T)],addressMap:Map[String,Int]):Map[String,Int] =
vars match {
case List() => addressMap
case (name,value)::xs =>
if(addressMap.contains(name)) {
calcAddress(xs, addressMap)
} else {
val addr = address
address += typeSize(value)
calcAddress(xs, addressMap + (name -> addr))
}
}
def typeSize(t:T):Int = t match {
case IntT(_) => 4
case ByteT(_) => 1
}
}
>scalac address.scala
>scala address
>addressMap Map(a -> 0, b -> 4, d -> 5, e -> 9)