Expression Trees to English [file expenglish.clj]
(defn op [x] (first x))
(defn lhs [x] (second x))
(defn rhs [x] (third x))
(defn op->english [op]
(list 'the
(second (assocl op '((+ sum)
(- difference)
(* product)
(/ quotient)
(sin sine)
(cos cosine)))) 'of))
; expression x -> (list of words)
(defn exp->english [x]
(if (cons? x) ; operator?
(append
(op->english (op x))
(append (exp->english (lhs x))
(if (null? (rest (rest x)))
'() ; unary
(cons 'and
(exp->english (rhs x))))))
(list x) ) ) ; leaf: operand