SHOW:
|
|
- or go back to the newest paste.
| 1 | object Book extends App {
| |
| 2 | abstract class Expr { def eval: Double }
| |
| 3 | ||
| 4 | - | class Op(name: String, op: (Double, Double) => (Double)) extends Expr {
|
| 4 | + | type op = (Double, Double) => (Double) |
| 5 | - | var left: Expr = null |
| 5 | + | |
| 6 | - | var right: Expr = null |
| 6 | + | class Op(name: String, op: op, var left: Expr = null, var right: Expr = null) extends Expr {
|
| 7 | def apply(_left:Expr , _right: Expr) = {left = _left; right = _right; this}
| |
| 8 | def eval = op(left.eval, right.eval) | |
| 9 | override def toString = "%s(%s, %s)".format(name, left, right) | |
| 10 | } | |
| 11 | ||
| 12 | - | case class Value(eval:Double) extends Expr {
|
| 12 | + | case class Value(eval:Double) extends Expr { override def toString = eval.toString }
|
| 13 | - | override def toString = eval.toString |
| 13 | + | |
| 14 | implicit def MakeValue(d: Double) = new Value(d) | |
| 15 | ||
| 16 | def MakeOperator(name: String, op: op): Op = new Op(name, op) | |
| 17 | ||
| 18 | - | def MakeOperator(name: String, op: (Double, Double) => (Double)): Op = new Op(name, op) |
| 18 | + | |
| 19 | def sum = MakeOperator("sum", _+_ )
| |
| 20 | def div = MakeOperator("div", _/_)
| |
| 21 | ||
| 22 | def test(x: Expr) { println(x + " = " + x.eval) }
| |
| 23 | ||
| 24 | test(prod(sum(sum(2, 3), 1), 5)) | |
| 25 | test(div(sum(28, 2), prod(5, 2))) | |
| 26 | } |