```Hi!

I recently got engaged in a thread on comp.lang.functional about ML and
Lisp. I posted some simple but efficient OCaml code that is difficult to
translate into Lisp:

let rec ( +: ) f g = match f, g with
| `Q n, `Q m -> `Q (n +/ m)
| `Q (Int 0), e | e, `Q (Int 0) -> e
| f, `Add(g, h) -> f +: g +: h
| f, g -> `Add(f, g)

let rec ( *: ) f g = match f, g with
| `Q n, `Q m -> `Q (n */ m)
| `Q (Int 0), e | e, `Q (Int 0) -> `Q (Int 0)
| `Q (Int 1), e | e, `Q (Int 1) -> e
| f, `Mul(g, h) -> f *: g *: h
| f, g -> `Mul(f, g)

let rec simplify = function
| `Q _ | `Var _ as e -> e
| `Add(f, g) -> simplify f +: simplify g
| `Mul(f, g) -> simplify f *: simplify g;;

This code does some simple rearrangements of symbolic expressions to
simplify them, e.g. 2+1*x+0 -> 2+x. It works with arbitrary-precision
rational arithmetic.

Does Ruby have pattern matching? If so, what does the above look like in
Ruby? If not, how else can you express this elegantly in Ruby?

Lisp doesn't have pattern matching but Pascal Constanza wrote quite an
elegant solution in Lisp using dynamic method dispatch:

(defstruct add x y)
(defstruct mul x y)

(defgeneric simplify-add (x y)
(:method ((x number) (y number)) (+ x y))
(:method ((x (eql 0)) y) y)
(:method (x (y (eql 0))) x)
(:method (x (y add))
(:method (x y) (make-add :x x :y y)))

(defgeneric simplify-mul (x y)
(:method ((x number) (y number)) (* x y))
(:method ((x (eql 0)) y) 0)
(:method (x (y (eql 0))) 0)
(:method ((x (eql 1)) y) y)
(:method (x (y (eql 1))) x)
(:method (x (y mul))
(simplify-mul (simplify-mul x (mul-x y)) (mul-y y)))
(:method (x y) (make-mul :x x :y y)))

(defgeneric simplify (exp)
(:method (exp) exp)