//import java.io._
//import scala.tools.nsc.Settings
//import scala.tools.nsc.interpreter
import scala.language.dynamics
object Main extends App {
//println(eval)
class Hash(pairs: Tuple2[String, Any]*) extends Dynamic {
var hash: Map[String, Any] = Map()
pairs.foreach {kv =>
hash += (kv._1 -> kv._2)
}
//def |(key: String): Any = return hash.get(key).get
def selectDynamic(key: String): Any = {
if(hash contains key) {
return (hash get key).get
} else {
return None
}
}
def updateDynamic(key: String)(value: Any) = {
if(hash contains key) hash -= key
hash += (key -> value)
}
def applyDynamic(key: String)(args: Any*) = {
//((hash get key) get)(5, 10)
}
//def applyDynamicNamed(key: String)(args: Any*) = {}
def apply(): Map[String, Any] = return hash
def apply(key: String): Any = return (hash get key).get
def apply(pair: Tuple2[String, Any]) = {
if(hash contains pair._1) hash -= pair._1
hash += pair
}
}
def say(args: Any*) = args foreach println
//def thing(exp: Boolean)(code: => Unit): Unit = if(exp) code
var myHash = new Hash(
"a" -> 1,
"b" -> 2,
"c" -> 3
)
say(myHash.a)
myHash("b" -> 4)
say(myHash.b)
myHash.d = 5
say(myHash.d, myHash.e, myHash("c"))
myHash() foreach println
println((myHash() get "a") get)
myHash.f = ((a: Int, b: Int) => println(a + b))
//myHash.f(5, 10)
(myHash("f"))(5, 10)
//println(myHash.f(5, 10))
}