MLscript demonstration
  
  
  
  The code is available on github.
  
  Tip: additional definitions from the paper – copy and paste to try them out:
  
class Mul[out E](lhs: E, rhs: E)
mixin EvalMul {
  fun eval(override Mul(l, r)) = this.eval(l) * this.eval(r)
}
mixin EvalNegNeg {
  fun eval(override Neg(Neg(d))) = this.eval(d)
}
module TestLang2 extends EvalAddLit, EvalNeg, EvalMul, EvalNegNeg
let res2 = TestLang2.eval(add2negadd11)
  
  
class Some[out A](value: A)
mixin Foo { fun foo: Int = 1 }
mixin Bar { fun foo = Some(super.foo) }
module ClsFoo extends Foo, Bar, Bar
ClsFoo.foo
  
  
class Some[out A](value: A)
module None
mixin ComparePoint {
  fun compare(lhs, rhs) = (lhs.x == rhs.x) && (lhs.y == rhs.y)
}
mixin CompareColored {
  fun compare(lhs, rhs) =
    super.compare(lhs, rhs) && eq(lhs.color)(rhs.color)
}
mixin CompareNested {
  fun compare(lhs, rhs) =
    super.compare(lhs, rhs) &&
      if lhs.parent is Some(p)
        then rhs.parent is Some(q) and this.compare(p, q)
        else rhs.parent is None
}
class MyPoint(x: Int, y: Int, color: Str, parent: Some[MyPoint] | None)
module CompareMyPoint extends ComparePoint, CompareColored, CompareNested
let Red = "red"
let p0 = MyPoint(0, 0, Red, None)
let p1 = MyPoint(0, 1, Red, None)
let p2 = MyPoint(0, 1, Red, None)
let p3 = MyPoint(0, 1, Red, Some(p1))
let p4 = MyPoint(0, 1, Red, Some(p2))
let p5 = MyPoint(0, 1, Red, Some(p3))
CompareMyPoint.compare(p0, p1)
CompareMyPoint.compare(p1, p2)
CompareMyPoint.compare(p3, p4)
CompareMyPoint.compare(p3, p5)