def makeCounter(): String => Int = { var c = 0; {op => { if (op equals "up") c = c + 1 else if (op equals "down") c = c -1 else if ( !(op equals "show")) error("unknown op for counter: " + op) c } } } def makeCounter1(): String => Int = { var c = 0; def make(op: String): Int = { if (op equals "up") c = c + 1 else if (op equals "down") c = c -1 else if ( !(op equals "show")) error("unknown op for counter: " + op) c } make } // // Closure: function + plus access to surrounding definitions (environment) // // Closures are objects and objects are closures // def makeCounter2(): String => Int = { var c = 0; def incr = { c += 1 ; c } def decr = { c -= 1 ; c } def show = { c } {op => { if (op equals "up") incr else if (op equals "down") decr else if (op equals "show") show else error("unknown op for counter: " + op) } } }