| It turns out the semantics of the spec is somewhat awkward, |
| though theoretically nicer. It seems like we do need to change |
| the definition somewhat to make it less awkward, or at least |
| come up with a good workaround before adopting the spec. |
| |
| We have introduce a small hack to mimic the old behavior for scalar |
| values. |
| |
| Note that the value of p below is now 2 (default), but should |
| be the non-concrete 2 | int. |
| |
| Proof: |
| p: *((*1 | int) & 2) | int // substitution of both P conjuncts in p |
| p: *(*_|_ | 2) | int // U1: distribute conjuncts |
| p: *_|_ | 2 | int // M2: remove mark |
| p: 2 | int // value after removing default. |
| |
| -- in.cue -- |
| |
| Q: *1 | int |
| q: *Q | int // 1 as expected |
| |
| P: *1 | int |
| P: 2 |
| p: *P | int // now 2, but should be (2 | int), according to the spec: |
| |
| // Here the inner default may not be used as it is masked by the outer default. |
| r: (*3 | (*1 | 2)) & (1 | 2) |
| |
| // Here the inner default is used, as there are no defaults marked in the |
| // outer disjunction. |
| s: (3 | (*1 | 2)) & (1 | 2) |
| |
| s1: #Size & { min: 5 } |
| |
| #Size : { |
| max: >min | *min |
| res: uint | * 0 |
| min: >res | *(1 + res) |
| } |
| |
| staged: { |
| c: ("a" | "b") & (*(*"a" | string) | string) |
| d: (*(*"a" | string) | string) & ("a" | "b") |
| } |
| |
| issue763a: { |
| #A: { |
| v: "a" | "b" | "c" // change to string to fix |
| } |
| |
| h: [string]: #A |
| |
| h: [=~"^b"]: #A & { |
| v: *h.a.v | string |
| } |
| |
| h: a: { |
| v: *"a" | string |
| } |
| |
| h: baa: _ |
| h: boo: _ |
| } |
| |
| -- out/eval -- |
| (struct){ |
| Q: (int){ |(*(int){ 1 }, (int){ int }) } |
| q: (int){ |(*(int){ 1 }, (int){ int }) } |
| P: (int){ 2 } |
| p: (int){ |(*(int){ 2 }, (int){ int }) } |
| r: (int){ |((int){ 1 }, (int){ 2 }) } |
| s: (int){ |(*(int){ 1 }, (int){ 2 }) } |
| s1: (#struct){ |
| max: (number){ |(*(int){ 5 }, (number){ >5 }) } |
| res: (int){ |(*(int){ 0 }, (int){ &(>=0, int) }) } |
| min: (int){ 5 } |
| } |
| #Size: (#struct){ |
| max: (number){ |(*(int){ 1 }, (number){ >0 }, (number){ >1 }) } |
| res: (int){ |(*(int){ 0 }, (int){ &(>=0, int) }) } |
| min: (number){ |(*(int){ 1 }, (number){ >0 }) } |
| } |
| staged: (struct){ |
| c: (string){ |(*(string){ "a" }, (string){ "b" }) } |
| d: (string){ |(*(string){ "a" }, (string){ "b" }) } |
| } |
| issue763a: (struct){ |
| #A: (#struct){ |
| v: (string){ |((string){ "a" }, (string){ "b" }, (string){ "c" }) } |
| } |
| h: (struct){ |
| a: (#struct){ |
| v: (string){ |(*(string){ "a" }, (string){ "b" }, (string){ "c" }) } |
| } |
| baa: (#struct){ |
| v: (string){ |(*(string){ "a" }, (string){ "b" }, (string){ "c" }) } |
| } |
| boo: (#struct){ |
| v: (string){ |(*(string){ "a" }, (string){ "b" }, (string){ "c" }) } |
| } |
| } |
| } |
| } |
| -- out/compile -- |
| --- in.cue |
| { |
| Q: (*1|int) |
| q: (*〈0;Q〉|int) |
| P: (*1|int) |
| P: 2 |
| p: (*〈0;P〉|int) |
| r: ((*3|(*1|2)) & (1|2)) |
| s: ((3|(*1|2)) & (1|2)) |
| s1: (〈0;#Size〉 & { |
| min: 5 |
| }) |
| #Size: { |
| max: (>〈0;min〉|*〈0;min〉) |
| res: (&(int, >=0)|*0) |
| min: (>〈0;res〉|*(1 + 〈0;res〉)) |
| } |
| staged: { |
| c: (("a"|"b") & (*(*"a"|string)|string)) |
| d: ((*(*"a"|string)|string) & ("a"|"b")) |
| } |
| issue763a: { |
| #A: { |
| v: ("a"|"b"|"c") |
| } |
| h: { |
| [string]: 〈1;#A〉 |
| } |
| h: { |
| [=~"^b"]: (〈1;#A〉 & { |
| v: (*〈2;h〉.a.v|string) |
| }) |
| } |
| h: { |
| a: { |
| v: (*"a"|string) |
| } |
| } |
| h: { |
| baa: _ |
| } |
| h: { |
| boo: _ |
| } |
| } |
| } |