|
|
|
|
|
by gabelevi
4080 days ago
|
|
I'm also a fan of namespacing variants, and I used it extensively on an OCaml representation of the SpiderMonkey AST. (Coincidentally, up until writing our own parser we were using pfff's JavaScript parser! Go pfff!). Anyway, here are some other useful things I found in OCaml along the way: Without namespacing, you might be using mutually recursive type definitions like type statement = ExpressionStatement of expression
and expression = FunctionExpression of statement list
to do this with modules you need to use recursive modules, like module rec Statement : sig
type t = Expression of Expression.t
end = struct
type t = Expression of Expression.t
end
and Expression : sig
type t = Function of Statement.t list
end = struct
type t = Function of Statement.t list
end
One of the sucky things about recursive modules is that you cannot omit the signatures, however if your modules only include types then there is a shortcut that looks like module rec Statement : sig
type t = Expression of Expression.t
end = Statement
and Expression : sig
type t = Function of Statement.t list
end = Expression
Links:
Big real world example:
https://github.com/facebook/flow/blob/3a5b4040b7d2a648f97a06...Recursive module docs:
http://caml.inria.fr/pub/docs/manual-ocaml-400/manual021.htm... |
|