|
|
|
|
|
by q3k
2060 days ago
|
|
Jsonnet, Nix and CUE are lazily evaluated. Starlark is not IIRC. Dhall I don't know, but I would presume it is? Nix as an example: nix-repl> { foo = 5 / 0; bar = 5; }
error: division by zero, at (string):1:9
nix-repl> { foo = 5 / 0; bar = 5; }.bar
5
vs. Python as an obvious example of a language with eager evaluation: >>> { "foo": 5 / 0, "bar": 5 }.bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
This lazy evaluation allows for a very nice construct in Jsonnet: local widget = {
id:: error "id must be set",
name: "widget-%d" % [self.id],
url: "https://factory.com/widget/%d" % [self.id],
};
widgetStandard: widget { id: 42 },
widgetSpecial: widget { name: "foo"; url: "https://foo.com" },
When the resulting code only expects a widget to have a 'name' and 'url' field, you can either have both automatically defined based on a single to-level ID, or override them, even fully skipping the ID if not needed. (a :: in jsonnet is a hidden field, ie. one that will not be evaluated automatically when generating a YAML/JSON/..., but can be evaluated by other means). |
|