scala/ScalaBook/chapter-03/lazy.scala

object D extends ((Double, Double) =>Double) {
  def apply(x: Double,y: Double) = Math.sqrt(x*x+y*y)
}
def somemethod(f : Function2[Double, Double, Double],
                  x : Double, y : Double) = f(x,y)

var x = somemethod(D,3,4)
println(x)

def numsFrom (n :Int):Stream[Int] = Stream.cons(n,numsFrom (n+1))
lazy val N = numsFrom(0)
lazy val Ones: Stream[Int] = Stream.cons(1,Ones)
(N take 10).print
println("new line")
Ones take 5 print

lazy val bot: Boolean = bot
if (true || bot) 
  println("bot is not used")
else
  println("oh, oh, bot is used")

implicit def Sum(a: Long)(implicit b: Long) = a+b
implicit val B: Long = 4
println(Sum(4))
println(Sum(5)(9)) 


implicit def IMP(a:Int)(implicit b:Int, c:Float, d:Double) = a+b+c+d
implicit val imp3          = 5
implicit val imp4 : Float  = 6.0f
implicit val imp5  :Double = 7.0

print("IMP(0) = ") 
println(IMP(0))
print("IMP(2) = ") 
println(IMP(2))
print("IMP(1)(2,2,2) = ") 
println(IMP(1)(2,2,2))

x = IMP(0) + IMP(1)(2,2,2)
println("===============")
println(x)