The Nix Language, while goofy at times, is built for config-as-code and is hiding a decent little functional language in what looks like just attribute assignments.
Likewise, CUE Lang is built for config (esp merging docs with shared refs) and is highly under-appreciated. You can express powerful computations if you puzzle over the logical inferencing for a bit.