> I guess the overriding question I have here is: what is the PROBLEM being
Let me share my experience with Clojure and lein. They use a clojure
hash-map for their configuration. So yes arbitrary code could be executed
and I believe this is a _very good thing_.
Why? Because it makes it very easy to add sub-configuration that can be
used by third party plugin. For example:
- a plugin that help the use of environment variables (lein-environ) which
is really helpful for application development (not so much for library
- a plugin that use S3 for our private dependencies (not supported by
default by lein)
For deployment: we were able to add request to our API server that provide
not only the written version but also the git commit hash. So we could be
certain of the version of the server. Too much time there were sys/admin
deployment errors. And that could only be achieved because we were able to
run arbitrary command in the project description file.
I certainly forget many other advantages of having a package description
format which is simply a data structure in the hosted language. But this
has by far my preference.
- cabal is ok, but very imperfect, I generally need to have a lot of
copy/paste, I need to change it very often while writing application with
- JSON/YAML/TOML are simply not powerful enough to match all semantics we
might need to configure a project. For example we might want to have Set
instead of List for some properties. Or I don't know maybe ternary tree
The point is: we pay a price by adding a step between the semantic and the
While if our configuration format was in Haskell we could express the
semantic more directly.
Haskell-community mailing list