Replies: 3 comments 5 replies
-
Related to #484 and #69 (comment)
|
Beta Was this translation helpful? Give feedback.
-
For those that don't know what does rec {
foo = 1;
bar = 2;
b = { inherit foo bar; };
} Is just a shorthand for: rec {
foo = 1;
bar = 2;
b = {
foo = foo;
bar = bar;
};
}
nix-instantiate --strict --eval test.nix
{ b = { bar = 2; foo = 1; }; bar = 2; foo = 1; } As scoping rules are not the same than
Using inherit in this case works as there is no self referencing attribute:
Note that the keyword In the context of {
Foo=foo: 1
Bar=bar: 2
b: {
foo: Foo
bar: Bar
}
} |
Beta Was this translation helpful? Give feedback.
-
This discussion has been migrated to cue-lang/cue#847. For more details about CUE's migration to a new home, please see cue-lang/cue#1078. |
Beta Was this translation helpful? Give feedback.
-
I'm finding (and perhaps I'm discovering an anti-pattern) that I've got a lot of structs, often in a "function" style
One thing of note is the pattern of using a explicit string as a struct field name, to prevent CUE seeing it as a identifier and recursively trying to resolve it.
But when there's even a few parameters, it feels stuttery (a la Go style.)
Three other languages that occur to me have recognized this stylistic issue, and addressed it. ECMAScript simply allows bare names in
{ }
to be the equivalent of using the enclosing variable value and the object value. Rust does likewise.Nix, on the other hand, has an
inherit
keyword, that takes a list of identifiers. The advantage of this feature is that inherit can also take a parenthesized identifier as a source of inheriting values, which means that a set (~= a struct) can be built up from other sets very easily.For the above example, an ES/Rust style would look like
Nix style:
Beta Was this translation helpful? Give feedback.
All reactions