@rcrsr/rill 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/dist/generated/introspection-data.d.ts +1 -1
  2. package/dist/generated/introspection-data.d.ts.map +1 -1
  3. package/dist/generated/introspection-data.js +107 -186
  4. package/dist/generated/introspection-data.js.map +1 -1
  5. package/dist/generated/version-data.d.ts +1 -1
  6. package/dist/generated/version-data.js +3 -3
  7. package/dist/generated/version-data.js.map +1 -1
  8. package/dist/highlight-map.d.ts +4 -0
  9. package/dist/highlight-map.d.ts.map +1 -0
  10. package/dist/highlight-map.js +71 -0
  11. package/dist/highlight-map.js.map +1 -0
  12. package/dist/index.d.ts +2 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +5 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/lexer/errors.d.ts.map +1 -1
  17. package/dist/lexer/errors.js +9 -3
  18. package/dist/lexer/errors.js.map +1 -1
  19. package/dist/lexer/operators.js +1 -1
  20. package/dist/lexer/tokenizer.d.ts.map +1 -1
  21. package/dist/lexer/tokenizer.js +0 -14
  22. package/dist/lexer/tokenizer.js.map +1 -1
  23. package/dist/parser/helpers.d.ts +8 -0
  24. package/dist/parser/helpers.d.ts.map +1 -1
  25. package/dist/parser/helpers.js +4 -4
  26. package/dist/parser/helpers.js.map +1 -1
  27. package/dist/parser/index.d.ts.map +1 -1
  28. package/dist/parser/index.js +1 -1
  29. package/dist/parser/index.js.map +1 -1
  30. package/dist/parser/parser-collect.js +1 -1
  31. package/dist/parser/parser-collect.js.map +1 -1
  32. package/dist/parser/parser-control.js +4 -4
  33. package/dist/parser/parser-control.js.map +1 -1
  34. package/dist/parser/parser-expr.js +32 -10
  35. package/dist/parser/parser-expr.js.map +1 -1
  36. package/dist/parser/parser-extract.js +7 -3
  37. package/dist/parser/parser-extract.js.map +1 -1
  38. package/dist/parser/parser-functions.d.ts.map +1 -1
  39. package/dist/parser/parser-functions.js +7 -18
  40. package/dist/parser/parser-functions.js.map +1 -1
  41. package/dist/parser/parser-literals.js +15 -15
  42. package/dist/parser/parser-literals.js.map +1 -1
  43. package/dist/parser/parser-script.js +3 -3
  44. package/dist/parser/parser-script.js.map +1 -1
  45. package/dist/parser/parser-variables.js +4 -4
  46. package/dist/parser/parser-variables.js.map +1 -1
  47. package/dist/parser/state.d.ts +1 -1
  48. package/dist/parser/state.d.ts.map +1 -1
  49. package/dist/parser/state.js +2 -2
  50. package/dist/parser/state.js.map +1 -1
  51. package/dist/runtime/core/callable.d.ts +20 -0
  52. package/dist/runtime/core/callable.d.ts.map +1 -1
  53. package/dist/runtime/core/callable.js +30 -7
  54. package/dist/runtime/core/callable.js.map +1 -1
  55. package/dist/runtime/core/context.d.ts +21 -0
  56. package/dist/runtime/core/context.d.ts.map +1 -1
  57. package/dist/runtime/core/context.js +75 -4
  58. package/dist/runtime/core/context.js.map +1 -1
  59. package/dist/runtime/core/eval/base.d.ts.map +1 -1
  60. package/dist/runtime/core/eval/base.js +3 -3
  61. package/dist/runtime/core/eval/base.js.map +1 -1
  62. package/dist/runtime/core/eval/index.d.ts.map +1 -1
  63. package/dist/runtime/core/eval/index.js +2 -0
  64. package/dist/runtime/core/eval/index.js.map +1 -1
  65. package/dist/runtime/core/eval/mixins/annotations.js +3 -3
  66. package/dist/runtime/core/eval/mixins/annotations.js.map +1 -1
  67. package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -1
  68. package/dist/runtime/core/eval/mixins/closures.js +69 -40
  69. package/dist/runtime/core/eval/mixins/closures.js.map +1 -1
  70. package/dist/runtime/core/eval/mixins/collections.js +15 -15
  71. package/dist/runtime/core/eval/mixins/collections.js.map +1 -1
  72. package/dist/runtime/core/eval/mixins/control-flow.d.ts.map +1 -1
  73. package/dist/runtime/core/eval/mixins/control-flow.js +12 -12
  74. package/dist/runtime/core/eval/mixins/control-flow.js.map +1 -1
  75. package/dist/runtime/core/eval/mixins/core.d.ts.map +1 -1
  76. package/dist/runtime/core/eval/mixins/core.js +12 -13
  77. package/dist/runtime/core/eval/mixins/core.js.map +1 -1
  78. package/dist/runtime/core/eval/mixins/expressions.js +9 -9
  79. package/dist/runtime/core/eval/mixins/expressions.js.map +1 -1
  80. package/dist/runtime/core/eval/mixins/extraction.d.ts.map +1 -1
  81. package/dist/runtime/core/eval/mixins/extraction.js +15 -15
  82. package/dist/runtime/core/eval/mixins/extraction.js.map +1 -1
  83. package/dist/runtime/core/eval/mixins/literals.js +22 -22
  84. package/dist/runtime/core/eval/mixins/literals.js.map +1 -1
  85. package/dist/runtime/core/eval/mixins/types.js +4 -4
  86. package/dist/runtime/core/eval/mixins/types.js.map +1 -1
  87. package/dist/runtime/core/eval/mixins/variables.js +34 -34
  88. package/dist/runtime/core/eval/mixins/variables.js.map +1 -1
  89. package/dist/runtime/core/execute.js +3 -3
  90. package/dist/runtime/core/execute.js.map +1 -1
  91. package/dist/runtime/core/introspection.d.ts +30 -1
  92. package/dist/runtime/core/introspection.d.ts.map +1 -1
  93. package/dist/runtime/core/introspection.js +47 -1
  94. package/dist/runtime/core/introspection.js.map +1 -1
  95. package/dist/runtime/core/types.d.ts +11 -0
  96. package/dist/runtime/core/types.d.ts.map +1 -1
  97. package/dist/runtime/core/types.js.map +1 -1
  98. package/dist/runtime/ext/builtins.js +22 -22
  99. package/dist/runtime/ext/builtins.js.map +1 -1
  100. package/dist/runtime/ext/extensions.d.ts +1 -1
  101. package/dist/runtime/ext/extensions.d.ts.map +1 -1
  102. package/dist/runtime/ext/extensions.js +4 -5
  103. package/dist/runtime/ext/extensions.js.map +1 -1
  104. package/dist/runtime/index.d.ts +6 -4
  105. package/dist/runtime/index.d.ts.map +1 -1
  106. package/dist/runtime/index.js +3 -2
  107. package/dist/runtime/index.js.map +1 -1
  108. package/dist/types.d.ts +36 -37
  109. package/dist/types.d.ts.map +1 -1
  110. package/dist/types.js +440 -120
  111. package/dist/types.js.map +1 -1
  112. package/package.json +7 -66
  113. package/README.md +0 -223
  114. package/dist/check/config.d.ts +0 -20
  115. package/dist/check/config.d.ts.map +0 -1
  116. package/dist/check/config.js +0 -151
  117. package/dist/check/config.js.map +0 -1
  118. package/dist/check/fixer.d.ts +0 -39
  119. package/dist/check/fixer.d.ts.map +0 -1
  120. package/dist/check/fixer.js +0 -119
  121. package/dist/check/fixer.js.map +0 -1
  122. package/dist/check/index.d.ts +0 -10
  123. package/dist/check/index.d.ts.map +0 -1
  124. package/dist/check/index.js +0 -21
  125. package/dist/check/index.js.map +0 -1
  126. package/dist/check/rules/anti-patterns.d.ts +0 -65
  127. package/dist/check/rules/anti-patterns.d.ts.map +0 -1
  128. package/dist/check/rules/anti-patterns.js +0 -481
  129. package/dist/check/rules/anti-patterns.js.map +0 -1
  130. package/dist/check/rules/closures.d.ts +0 -66
  131. package/dist/check/rules/closures.d.ts.map +0 -1
  132. package/dist/check/rules/closures.js +0 -370
  133. package/dist/check/rules/closures.js.map +0 -1
  134. package/dist/check/rules/collections.d.ts +0 -90
  135. package/dist/check/rules/collections.d.ts.map +0 -1
  136. package/dist/check/rules/collections.js +0 -373
  137. package/dist/check/rules/collections.js.map +0 -1
  138. package/dist/check/rules/conditionals.d.ts +0 -41
  139. package/dist/check/rules/conditionals.d.ts.map +0 -1
  140. package/dist/check/rules/conditionals.js +0 -134
  141. package/dist/check/rules/conditionals.js.map +0 -1
  142. package/dist/check/rules/flow.d.ts +0 -46
  143. package/dist/check/rules/flow.d.ts.map +0 -1
  144. package/dist/check/rules/flow.js +0 -206
  145. package/dist/check/rules/flow.js.map +0 -1
  146. package/dist/check/rules/formatting.d.ts +0 -133
  147. package/dist/check/rules/formatting.d.ts.map +0 -1
  148. package/dist/check/rules/formatting.js +0 -648
  149. package/dist/check/rules/formatting.js.map +0 -1
  150. package/dist/check/rules/helpers.d.ts +0 -26
  151. package/dist/check/rules/helpers.d.ts.map +0 -1
  152. package/dist/check/rules/helpers.js +0 -66
  153. package/dist/check/rules/helpers.js.map +0 -1
  154. package/dist/check/rules/index.d.ts +0 -21
  155. package/dist/check/rules/index.d.ts.map +0 -1
  156. package/dist/check/rules/index.js +0 -78
  157. package/dist/check/rules/index.js.map +0 -1
  158. package/dist/check/rules/loops.d.ts +0 -77
  159. package/dist/check/rules/loops.d.ts.map +0 -1
  160. package/dist/check/rules/loops.js +0 -310
  161. package/dist/check/rules/loops.js.map +0 -1
  162. package/dist/check/rules/naming.d.ts +0 -21
  163. package/dist/check/rules/naming.d.ts.map +0 -1
  164. package/dist/check/rules/naming.js +0 -174
  165. package/dist/check/rules/naming.js.map +0 -1
  166. package/dist/check/rules/strings.d.ts +0 -28
  167. package/dist/check/rules/strings.d.ts.map +0 -1
  168. package/dist/check/rules/strings.js +0 -79
  169. package/dist/check/rules/strings.js.map +0 -1
  170. package/dist/check/rules/types.d.ts +0 -41
  171. package/dist/check/rules/types.d.ts.map +0 -1
  172. package/dist/check/rules/types.js +0 -167
  173. package/dist/check/rules/types.js.map +0 -1
  174. package/dist/check/types.d.ts +0 -112
  175. package/dist/check/types.d.ts.map +0 -1
  176. package/dist/check/types.js +0 -6
  177. package/dist/check/types.js.map +0 -1
  178. package/dist/check/validator.d.ts +0 -18
  179. package/dist/check/validator.d.ts.map +0 -1
  180. package/dist/check/validator.js +0 -110
  181. package/dist/check/validator.js.map +0 -1
  182. package/dist/check/visitor.d.ts +0 -33
  183. package/dist/check/visitor.d.ts.map +0 -1
  184. package/dist/check/visitor.js +0 -259
  185. package/dist/check/visitor.js.map +0 -1
  186. package/dist/cli-check.d.ts +0 -43
  187. package/dist/cli-check.d.ts.map +0 -1
  188. package/dist/cli-check.js +0 -368
  189. package/dist/cli-check.js.map +0 -1
  190. package/dist/cli-eval.d.ts +0 -15
  191. package/dist/cli-eval.d.ts.map +0 -1
  192. package/dist/cli-eval.js +0 -116
  193. package/dist/cli-eval.js.map +0 -1
  194. package/dist/cli-exec.d.ts +0 -49
  195. package/dist/cli-exec.d.ts.map +0 -1
  196. package/dist/cli-exec.js +0 -183
  197. package/dist/cli-exec.js.map +0 -1
  198. package/dist/cli-module-loader.d.ts +0 -19
  199. package/dist/cli-module-loader.d.ts.map +0 -1
  200. package/dist/cli-module-loader.js +0 -83
  201. package/dist/cli-module-loader.js.map +0 -1
  202. package/dist/cli-shared.d.ts +0 -44
  203. package/dist/cli-shared.d.ts.map +0 -1
  204. package/dist/cli-shared.js +0 -108
  205. package/dist/cli-shared.js.map +0 -1
  206. package/dist/cli.d.ts +0 -13
  207. package/dist/cli.d.ts.map +0 -1
  208. package/dist/cli.js +0 -62
  209. package/dist/cli.js.map +0 -1
  210. package/dist/runtime/core/introspection-data.d.ts +0 -2
  211. package/dist/runtime/core/introspection-data.d.ts.map +0 -1
  212. package/dist/runtime/core/introspection-data.js +0 -618
  213. package/dist/runtime/core/introspection-data.js.map +0 -1
  214. package/dist/runtime/core/version-data.d.ts +0 -18
  215. package/dist/runtime/core/version-data.d.ts.map +0 -1
  216. package/dist/runtime/core/version-data.js +0 -16
  217. package/dist/runtime/core/version-data.js.map +0 -1
  218. package/docs/00_INDEX.md +0 -67
  219. package/docs/01_guide.md +0 -390
  220. package/docs/02_types.md +0 -504
  221. package/docs/03_variables.md +0 -324
  222. package/docs/04_operators.md +0 -629
  223. package/docs/05_control-flow.md +0 -692
  224. package/docs/06_closures.md +0 -787
  225. package/docs/07_collections.md +0 -688
  226. package/docs/08_iterators.md +0 -330
  227. package/docs/09_strings.md +0 -205
  228. package/docs/10_parsing.md +0 -366
  229. package/docs/11_reference.md +0 -600
  230. package/docs/12_examples.md +0 -748
  231. package/docs/13_modules.md +0 -519
  232. package/docs/14_host-integration.md +0 -985
  233. package/docs/15_grammar.ebnf +0 -773
  234. package/docs/16_conventions.md +0 -695
  235. package/docs/17_cli-tools.md +0 -184
  236. package/docs/18_design-principles.md +0 -247
  237. package/docs/19_cookbook.md +0 -628
  238. package/docs/88_errors.md +0 -902
  239. package/docs/99_llm-reference.txt +0 -614
  240. package/docs/assets/logo.png +0 -0
@@ -1,629 +0,0 @@
1
- # rill Operators
2
-
3
- *Pipe, arithmetic, comparison, logical, spread, and extraction operators*
4
-
5
- ## Overview
6
-
7
- | Category | Operators |
8
- |----------|-----------|
9
- | Pipe | `->` |
10
- | Capture | `:>` |
11
- | Arithmetic | `+`, `-`, `*`, `/`, `%` |
12
- | Comparison | `==`, `!=`, `<`, `>`, `<=`, `>=` |
13
- | Comparison Methods | `.eq`, `.ne`, `.lt`, `.gt`, `.le`, `.ge` |
14
- | Logical | `!` (unary), `&&`, `||` |
15
- | Spread | `@` (sequential), `*` (tuple) |
16
- | Extraction | `*<>` (destructure), `/<>` (slice) |
17
- | Type | `:type` (assert), `:?type` (check) |
18
- | Member | `.field`, `[index]` |
19
- | Hierarchical Dispatch | `[path] -> target` |
20
- | Default | `?? value` |
21
- | Existence | `.?field`, `.?field&type` |
22
-
23
- ---
24
-
25
- ## Pipe Operator `->`
26
-
27
- The pipe operator passes the left-hand value to the right-hand side:
28
-
29
- ```rill
30
- "hello" -> .upper # "HELLO"
31
- 42 -> ($ + 8) # 50
32
- [1, 2, 3] -> each { $ * 2 } # [2, 4, 6]
33
- ```
34
-
35
- ### Piped Value as `$`
36
-
37
- The piped value is available as `$`:
38
-
39
- ```rill
40
- "world" -> "hello {$}" # "hello world"
41
- 5 -> ($ * $ + $) # 30
42
- ```
43
-
44
- ### Method Syntax
45
-
46
- Method calls are sugar for pipes:
47
-
48
- ```rill
49
- "hello".upper # equivalent: "hello" -> .upper
50
- "hello".contains("ell") # equivalent: "hello" -> .contains("ell")
51
- ```
52
-
53
- ### Implicit `$`
54
-
55
- Bare `.method()` implies `$` as receiver:
56
-
57
- ```rill
58
- "hello" -> {
59
- .upper -> log # $."upper" -> log
60
- .len # $.len
61
- }
62
- ```
63
-
64
- ---
65
-
66
- ## Capture Operator `:>`
67
-
68
- Captures a value into a variable:
69
-
70
- ```rill
71
- "hello" :> $greeting # store in $greeting
72
- 42 :> $count # store in $count
73
- ```
74
-
75
- ### Capture and Continue
76
-
77
- `:>` captures AND continues the chain:
78
-
79
- ```rill
80
- "hello" :> $a -> .upper :> $b -> .len
81
- # $a is "hello", $b is "HELLO", result is 5
82
- ```
83
-
84
- See [Variables](03_variables.md) for detailed scoping rules.
85
-
86
- ---
87
-
88
- ## Arithmetic Operators
89
-
90
- | Operator | Description |
91
- |----------|-------------|
92
- | `+` | Addition |
93
- | `-` | Subtraction |
94
- | `*` | Multiplication |
95
- | `/` | Division |
96
- | `%` | Modulo (remainder) |
97
-
98
- ```rill
99
- 5 + 3 # 8
100
- 10 - 4 # 6
101
- 3 * 4 # 12
102
- 15 / 3 # 5
103
- 17 % 5 # 2
104
- ```
105
-
106
- ### Precedence
107
-
108
- Standard mathematical precedence (high to low):
109
- 1. Unary: `-`, `!`
110
- 2. Multiplicative: `*`, `/`, `%`
111
- 3. Additive: `+`, `-`
112
-
113
- ```rill
114
- 2 + 3 * 4 # 14 (multiplication first)
115
- (2 + 3) * 4 # 20 (parentheses override)
116
- -5 + 3 # -2
117
- ```
118
-
119
- ### Type Constraint
120
-
121
- All operands must be numbers. No implicit conversion:
122
-
123
- ```rill
124
- 5 + 3 # OK: 8
125
- ```
126
-
127
- ```text
128
- "5" + 1 # ERROR: Arithmetic requires number, got string
129
- ```
130
-
131
- ### Error Handling
132
-
133
- ```text
134
- 10 / 0 # ERROR: Division by zero
135
- 10 % 0 # ERROR: Modulo by zero
136
- ```
137
-
138
- ---
139
-
140
- ## Comparison Operators
141
-
142
- | Operator | Description |
143
- |----------|-------------|
144
- | `==` | Equal |
145
- | `!=` | Not equal |
146
- | `<` | Less than |
147
- | `>` | Greater than |
148
- | `<=` | Less or equal |
149
- | `>=` | Greater or equal |
150
-
151
- ```rill
152
- 5 == 5 # true
153
- 5 != 3 # true
154
- 3 < 5 # true
155
- 5 > 3 # true
156
- 5 <= 5 # true
157
- 5 >= 3 # true
158
- ```
159
-
160
- ### Value Comparison
161
-
162
- All comparisons are by value, not reference:
163
-
164
- ```rill
165
- [1, 2, 3] == [1, 2, 3] # true
166
- [a: 1] == [a: 1] # true
167
- "hello" == "hello" # true
168
- ```
169
-
170
- ### Comparison Methods
171
-
172
- Methods provide readable alternatives in conditionals:
173
-
174
- | Method | Equivalent |
175
- |--------|------------|
176
- | `.eq(val)` | `== val` |
177
- | `.ne(val)` | `!= val` |
178
- | `.lt(val)` | `< val` |
179
- | `.gt(val)` | `> val` |
180
- | `.le(val)` | `<= val` |
181
- | `.ge(val)` | `>= val` |
182
-
183
- ```rill
184
- "A" :> $v
185
- $v -> .eq("A") ? "match" ! "no" # "match"
186
- 5 -> .gt(3) ? "big" ! "small" # "big"
187
- 10 -> .le(10) ? "ok" ! "over" # "ok"
188
- ```
189
-
190
- ---
191
-
192
- ## Logical Operators
193
-
194
- | Operator | Description |
195
- |----------|-------------|
196
- | `&&` | Logical AND (short-circuit) |
197
- | `\|\|` | Logical OR (short-circuit) |
198
- | `!` | Logical NOT |
199
-
200
- ```rill
201
- (true && false) # false
202
- (true || false) # true
203
- !true # false
204
- !false # true
205
- ```
206
-
207
- ### Short-Circuit Evaluation
208
-
209
- ```rill
210
- (false && undefined_var) # false (right side not evaluated)
211
- (true || undefined_var) # true (right side not evaluated)
212
- ```
213
-
214
- ### With Comparisons
215
-
216
- ```rill
217
- (1 < 2 && 3 > 2) # true
218
- (5 > 10 || 3 < 5) # true
219
- ```
220
-
221
- ### Grouping Required
222
-
223
- Compound expressions require grouping in simple-body contexts:
224
-
225
- ```rill
226
- true -> ($ && true) ? "both" ! "not both" # "both"
227
- ```
228
-
229
- ### Negation in Pipes
230
-
231
- In pipe targets, `!expr` binds tightly and returns a boolean:
232
-
233
- ```rill
234
- "hello" -> !.empty # true (not empty)
235
- "" -> !.empty # false (is empty)
236
- ```
237
-
238
- This works naturally with conditionals and captures:
239
-
240
- ```rill
241
- "hello" -> !.empty ? "has content" ! "empty" # "has content"
242
- "hello" -> !.empty :> $not_empty # $not_empty = true
243
- ```
244
-
245
- No grouping needed — `!.empty` is parsed as a unit before `?` or `:>`.
246
-
247
- ---
248
-
249
- ## Spread Operators
250
-
251
- ### Sequential Spread `@`
252
-
253
- Chain closures where each receives the previous result (fold pattern):
254
-
255
- ```rill
256
- |x|($x + 1) :> $inc
257
- |x|($x * 2) :> $double
258
- |x|($x + 10) :> $add10
259
-
260
- # Chain: (5 + 1) = 6, (6 * 2) = 12, (12 + 10) = 22
261
- 5 -> @[$inc, $double, $add10] # 22
262
- ```
263
-
264
- Single closure:
265
-
266
- ```rill
267
- |x|($x * 2) :> $dbl
268
- 5 -> @$dbl # 10
269
- ```
270
-
271
- ### Tuple Spread `*`
272
-
273
- Create tuples for argument unpacking:
274
-
275
- ```rill
276
- # From list (positional)
277
- *[1, 2, 3] :> $args
278
-
279
- # From dict (named)
280
- *[x: 1, y: 2] :> $named
281
-
282
- # Convert list to tuple via pipe
283
- [1, 2, 3] -> * :> $tuple
284
- ```
285
-
286
- Using tuples at invocation:
287
-
288
- ```rill
289
- |a, b, c|"{$a}-{$b}-{$c}" :> $fmt
290
- *[1, 2, 3] -> $fmt() # "1-2-3"
291
- *[c: 3, a: 1, b: 2] -> $fmt() # "1-2-3" (named, order doesn't matter)
292
- ```
293
-
294
- See [Types](02_types.md) for full tuple documentation.
295
-
296
- ---
297
-
298
- ## Extraction Operators
299
-
300
- ### Destructure `*<>`
301
-
302
- Extract elements from lists or dicts into variables. Returns the original value unchanged.
303
-
304
- **List destructuring** (pattern count must match list length):
305
-
306
- ```rill
307
- [1, 2, 3] -> *<$a, $b, $c>
308
- # $a = 1, $b = 2, $c = 3
309
- ```
310
-
311
- **With type annotations:**
312
-
313
- ```rill
314
- [0, "ok"] -> *<$code:number, $msg:string>
315
- # $code = 0, $msg = "ok"
316
- ```
317
-
318
- **Skip elements with `_`:**
319
-
320
- ```rill
321
- [1, 2, 3, 4] -> *<$first, _, _, $last>
322
- # $first = 1, $last = 4
323
- ```
324
-
325
- **Dict destructuring** (explicit key mapping):
326
-
327
- ```rill
328
- [name: "test", count: 42] -> *<name: $n, count: $c>
329
- # $n = "test", $c = 42
330
- ```
331
-
332
- **Nested destructuring:**
333
-
334
- ```rill
335
- [[1, 2], 3] -> *<*<$a, $b>, $c>
336
- # $a = 1, $b = 2, $c = 3
337
- ```
338
-
339
- **Errors:**
340
-
341
- ```text
342
- [1, 2] -> *<$a, $b, $c> # Error: pattern has 3 elements, list has 2
343
- [name: "x"] -> *<name: $n, age: $a> # Error: key 'age' not found
344
- ```
345
-
346
- ### Slice `/<>`
347
-
348
- Extract a portion using Python-style `start:stop:step`. Works on lists and strings.
349
-
350
- **Basic slicing:**
351
-
352
- ```rill
353
- [0, 1, 2, 3, 4] -> /<0:3> # [0, 1, 2]
354
- [0, 1, 2, 3, 4] -> /<1:4> # [1, 2, 3]
355
- ```
356
-
357
- **Omitted bounds:**
358
-
359
- ```rill
360
- [0, 1, 2, 3, 4] -> /<:3> # [0, 1, 2] (first 3)
361
- [0, 1, 2, 3, 4] -> /<2:> # [2, 3, 4] (from index 2)
362
- ```
363
-
364
- **Negative indices:**
365
-
366
- ```rill
367
- [0, 1, 2, 3, 4] -> /<-2:> # [3, 4] (last 2)
368
- [0, 1, 2, 3, 4] -> /<:-1> # [0, 1, 2, 3] (all but last)
369
- ```
370
-
371
- **Step:**
372
-
373
- ```rill
374
- [0, 1, 2, 3, 4] -> /<::2> # [0, 2, 4] (every 2nd)
375
- [0, 1, 2, 3, 4] -> /<::-1> # [4, 3, 2, 1, 0] (reversed)
376
- ```
377
-
378
- **String slicing:**
379
-
380
- ```rill
381
- "hello" -> /<1:4> # "ell"
382
- "hello" -> /<::-1> # "olleh"
383
- ```
384
-
385
- **Edge cases:**
386
-
387
- ```rill
388
- [1, 2, 3] -> /<0:100> # [1, 2, 3] (clamped)
389
- [1, 2, 3] -> /<2:1> # [] (empty when start >= stop)
390
- ```
391
-
392
- ```text
393
- [1, 2, 3] -> /<::0> # Error: step cannot be zero
394
- ```
395
-
396
- ---
397
-
398
- ## Member Access Operators
399
-
400
- ### Field Access `.field`
401
-
402
- Access dict fields:
403
-
404
- ```rill
405
- [name: "alice", age: 30] :> $person
406
- $person.name # "alice"
407
- $person.age # 30
408
- ```
409
-
410
- ### Index Access `[n]`
411
-
412
- Access list elements (0-based, negative from end):
413
-
414
- ```rill
415
- ["a", "b", "c"] :> $list
416
- $list[0] # "a"
417
- $list[-1] # "c"
418
- $list[1] # "b"
419
- ```
420
-
421
- ### Variable Key `.$key`
422
-
423
- Use a variable as key:
424
-
425
- ```text
426
- "name" :> $key
427
- [name: "alice"] :> $data
428
- $data.$key # "alice"
429
- ```
430
-
431
- ### Computed Key `.($expr)`
432
-
433
- Use an expression as key:
434
-
435
- ```text
436
- 0 :> $i
437
- ["a", "b", "c"] :> $list
438
- $list.($i + 1) # "b"
439
- ```
440
-
441
- ### Alternative Keys `.(a || b)`
442
-
443
- Try keys left-to-right:
444
-
445
- ```text
446
- [nickname: "Al"] :> $user
447
- $user.(name || nickname) # "Al"
448
- ```
449
-
450
- ---
451
-
452
- ## Hierarchical Dispatch
453
-
454
- Navigate nested data structures using a list of keys/indexes as a path:
455
-
456
- ```rill
457
- ["name", "first"] -> [name: [first: "Alice", last: "Smith"]]
458
- # Result: "Alice"
459
- ```
460
-
461
- ### Path Syntax
462
-
463
- Pipe a list path to a target structure. Path elements are applied sequentially:
464
-
465
- - **Strings** navigate dict fields
466
- - **Numbers** index into lists
467
- - **Empty path** returns target unchanged
468
-
469
- ### Dict Path
470
-
471
- ```rill
472
- ["address", "city"] -> [address: [street: "Main", city: "Boston"]]
473
- # Result: "Boston"
474
- ```
475
-
476
- ### List Path
477
-
478
- ```rill
479
- [0, 1] -> [[1, 2, 3], [4, 5, 6]]
480
- # Result: 2 (first list, second element)
481
- ```
482
-
483
- ### Mixed Path
484
-
485
- ```rill
486
- ["users", 0, "name"] -> [users: [[name: "Alice"], [name: "Bob"]]]
487
- # Result: "Alice"
488
- ```
489
-
490
- ### Empty Path
491
-
492
- ```rill
493
- [] -> [name: "test"]
494
- # Result: [name: "test"] (unchanged)
495
- ```
496
-
497
- ### Error Handling
498
-
499
- ```text
500
- ["missing"] -> [name: "test"] # Error: key 'missing' not found
501
- [5] -> [1, 2, 3] # Error: index 5 out of bounds
502
- ```
503
-
504
- See [Reference](11_reference.md) for full dispatch semantics including dict dispatch, list dispatch, and default values.
505
-
506
- ---
507
-
508
- ## Default Operator `??`
509
-
510
- Provide a default value if field is missing or access fails:
511
-
512
- ```rill
513
- [:] :> $empty
514
- $empty.name ?? "unknown" # "unknown"
515
-
516
- [name: "alice"] :> $user
517
- $user.name ?? "unknown" # "alice"
518
- $user.age ?? 0 # 0
519
- ```
520
-
521
- ### With Function Calls
522
-
523
- The default operator works with any expression, including function and method calls:
524
-
525
- ```text
526
- get_data().status ?? "default" # "default" if status field missing
527
- fetch_value() ?? "fallback" # "fallback" if fetch_value returns undefined
528
- ```
529
-
530
- ### With Method Calls
531
-
532
- The `??` operator applies after method invocations in access chains:
533
-
534
- ```text
535
- $dict.transform() ?? "default" # default if method throws or result missing
536
- $obj.compute().value ?? 0 # default if value field missing after method
537
- $config.get_setting() ?? [:] # default if method returns undefined
538
- ```
539
-
540
- Method calls evaluate fully before the default operator applies.
541
-
542
- ---
543
-
544
- ## Existence Operators
545
-
546
- ### Field Existence `.?field`
547
-
548
- Returns boolean:
549
-
550
- ```rill
551
- [name: "alice"] :> $user
552
- $user.?name # true
553
- $user.?age # false
554
- ```
555
-
556
- ### Existence with Type `.?field&type`
557
-
558
- Check existence AND type:
559
-
560
- ```rill
561
- [name: "alice", age: 30] :> $user
562
- $user.?name&string # true
563
- $user.?age&number # true
564
- $user.?age&string # false
565
- ```
566
-
567
- ---
568
-
569
- ## Type Operators
570
-
571
- ### Type Assert `:type`
572
-
573
- Error if type doesn't match, returns value unchanged:
574
-
575
- ```rill
576
- 42:number # 42
577
- "hello" -> :string # "hello"
578
- ```
579
-
580
- ```text
581
- "hello" -> :number # ERROR: expected number, got string
582
- ```
583
-
584
- ### Type Check `:?type`
585
-
586
- Returns boolean:
587
-
588
- ```rill
589
- 42:?number # true
590
- "hello":?number # false
591
- "hello" -> :?string # true
592
- ```
593
-
594
- See [Types](02_types.md) for detailed type system documentation.
595
-
596
- ---
597
-
598
- ## Operator Precedence
599
-
600
- From highest to lowest:
601
-
602
- 1. Member access: `.field`, `[index]`
603
- 2. Type operators: `:type`, `:?type`
604
- 3. Unary: `-`, `!`
605
- 4. Multiplicative: `*`, `/`, `%`
606
- 5. Additive: `+`, `-`
607
- 6. Comparison: `==`, `!=`, `<`, `>`, `<=`, `>=`
608
- 7. Logical AND: `&&`
609
- 8. Logical OR: `||`
610
- 9. Default: `??`
611
- 10. Pipe: `->`
612
- 11. Capture: `:>`
613
-
614
- Use parentheses to override precedence:
615
-
616
- ```rill
617
- (2 + 3) * 4 # 20
618
- 5 -> ($ > 3) ? "big" ! "small" # "big"
619
- ```
620
-
621
- ---
622
-
623
- ## See Also
624
-
625
- - [Types](02_types.md) — Type system and assertions
626
- - [Variables](03_variables.md) — Capture and scope
627
- - [Control Flow](05_control-flow.md) — Conditionals and loops
628
- - [Collections](07_collections.md) — Collection operators
629
- - [Reference](11_reference.md) — Quick reference tables