Ast.Objは必要なのか?

リテラルが用意されていない値を直に格納するためのAstとして俺が定義した。

結論: 必要。

全ての値を、それ自身に評価されるAstに逆変換(toAst)できるとは限らない。

こういう値の toAst は、Ast.obj(value) でOK。

Unit, Top, Bottom も Ast.obj に包みたいところだけど、そこは LUnit, LTop, LBottom と別で定義すべき。

Enumは? Struct は?

これは関数適用式にするほか無いのでは。

false の toAST は (Bool "false") を返す。あるいは、Bool.false