@shd101wyy/yo 0.1.32 → 0.1.34

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 (48) hide show
  1. package/.github/skills/yo-async-effects/async-effects-recipes.md +2 -2
  2. package/.github/skills/yo-core-patterns/SKILL.md +1 -1
  3. package/.github/skills/yo-core-patterns/core-patterns-cheatsheet.md +76 -22
  4. package/.github/skills/yo-syntax/SKILL.md +1 -1
  5. package/.github/skills/yo-syntax/syntax-cheatsheet.md +59 -67
  6. package/out/cjs/index.cjs +662 -574
  7. package/out/cjs/yo-cli.cjs +803 -715
  8. package/out/cjs/yo-lsp.cjs +771 -683
  9. package/out/esm/index.mjs +555 -467
  10. package/out/types/src/codegen/exprs/comptime-value.d.ts +2 -1
  11. package/out/types/src/codegen/functions/context.d.ts +1 -0
  12. package/out/types/src/codegen/types/generation.d.ts +1 -1
  13. package/out/types/src/codegen/utils/index.d.ts +2 -4
  14. package/out/types/src/evaluator/exprs/_expr.d.ts +1 -0
  15. package/out/types/src/evaluator/types/flowability.d.ts +22 -0
  16. package/out/types/src/expr.d.ts +4 -13
  17. package/out/types/src/types/creators.d.ts +2 -3
  18. package/out/types/src/types/definitions.d.ts +2 -3
  19. package/out/types/src/types/guards.d.ts +2 -2
  20. package/out/types/src/types/tags.d.ts +2 -2
  21. package/out/types/src/value-tag.d.ts +0 -1
  22. package/out/types/src/value.d.ts +2 -11
  23. package/out/types/tsconfig.tsbuildinfo +1 -1
  24. package/package.json +1 -1
  25. package/std/alg/hash.yo +5 -3
  26. package/std/build.yo +46 -46
  27. package/std/collections/array_list.yo +73 -66
  28. package/std/collections/hash_map.yo +53 -95
  29. package/std/collections/list_view.yo +77 -0
  30. package/std/crypto/random.yo +5 -5
  31. package/std/encoding/base64.yo +12 -13
  32. package/std/encoding/hex.yo +6 -6
  33. package/std/encoding/json.yo +6 -5
  34. package/std/encoding/utf16.yo +9 -9
  35. package/std/env.yo +8 -8
  36. package/std/fmt/to_string.yo +12 -12
  37. package/std/http/client.yo +1 -1
  38. package/std/imm/list.yo +4 -3
  39. package/std/imm/map.yo +3 -2
  40. package/std/imm/set.yo +4 -3
  41. package/std/imm/sorted_map.yo +3 -2
  42. package/std/imm/sorted_set.yo +4 -3
  43. package/std/imm/string.yo +12 -5
  44. package/std/imm/vec.yo +8 -3
  45. package/std/prelude.yo +178 -401
  46. package/std/string/string.yo +198 -71
  47. package/std/url/index.yo +26 -26
  48. package/out/types/src/evaluator/types/slice.d.ts +0 -8
package/std/prelude.yo CHANGED
@@ -12,7 +12,7 @@
12
12
  // `Comptime` and `Runtime` are defined first because every other
13
13
  // type (including `Pragma` below) is type-checked against them.
14
14
  /// Comptime trait — indicates a type that can be used at compile-time.
15
- /// Examples: `i32`, `bool`, `Type`, `comptime_int`, `comptime_float`, `comptime_string`.
15
+ /// Examples: `i32`, `bool`, `Type`, `comptime_int`, `comptime_float`, `comptime_str`.
16
16
  /// Non-examples: `int`, `ushort` (runtime-only types).
17
17
  Comptime :: trait(
18
18
  id := "Comptime"
@@ -20,7 +20,7 @@ Comptime :: trait(
20
20
  export(Comptime);
21
21
  /// Runtime trait — indicates a type that can be used at runtime.
22
22
  /// Examples: `i32`, `bool`, `*(i32)`, `void`.
23
- /// Non-examples: `comptime_int`, `comptime_float`, `comptime_string`, `Type` (compile-time-only types).
23
+ /// Non-examples: `comptime_int`, `comptime_float`, `comptime_str`, `Type` (compile-time-only types).
24
24
  Runtime :: trait(
25
25
  id := "Runtime"
26
26
  );
@@ -145,27 +145,27 @@ extern(
145
145
  fn(forall(T : Type), ptr1 : T, ptr2 : T) -> bool,
146
146
  __yo_ptr_gte :
147
147
  fn(forall(T : Type), ptr1 : T, ptr2 : T) -> bool,
148
- // slice related
149
- __yo_slice_len :
150
- fn(forall(T : Type), slice : Slice(T)) -> usize,
151
- __yo_slice_new :
152
- fn(forall(T : Type), ptr : *(T), length : usize) -> Slice(T),
153
- __yo_slice_ptr :
154
- fn(forall(T : Type), slice : Slice(T)) -> *(T),
155
- // array/slice indexing builtins (used by Index trait impls)
148
+ // str (builtin static string view) intrinsics
149
+ __yo_str_from_raw_parts :
150
+ fn(ptr : *(u8), length : usize) -> str,
151
+ __yo_str_len :
152
+ fn(s : str) -> usize,
153
+ __yo_str_ptr :
154
+ fn(s : str) -> *(u8),
155
+ __yo_str_byte :
156
+ fn(s : str, idx : usize) -> u8,
157
+ // array indexing builtin (used by Index trait impls)
156
158
  __yo_array_index :
157
159
  fn(forall(T : Type, N : usize), self : *(Array(T, N)), idx : usize) -> *(T),
158
- __yo_slice_index :
159
- fn(forall(T : Type), self : *(Slice(T)), idx : usize) -> *(T),
160
160
  // C macro related
161
- __yo_c_macro_defined : (fn(comptime(name) : comptime_string) -> comptime(bool)),
162
- __yo_c_macro_value : (fn(comptime(name) : comptime_string) -> comptime(comptime_string)),
161
+ __yo_c_macro_defined : (fn(comptime(name) : comptime_str) -> comptime(bool)),
162
+ __yo_c_macro_value : (fn(comptime(name) : comptime_str) -> comptime(comptime_str)),
163
163
  // Process related functions
164
- __yo_process_platform : (fn() -> comptime(comptime_string)),
165
- __yo_process_arch : (fn() -> comptime(comptime_string)),
166
- __yo_process_cwd : (fn() -> comptime(comptime_string)),
167
- __yo_process_env_get : (fn(comptime(key) : comptime_string) -> comptime(comptime_string)),
168
- __yo_process_node_version : (fn() -> comptime(comptime_string))
164
+ __yo_process_platform : (fn() -> comptime(comptime_str)),
165
+ __yo_process_arch : (fn() -> comptime(comptime_str)),
166
+ __yo_process_cwd : (fn() -> comptime(comptime_str)),
167
+ __yo_process_env_get : (fn(comptime(key) : comptime_str) -> comptime(comptime_str)),
168
+ __yo_process_node_version : (fn() -> comptime(comptime_str))
169
169
  );
170
170
  export(__yo_as);
171
171
  /// The `unsafe` module — provides low-level unwind hatches.
@@ -181,7 +181,7 @@ export(unsafe);
181
181
  // c_macro :: impl {
182
182
  // /// Check if a C macro is defined
183
183
  // /// Returns true if the macro exists, false otherwise
184
- // defined :: (fn(comptime(name) : comptime_string) -> comptime(bool))(
184
+ // defined :: (fn(comptime(name) : comptime_str) -> comptime(bool))(
185
185
  // __yo_c_macro_defined(name)
186
186
  // );
187
187
  // export defined;
@@ -189,13 +189,13 @@ export(unsafe);
189
189
  // /// Get the value of a C macro as a compile-time string
190
190
  // /// Returns the macro's value as a string, or empty string "" if not defined
191
191
  // /// Note: For function-like macros, returns the definition without expansion
192
- // value :: (fn(comptime(name) : comptime_string) -> comptime(comptime_string))(
192
+ // value :: (fn(comptime(name) : comptime_str) -> comptime(comptime_str))(
193
193
  // __yo_c_macro_value(name)
194
194
  // );
195
195
  // export value;
196
196
  //
197
197
  // /// Get a macro value with a default fallback
198
- // value_or :: (fn(comptime(name) : comptime_string, comptime(default_val) : comptime_string) -> comptime(comptime_string))(
198
+ // value_or :: (fn(comptime(name) : comptime_str, comptime(default_val) : comptime_str) -> comptime(comptime_str))(
199
199
  // cond(
200
200
  // defined(name) => value(name),
201
201
  // true => default_val
@@ -239,21 +239,6 @@ Index :: (fn(comptime(Idx) : Type) -> comptime(Trait))(
239
239
  )
240
240
  );
241
241
  export(Index);
242
- /// Indexable trait — projection-style indexing yielding a borrow.
243
- /// Companion to `Index`, but instead of returning a raw `*(T)` the
244
- /// `project` method returns a `ref(Element)` — a second-class
245
- /// reference that flows through Yo's flowability rule (R1–R4) and
246
- /// can be received by a `ref(name) := coll.project(pos);` local
247
- /// binding. The for-loop macro lowers iteration through this trait
248
- /// so user code never sees a raw pointer. See
249
- /// plans/ITERATOR_REDESIGN.md.
250
- Indexable :: (fn(comptime(Idx) : Type) -> comptime(Trait))(
251
- trait(
252
- Element : Type,
253
- project : (fn(ref(self) : Self, pos : Idx) -> ref(Self.Element))
254
- )
255
- );
256
- export(Indexable);
257
242
  /// ComptimeIndex — compile-time indexing trait for constant expressions.
258
243
  ComptimeIndex :: (fn(comptime(Idx) : Type, where(Idx <: Comptime)) -> comptime(Trait))(
259
244
  trait(
@@ -283,39 +268,17 @@ RangeInclusiveOp :: trait(
283
268
  (..=) : (fn(start : Self, end : Self) -> RangeInclusive(Self))
284
269
  );
285
270
  export(RangeInclusiveOp);
286
- // array/slice range indexing builtins (declared after Range/RangeInclusive types)
287
- extern(
288
- "Yo",
289
- __yo_array_index_range :
290
- fn(forall(T : Type, N : usize), self : *(Array(T, N)), idx : Range(usize)) -> *(Slice(T)),
291
- __yo_array_index_range_inclusive :
292
- fn(forall(T : Type, N : usize), self : *(Array(T, N)), idx : RangeInclusive(usize)) -> *(Slice(T)),
293
- __yo_slice_index_range :
294
- fn(forall(T : Type), self : *(Slice(T)), idx : Range(usize)) -> *(Slice(T)),
295
- __yo_slice_index_range_inclusive :
296
- fn(forall(T : Type), self : *(Slice(T)), idx : RangeInclusive(usize)) -> *(Slice(T))
297
- );
298
271
  // comptime array/slice/string indexing builtins (used by ComptimeIndex trait impls)
299
272
  extern(
300
273
  "Yo",
301
274
  __yo_comptime_array_index :
302
275
  (fn(forall(T : Type, N : usize), comptime(self) : *(Array(T, N)), comptime(idx) : usize, where(T <: Comptime)) -> comptime(*(T))),
303
- __yo_comptime_slice_index :
304
- (fn(forall(T : Type), comptime(self) : *(Slice(T)), comptime(idx) : usize, where(T <: Comptime)) -> comptime(*(T))),
305
- __yo_comptime_array_index_range :
306
- (fn(forall(T : Type, N : usize), comptime(self) : *(Array(T, N)), comptime(idx) : Range(usize), where(T <: Comptime)) -> comptime(*(Slice(T)))),
307
- __yo_comptime_array_index_range_inclusive :
308
- (fn(forall(T : Type, N : usize), comptime(self) : *(Array(T, N)), comptime(idx) : RangeInclusive(usize), where(T <: Comptime)) -> comptime(*(Slice(T)))),
309
- __yo_comptime_slice_index_range :
310
- (fn(forall(T : Type), comptime(self) : *(Slice(T)), comptime(idx) : Range(usize), where(T <: Comptime)) -> comptime(*(Slice(T)))),
311
- __yo_comptime_slice_index_range_inclusive :
312
- (fn(forall(T : Type), comptime(self) : *(Slice(T)), comptime(idx) : RangeInclusive(usize), where(T <: Comptime)) -> comptime(*(Slice(T)))),
313
276
  __yo_comptime_string_index :
314
- (fn(comptime(self) : comptime_string, comptime(idx) : comptime_int) -> comptime(comptime_string)),
277
+ (fn(comptime(self) : comptime_str, comptime(idx) : comptime_int) -> comptime(comptime_str)),
315
278
  __yo_comptime_string_index_range :
316
- (fn(comptime(self) : comptime_string, comptime(idx) : Range(comptime_int)) -> comptime(comptime_string)),
279
+ (fn(comptime(self) : comptime_str, comptime(idx) : Range(comptime_int)) -> comptime(comptime_str)),
317
280
  __yo_comptime_string_index_range_inclusive :
318
- (fn(comptime(self) : comptime_string, comptime(idx) : RangeInclusive(comptime_int)) -> comptime(comptime_string)),
281
+ (fn(comptime(self) : comptime_str, comptime(idx) : RangeInclusive(comptime_int)) -> comptime(comptime_str)),
319
282
  __yo_comptime_list_index :
320
283
  (fn(forall(T : Type), comptime(self) : *(ComptimeList(T)), comptime(idx) : usize, where(T <: Comptime)) -> comptime(*(T))),
321
284
  __yo_comptime_list_index_range :
@@ -739,11 +702,11 @@ Isolation :: trait(
739
702
  export(Isolation);
740
703
  /// ComptimeToString trait — compile-time string conversion.
741
704
  ComptimeToString :: trait(
742
- to_comptime_string : (fn(comptime(self) : Self) -> comptime(comptime_string)),
705
+ to_comptime_string : (fn(comptime(self) : Self) -> comptime(comptime_str)),
743
706
  where(Self <: Comptime)
744
707
  );
745
708
  // SAFETY: All builtin primitive types (unit, void, comptime_int,
746
- // comptime_float, comptime_string, bool, i8/i16/i32/i64, u8/u16/u32/u64,
709
+ // comptime_float, comptime_str, bool, i8/i16/i32/i64, u8/u16/u32/u64,
747
710
  // f32/f64, isize/usize, char/int/uint/short/ushort/long/ulong/longlong/
748
711
  // ulonglong/longdouble) are plain value types with no heap allocations
749
712
  // or thread-local state. They are trivially safe to send across threads
@@ -974,13 +937,13 @@ impl(
974
937
  );
975
938
  _comptime_float :: comptime_float;
976
939
  export(comptime_float : _comptime_float);
977
- /// comptime_string
978
- impl(comptime_string, Acyclic());
979
- impl(comptime_string, Comptime());
940
+ /// comptime_str
941
+ impl(comptime_str, Acyclic());
942
+ impl(comptime_str, Comptime());
980
943
  impl(
981
- comptime_string,
982
- ComptimeAdd(comptime_string)(
983
- Output : comptime_string,
944
+ comptime_str,
945
+ ComptimeAdd(comptime_str)(
946
+ Output : comptime_str,
984
947
  (+) : (
985
948
  (lhs, rhs) ->
986
949
  __yo_comptime_string_concat(lhs, rhs)
@@ -988,8 +951,8 @@ impl(
988
951
  )
989
952
  );
990
953
  impl(
991
- comptime_string,
992
- ComptimeEq(comptime_string)(
954
+ comptime_str,
955
+ ComptimeEq(comptime_str)(
993
956
  (==) : (
994
957
  (lhs, rhs) ->
995
958
  __yo_comptime_string_eq(lhs, rhs)
@@ -1001,8 +964,8 @@ impl(
1001
964
  )
1002
965
  );
1003
966
  impl(
1004
- comptime_string,
1005
- ComptimeOrd(comptime_string)(
967
+ comptime_str,
968
+ ComptimeOrd(comptime_str)(
1006
969
  (<) : (
1007
970
  (lhs, rhs) ->
1008
971
  __yo_comptime_string_lt(lhs, rhs)
@@ -1022,25 +985,25 @@ impl(
1022
985
  )
1023
986
  );
1024
987
  impl(
1025
- comptime_string,
1026
- len : (fn(comptime(self) : comptime_string) -> comptime(comptime_int))(
988
+ comptime_str,
989
+ len : (fn(comptime(self) : comptime_str) -> comptime(comptime_int))(
1027
990
  __yo_comptime_string_length(self)
1028
991
  ),
1029
- (to_upper) : (fn(comptime(self) : comptime_string) -> comptime(comptime_string))(
992
+ (to_upper) : (fn(comptime(self) : comptime_str) -> comptime(comptime_str))(
1030
993
  __yo_comptime_string_to_upper(self)
1031
994
  ),
1032
- (to_lower) : (fn(comptime(self) : comptime_string) -> comptime(comptime_string))(
995
+ (to_lower) : (fn(comptime(self) : comptime_str) -> comptime(comptime_str))(
1033
996
  __yo_comptime_string_to_lower(self)
1034
997
  ),
1035
- slice : (fn(comptime(self) : comptime_string, comptime(start) : comptime_int, comptime(end) : comptime_int) -> comptime(comptime_string))(
998
+ slice : (fn(comptime(self) : comptime_str, comptime(start) : comptime_int, comptime(end) : comptime_int) -> comptime(comptime_str))(
1036
999
  __yo_comptime_string_slice(self, start, end)
1037
1000
  ),
1038
- to_expr : (fn(comptime(self) : comptime_string) -> comptime(Expr))(
1001
+ to_expr : (fn(comptime(self) : comptime_str) -> comptime(Expr))(
1039
1002
  __yo_comptime_string_to_expr(self)
1040
1003
  )
1041
1004
  );
1042
- _comptime_string :: comptime_string;
1043
- export(comptime_string : _comptime_string);
1005
+ _comptime_string :: comptime_str;
1006
+ export(comptime_str : _comptime_string);
1044
1007
  /// bool
1045
1008
  impl(bool, Send());
1046
1009
  impl(bool, Acyclic());
@@ -5605,119 +5568,19 @@ impl(
5605
5568
  )
5606
5569
  )
5607
5570
  );
5608
- impl(
5609
- forall(T : Type, N : usize),
5610
- Array(T, N),
5611
- Index(Range(usize))(
5612
- Output : Slice(T),
5613
- index : (fn(ref(self) : Self, idx : Range(usize)) -> *(Self.Output))(
5614
- __yo_array_index_range(&(self), idx)
5615
- )
5616
- )
5617
- );
5618
- impl(
5619
- forall(T : Type, N : usize),
5620
- Array(T, N),
5621
- Index(RangeInclusive(usize))(
5622
- Output : Slice(T),
5623
- index : (fn(ref(self) : Self, idx : RangeInclusive(usize)) -> *(Self.Output))(
5624
- __yo_array_index_range_inclusive(&(self), idx)
5625
- )
5626
- )
5571
+ /// RawSlice — a plain ptr+len pair for PRIVILEGED (pragma'd) code: C
5572
+ /// interop and std internals. Carries a raw pointer, so the existing
5573
+ /// raw-pointer gates apply: safe code cannot name or construct it.
5574
+ /// Replaces the builtin Slice(T) for internal plumbing
5575
+ /// (plans/SLICE_REWORK.md step 4).
5576
+ RawSlice :: (fn(comptime(T) : Type) -> comptime(Type))(
5577
+ struct(ptr : *(T), len : usize)
5627
5578
  );
5628
- /// Array Indexable impl — projection-style indexing yielding `ref(T)`.
5629
- /// Body takes `&(self)` so `__yo_array_index`'s `self : *(Array(T, N))`
5630
- /// parameter is satisfied — the `ref(self) : Self` binding gives the
5631
- /// body a value-typed view of `self` even though the C ABI passes a
5632
- /// pointer. The `unsafe` wrap is the trusted escape from the
5633
- /// flowability rule (privileged code only). See plans/ITERATOR_REDESIGN.md.
5634
- impl(
5635
- forall(T : Type, N : usize),
5636
- Array(T, N),
5637
- Indexable(usize)(
5638
- Element : T,
5639
- project : (fn(ref(self) : Self, pos : usize) -> ref(T))(
5640
- cond(
5641
- (pos >= N) => panic("Array: project out of bounds"),
5642
- true => unsafe(__yo_array_index(&(self), pos))
5643
- )
5644
- )
5645
- )
5646
- );
5647
- /// Slice
5648
- // SAFETY: Slice(T) is a value-typed view (pointer + length) over a backing
5579
+ export(RawSlice);
5649
5580
  // array. Sending a slice across threads copies the header; both threads
5650
5581
  // can independently read the backing array. The backing array's lifetime
5651
5582
  // is managed by its owning collection (which must itself be Send to cross
5652
5583
  // threads). Slice is always Acyclic — it is a value type with no ARC.
5653
- impl(forall(T : Type), where(T <: Send), Slice(T), Send());
5654
- impl(forall(T : Type), Slice(T), Acyclic());
5655
- impl(forall(T : Type), where(T <: Comptime), Slice(T), Comptime());
5656
- impl(forall(T : Type), where(T <: Runtime), Slice(T), Runtime());
5657
- impl(forall(T : Type), Range(T), Acyclic());
5658
- impl(forall(T : Type), where(T <: Comptime), Range(T), Comptime());
5659
- impl(forall(T : Type), where(T <: Runtime), Range(T), Runtime());
5660
- impl(forall(T : Type), RangeInclusive(T), Acyclic());
5661
- impl(forall(T : Type), where(T <: Comptime), RangeInclusive(T), Comptime());
5662
- impl(forall(T : Type), where(T <: Runtime), RangeInclusive(T), Runtime());
5663
- impl(
5664
- forall(T : Type),
5665
- Slice(T),
5666
- from_raw_parts : (fn(ptr : *(T), length : usize) -> Self)(
5667
- __yo_slice_new(ptr, length)
5668
- ),
5669
- len : (fn(self : Self) -> usize)(
5670
- __yo_slice_len(self)
5671
- ),
5672
- ptr : (fn(self : Self) -> *(T))(
5673
- __yo_slice_ptr(self)
5674
- )
5675
- );
5676
- /// Slice Index impls (same `&(self)` rationale as Array above).
5677
- impl(
5678
- forall(T : Type),
5679
- Slice(T),
5680
- Index(usize)(
5681
- Output : T,
5682
- index : (fn(ref(self) : Self, idx : usize) -> *(Self.Output))(
5683
- __yo_slice_index(&(self), idx)
5684
- )
5685
- )
5686
- );
5687
- impl(
5688
- forall(T : Type),
5689
- Slice(T),
5690
- Index(Range(usize))(
5691
- Output : Slice(T),
5692
- index : (fn(ref(self) : Self, idx : Range(usize)) -> *(Self.Output))(
5693
- __yo_slice_index_range(&(self), idx)
5694
- )
5695
- )
5696
- );
5697
- impl(
5698
- forall(T : Type),
5699
- Slice(T),
5700
- Index(RangeInclusive(usize))(
5701
- Output : Slice(T),
5702
- index : (fn(ref(self) : Self, idx : RangeInclusive(usize)) -> *(Self.Output))(
5703
- __yo_slice_index_range_inclusive(&(self), idx)
5704
- )
5705
- )
5706
- );
5707
- /// Slice Indexable impl — see Array Indexable above.
5708
- impl(
5709
- forall(T : Type),
5710
- Slice(T),
5711
- Indexable(usize)(
5712
- Element : T,
5713
- project : (fn(ref(self) : Self, pos : usize) -> ref(T))(
5714
- cond(
5715
- (pos >= self.len()) => panic("Slice: project out of bounds"),
5716
- true => unsafe(__yo_slice_index(&(self), pos))
5717
- )
5718
- )
5719
- )
5720
- );
5721
5584
  /// Array ComptimeIndex impls
5722
5585
  impl(
5723
5586
  forall(T : Type, N : usize),
@@ -5730,67 +5593,11 @@ impl(
5730
5593
  )
5731
5594
  )
5732
5595
  );
5596
+ /// comptime_str ComptimeIndex impls
5733
5597
  impl(
5734
- forall(T : Type, N : usize),
5735
- where(T <: Comptime),
5736
- Array(T, N),
5737
- ComptimeIndex(Range(usize))(
5738
- Output : Slice(T),
5739
- index : (fn(comptime(ref(self)) : Self, comptime(idx) : Range(usize)) -> comptime(*(Self.Output)))(
5740
- __yo_comptime_array_index_range(self, idx)
5741
- )
5742
- )
5743
- );
5744
- impl(
5745
- forall(T : Type, N : usize),
5746
- where(T <: Comptime),
5747
- Array(T, N),
5748
- ComptimeIndex(RangeInclusive(usize))(
5749
- Output : Slice(T),
5750
- index : (fn(comptime(ref(self)) : Self, comptime(idx) : RangeInclusive(usize)) -> comptime(*(Self.Output)))(
5751
- __yo_comptime_array_index_range_inclusive(self, idx)
5752
- )
5753
- )
5754
- );
5755
- /// Slice ComptimeIndex impls
5756
- impl(
5757
- forall(T : Type),
5758
- where(T <: Comptime),
5759
- Slice(T),
5760
- ComptimeIndex(usize)(
5761
- Output : T,
5762
- index : (fn(comptime(ref(self)) : Self, comptime(idx) : usize) -> comptime(*(Self.Output)))(
5763
- __yo_comptime_slice_index(self, idx)
5764
- )
5765
- )
5766
- );
5767
- impl(
5768
- forall(T : Type),
5769
- where(T <: Comptime),
5770
- Slice(T),
5771
- ComptimeIndex(Range(usize))(
5772
- Output : Slice(T),
5773
- index : (fn(comptime(ref(self)) : Self, comptime(idx) : Range(usize)) -> comptime(*(Self.Output)))(
5774
- __yo_comptime_slice_index_range(self, idx)
5775
- )
5776
- )
5777
- );
5778
- impl(
5779
- forall(T : Type),
5780
- where(T <: Comptime),
5781
- Slice(T),
5782
- ComptimeIndex(RangeInclusive(usize))(
5783
- Output : Slice(T),
5784
- index : (fn(comptime(ref(self)) : Self, comptime(idx) : RangeInclusive(usize)) -> comptime(*(Self.Output)))(
5785
- __yo_comptime_slice_index_range_inclusive(self, idx)
5786
- )
5787
- )
5788
- );
5789
- /// comptime_string ComptimeIndex impls
5790
- impl(
5791
- comptime_string,
5598
+ comptime_str,
5792
5599
  ComptimeIndex(comptime_int)(
5793
- Output : comptime_string,
5600
+ Output : comptime_str,
5794
5601
  index : (
5795
5602
  (self, idx) ->
5796
5603
  __yo_comptime_string_index(self, idx)
@@ -5798,9 +5605,9 @@ impl(
5798
5605
  )
5799
5606
  );
5800
5607
  impl(
5801
- comptime_string,
5608
+ comptime_str,
5802
5609
  ComptimeIndex(Range(comptime_int))(
5803
- Output : comptime_string,
5610
+ Output : comptime_str,
5804
5611
  index : (
5805
5612
  (self, idx) ->
5806
5613
  __yo_comptime_string_index_range(self, idx)
@@ -5808,37 +5615,58 @@ impl(
5808
5615
  )
5809
5616
  );
5810
5617
  impl(
5811
- comptime_string,
5618
+ comptime_str,
5812
5619
  ComptimeIndex(RangeInclusive(comptime_int))(
5813
- Output : comptime_string,
5620
+ Output : comptime_str,
5814
5621
  index : (
5815
5622
  (self, idx) ->
5816
5623
  __yo_comptime_string_index_range_inclusive(self, idx)
5817
5624
  )
5818
5625
  )
5819
5626
  );
5820
- /// `str` — an immutable UTF-8 byte string view (newtype over `Slice(u8)`).
5627
+ /// `str` — the BUILTIN immutable view of STATIC string bytes (TypeTag.Str,
5628
+ /// a fat pointer `{ const uint8_t* ptr; size_t len; }` in C).
5821
5629
  ///
5822
- /// String literals `"hello"` produce `str` at runtime.
5630
+ /// String literals `"hello"` and template-literal segments produce `str`
5631
+ /// at runtime; the backing bytes live in static storage (immortal), so a
5632
+ /// `str` is freely copyable and storable with no lifetime constraints.
5823
5633
  /// For heap-allocated growable strings, see `String`.
5824
- str :: newtype(
5825
- /// The underlying byte slice.
5826
- bytes : Slice(u8)
5827
- );
5828
5634
  impl(
5829
5635
  str,
5830
5636
  /// Construct a `str` from a raw pointer and length.
5637
+ /// SAFETY: callers must guarantee the bytes outlive every use of the
5638
+ /// view — the safe surface only ever does this with static storage.
5831
5639
  from_raw_parts : (fn(ptr : *(u8), length : usize) -> Self)(
5832
- Self(bytes : __yo_slice_new(ptr, length))
5640
+ __yo_str_from_raw_parts(ptr, length)
5833
5641
  ),
5834
5642
  /// Return the length in bytes.
5835
5643
  len : (fn(self : Self) -> usize)(
5836
- __yo_slice_len(self.bytes)
5644
+ __yo_str_len(self)
5837
5645
  ),
5838
5646
  ptr : (fn(self : Self) -> *(u8))(
5839
- __yo_slice_ptr(self.bytes)
5647
+ __yo_str_ptr(self)
5648
+ ),
5649
+ /// Return the byte at `idx` (bounds are the caller's responsibility,
5650
+ /// mirroring slice indexing).
5651
+ bytes : (fn(self : Self, idx : usize) -> u8)(
5652
+ __yo_str_byte(self, idx)
5840
5653
  )
5841
5654
  );
5655
+ /// Range slicing on `str` stays a ZERO-COPY `str` — a window of static
5656
+ /// bytes is still static (byte indices). `s(a..b)` lowers to this.
5657
+ impl(
5658
+ str,
5659
+ slice_copy : (fn(self : Self, r : Range(usize)) -> Self)({
5660
+ e := cond((r.end > __yo_str_len(self)) => __yo_str_len(self), true => r.end);
5661
+ st := cond((r.start > e) => e, true => r.start);
5662
+ __yo_str_from_raw_parts(__yo_str_ptr(self) &+ st, e - st)
5663
+ }),
5664
+ slice_copy_inclusive : (fn(self : Self, r : RangeInclusive(usize)) -> Self)({
5665
+ e := cond(((r.end + usize(1)) > __yo_str_len(self)) => __yo_str_len(self), true => (r.end + usize(1)));
5666
+ st := cond((r.start > e) => e, true => r.start);
5667
+ __yo_str_from_raw_parts(__yo_str_ptr(self) &+ st, e - st)
5668
+ })
5669
+ );
5842
5670
  impl(
5843
5671
  str,
5844
5672
  Eq(str)(
@@ -5898,7 +5726,8 @@ impl(
5898
5726
  })
5899
5727
  )
5900
5728
  );
5901
- export(str);
5729
+ // (str is a builtin type — no export needed; the identifier resolves
5730
+ // everywhere like bool/i32.)
5902
5731
  assert :: (fn(flag : bool, (msg : str) ?= "Assertion failed.") -> unit)(
5903
5732
  cond(
5904
5733
  flag => (),
@@ -6026,7 +5855,7 @@ impl(
6026
5855
  neq : (fn(comptime(a) : Type, comptime(b) : Type) -> comptime(bool))({
6027
5856
  return(!(__yo_are_types_equal(a, b)));
6028
5857
  }),
6029
- to_comptime_string : (fn(comptime(self) : Type) -> comptime(comptime_string))({
5858
+ to_comptime_string : (fn(comptime(self) : Type) -> comptime(comptime_str))({
6030
5859
  return(__yo_type_to_comptime_string(self));
6031
5860
  })
6032
5861
  );
@@ -6055,7 +5884,7 @@ export(StructKind);
6055
5884
  /// TypeFieldInfo — metadata for a single struct/object field.
6056
5885
  TypeFieldInfo :: struct(
6057
5886
  /// Field name.
6058
- name : comptime_string,
5887
+ name : comptime_str,
6059
5888
  /// Field type.
6060
5889
  field_type : Type
6061
5890
  );
@@ -6078,7 +5907,7 @@ export(TraitInfo);
6078
5907
  /// TraitFieldInfo — metadata for a single trait field.
6079
5908
  TraitFieldInfo :: struct(
6080
5909
  /// Field name.
6081
- name : comptime_string,
5910
+ name : comptime_str,
6082
5911
  /// Field type.
6083
5912
  field_type : Type,
6084
5913
  /// `true` if this field is an associated type (not a method).
@@ -6089,7 +5918,7 @@ export(TraitFieldInfo);
6089
5918
  /// ParamInfo — metadata for a function parameter.
6090
5919
  ParamInfo :: struct(
6091
5920
  /// Parameter name.
6092
- name : comptime_string,
5921
+ name : comptime_str,
6093
5922
  /// Parameter type.
6094
5923
  param_type : Type,
6095
5924
  /// `true` if the parameter is compile-time (`comptime`).
@@ -6103,14 +5932,14 @@ impl(ParamInfo, Comptime());
6103
5932
  export(ParamInfo);
6104
5933
  /// ForallParamInfo — metadata for a forall type parameter.
6105
5934
  ForallParamInfo :: struct(
6106
- name : comptime_string,
5935
+ name : comptime_str,
6107
5936
  param_type : Type
6108
5937
  );
6109
5938
  impl(ForallParamInfo, Comptime());
6110
5939
  export(ForallParamInfo);
6111
5940
  /// ImplicitParamInfo — metadata for a `using`/effect parameter.
6112
5941
  ImplicitParamInfo :: struct(
6113
- name : comptime_string,
5942
+ name : comptime_str,
6114
5943
  param_type : Type
6115
5944
  );
6116
5945
  impl(ImplicitParamInfo, Comptime());
@@ -6144,7 +5973,7 @@ export(TraitKind);
6144
5973
  /// VariantInfo — metadata for an enum variant.
6145
5974
  VariantInfo :: struct(
6146
5975
  /// Variant name.
6147
- name : comptime_string,
5976
+ name : comptime_str,
6148
5977
  /// Variant fields (may be empty for unit variants).
6149
5978
  fields : ComptimeList(TypeFieldInfo),
6150
5979
  _enum_type : Type,
@@ -6182,9 +6011,10 @@ TypeInfo :: enum(
6182
6011
  ULongLong,
6183
6012
  LongDouble,
6184
6013
  Void,
6014
+ /// `str` — static string view (fieldless)
6015
+ Str,
6185
6016
  // Compound types (with metadata)
6186
6017
  Array(element : Type, length : comptime_int),
6187
- Slice(element : Type),
6188
6018
  Tuple(fields : ComptimeList(TypeFieldInfo)),
6189
6019
  Struct(
6190
6020
  fields : ComptimeList(TypeFieldInfo),
@@ -6210,7 +6040,7 @@ TypeInfo :: enum(
6210
6040
  ),
6211
6041
  Type(level : comptime_int),
6212
6042
  Some(
6213
- name : comptime_string,
6043
+ name : comptime_str,
6214
6044
  required_traits : ComptimeList(TraitInfo),
6215
6045
  negative_traits : ComptimeList(TraitInfo),
6216
6046
  resolved_type : Type
@@ -6218,7 +6048,7 @@ TypeInfo :: enum(
6218
6048
  // Comptime only
6219
6049
  ComptimeInt,
6220
6050
  ComptimeFloat,
6221
- ComptimeString,
6051
+ ComptimeStr,
6222
6052
  ComptimeList(element : Type),
6223
6053
  // Metaprogramming (fieldless)
6224
6054
  Expr,
@@ -6243,8 +6073,8 @@ impl(
6243
6073
  is_array : (fn(comptime(self) : TypeInfo) -> comptime(bool))(
6244
6074
  match(self,.Array(_, _) => true, _ => false)
6245
6075
  ),
6246
- is_slice : (fn(comptime(self) : TypeInfo) -> comptime(bool))(
6247
- match(self,.Slice(_) => true, _ => false)
6076
+ is_str : (fn(comptime(self) : TypeInfo) -> comptime(bool))(
6077
+ match(self,.Str => true, _ => false)
6248
6078
  ),
6249
6079
  is_function : (fn(comptime(self) : TypeInfo) -> comptime(bool))(
6250
6080
  match(self,.Function(_) => true, _ => false)
@@ -6284,6 +6114,7 @@ impl(
6284
6114
  .LongLong => true,
6285
6115
  .ULongLong => true,
6286
6116
  .LongDouble => true,
6117
+ .Str => true,
6287
6118
  _ => false
6288
6119
  )
6289
6120
  ),
@@ -6326,7 +6157,7 @@ impl(
6326
6157
  self,
6327
6158
  .ComptimeInt => true,
6328
6159
  .ComptimeFloat => true,
6329
- .ComptimeString => true,
6160
+ .ComptimeStr => true,
6330
6161
  .ComptimeList(_) => true,
6331
6162
  .Expr => true,
6332
6163
  _ => false
@@ -6388,7 +6219,7 @@ impl(
6388
6219
  })
6389
6220
  );
6390
6221
  /// `FieldInfo` — compile-time struct field metadata for derive rules (legacy alias).
6391
- FieldInfo :: struct(name : comptime_string, field_type : Type);
6222
+ FieldInfo :: struct(name : comptime_str, field_type : Type);
6392
6223
  impl(FieldInfo, Comptime());
6393
6224
  impl(
6394
6225
  FieldInfo,
@@ -6685,9 +6516,9 @@ export(DeriveContext);
6685
6516
  __yo_comptime_fold_range :: (
6686
6517
  fn(
6687
6518
  comptime(n) : usize,
6688
- comptime(init) : comptime_string,
6689
- comptime(f) : (fn(comptime(acc) : comptime_string, comptime(i) : usize) -> comptime(comptime_string))
6690
- ) -> comptime(comptime_string)
6519
+ comptime(init) : comptime_str,
6520
+ comptime(f) : (fn(comptime(acc) : comptime_str, comptime(i) : usize) -> comptime(comptime_str))
6521
+ ) -> comptime(comptime_str)
6691
6522
  )(
6692
6523
  cond(
6693
6524
  (n == usize(0)) => init,
@@ -6696,17 +6527,17 @@ __yo_comptime_fold_range :: (
6696
6527
  )
6697
6528
  );
6698
6529
  // Helper: concat 2 strings
6699
- __s2 :: (fn(comptime(a) : comptime_string, comptime(b) : comptime_string) -> comptime(comptime_string))(a + b);
6530
+ __s2 :: (fn(comptime(a) : comptime_str, comptime(b) : comptime_str) -> comptime(comptime_str))(a + b);
6700
6531
  // Helper: concat 3 strings
6701
- __s3 :: (fn(comptime(a) : comptime_string, comptime(b) : comptime_string, comptime(c) : comptime_string) -> comptime(comptime_string))(
6532
+ __s3 :: (fn(comptime(a) : comptime_str, comptime(b) : comptime_str, comptime(c) : comptime_str) -> comptime(comptime_str))(
6702
6533
  (a + b) + c
6703
6534
  );
6704
6535
  // Helper: concat 4 strings
6705
- __s4 :: (fn(comptime(a) : comptime_string, comptime(b) : comptime_string, comptime(c) : comptime_string, comptime(d) : comptime_string) -> comptime(comptime_string))(
6536
+ __s4 :: (fn(comptime(a) : comptime_str, comptime(b) : comptime_str, comptime(c) : comptime_str, comptime(d) : comptime_str) -> comptime(comptime_str))(
6706
6537
  ((a + b) + c) + d
6707
6538
  );
6708
6539
  // Helper: concat 5 strings
6709
- __s5 :: (fn(comptime(a) : comptime_string, comptime(b) : comptime_string, comptime(c) : comptime_string, comptime(d) : comptime_string, comptime(e) : comptime_string) -> comptime(comptime_string))(
6540
+ __s5 :: (fn(comptime(a) : comptime_str, comptime(b) : comptime_str, comptime(c) : comptime_str, comptime(d) : comptime_str, comptime(e) : comptime_str) -> comptime(comptime_str))(
6710
6541
  (((a + b) + c) + d) + e
6711
6542
  );
6712
6543
  // --- derive_rule for Eq ---
@@ -6738,7 +6569,7 @@ __derive_eq :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime(t
6738
6569
  eq_branches :: __yo_comptime_fold_range(
6739
6570
  vc,
6740
6571
  "",
6741
- (fn(comptime(acc) : comptime_string, comptime(vi) : usize) -> comptime(comptime_string))({
6572
+ (fn(comptime(acc) : comptime_str, comptime(vi) : usize) -> comptime(comptime_str))({
6742
6573
  v :: variants.get(vi);
6743
6574
  branch :: cond(
6744
6575
  (v.fields.len() == 0) =>
@@ -6747,7 +6578,7 @@ __derive_eq :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime(t
6747
6578
  lhs_bindings :: __yo_comptime_fold_range(
6748
6579
  v.fields.len(),
6749
6580
  "",
6750
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6581
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
6751
6582
  fname :: v.fields.get(fi).name;
6752
6583
  cond(
6753
6584
  (a == "") => __s2("__lhs_", fname),
@@ -6758,7 +6589,7 @@ __derive_eq :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime(t
6758
6589
  rhs_bindings :: __yo_comptime_fold_range(
6759
6590
  v.fields.len(),
6760
6591
  "",
6761
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6592
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
6762
6593
  fname :: v.fields.get(fi).name;
6763
6594
  cond(
6764
6595
  (a == "") => __s2("__rhs_", fname),
@@ -6769,7 +6600,7 @@ __derive_eq :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime(t
6769
6600
  eq_cmp :: __yo_comptime_fold_range(
6770
6601
  v.fields.len(),
6771
6602
  "",
6772
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6603
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
6773
6604
  fname :: v.fields.get(fi).name;
6774
6605
  part :: __s4("(__lhs_", fname, " == __rhs_", fname);
6775
6606
  cond(
@@ -6813,6 +6644,10 @@ __derive_eq :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime(t
6813
6644
  )
6814
6645
  });
6815
6646
  derive_rule(Eq, __derive_eq);
6647
+ // `Pragma` (defined near the top) is compared by `==` in the compiler's
6648
+ // memory-safety pragma registry. Derived here, once the `Eq` derive rule
6649
+ // is registered.
6650
+ derive(Pragma, Eq(Pragma));
6816
6651
  // --- derive_rule for Clone ---
6817
6652
  __derive_clone :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime(trait_params) : ComptimeList(Expr)) -> comptime(Expr))({
6818
6653
  info :: Type.get_info(T);
@@ -6824,7 +6659,7 @@ __derive_clone :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptim
6824
6659
  cloned_fields :: __yo_comptime_fold_range(
6825
6660
  fc,
6826
6661
  "",
6827
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6662
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
6828
6663
  fname :: fields.get(fi).name;
6829
6664
  part :: __s3("self.", fname, ".clone()");
6830
6665
  cond(
@@ -6848,7 +6683,7 @@ __derive_clone :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptim
6848
6683
  clone_branches :: __yo_comptime_fold_range(
6849
6684
  vc,
6850
6685
  "",
6851
- (fn(comptime(acc) : comptime_string, comptime(vi) : usize) -> comptime(comptime_string))({
6686
+ (fn(comptime(acc) : comptime_str, comptime(vi) : usize) -> comptime(comptime_str))({
6852
6687
  v :: variants.get(vi);
6853
6688
  branch :: cond(
6854
6689
  (v.fields.len() == 0) => __s4(".", v.name, " => .", v.name),
@@ -6856,7 +6691,7 @@ __derive_clone :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptim
6856
6691
  bindings :: __yo_comptime_fold_range(
6857
6692
  v.fields.len(),
6858
6693
  "",
6859
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6694
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
6860
6695
  fname :: v.fields.get(fi).name;
6861
6696
  cond(
6862
6697
  (a == "") => __s2("__v_", fname),
@@ -6867,7 +6702,7 @@ __derive_clone :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptim
6867
6702
  cloned :: __yo_comptime_fold_range(
6868
6703
  v.fields.len(),
6869
6704
  "",
6870
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6705
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
6871
6706
  fname :: v.fields.get(fi).name;
6872
6707
  cond(
6873
6708
  (a == "") => __s3("__v_", fname, ".clone()"),
@@ -6930,7 +6765,7 @@ __derive_hash :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime
6930
6765
  hash_stmts :: __yo_comptime_fold_range(
6931
6766
  fc,
6932
6767
  "",
6933
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6768
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
6934
6769
  fname :: fields.get(fi).name;
6935
6770
  cond(
6936
6771
  (fi == 0) => __s3("(h : u64) = self.", fname, ".hash()"),
@@ -6955,7 +6790,7 @@ __derive_hash :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime
6955
6790
  hash_branches :: __yo_comptime_fold_range(
6956
6791
  vc,
6957
6792
  "",
6958
- (fn(comptime(acc) : comptime_string, comptime(vi) : usize) -> comptime(comptime_string))({
6793
+ (fn(comptime(acc) : comptime_str, comptime(vi) : usize) -> comptime(comptime_str))({
6959
6794
  v :: variants.get(vi);
6960
6795
  vi_str :: __yo_comptime_usize_to_comptime_string(vi);
6961
6796
  branch :: cond(
@@ -6964,7 +6799,7 @@ __derive_hash :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime
6964
6799
  bindings :: __yo_comptime_fold_range(
6965
6800
  v.fields.len(),
6966
6801
  "",
6967
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6802
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
6968
6803
  fname :: v.fields.get(fi).name;
6969
6804
  cond(
6970
6805
  (a == "") => __s2("__v_", fname),
@@ -6975,7 +6810,7 @@ __derive_hash :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime
6975
6810
  hash_stmts :: __yo_comptime_fold_range(
6976
6811
  v.fields.len(),
6977
6812
  __s3("(h : u64) = u64(", vi_str, ")"),
6978
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6813
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
6979
6814
  fname :: v.fields.get(fi).name;
6980
6815
  __s4(a, "; h = ((h * u64(31)) + __v_", fname, ".hash())")
6981
6816
  })
@@ -7017,7 +6852,7 @@ __derive_hash :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime
7017
6852
  derive_rule(Hash, __derive_hash);
7018
6853
  // --- derive_rule for Ord ---
7019
6854
  // Helper: generate lexicographic comparison for struct fields
7020
- __derive_ord_struct_body :: (fn(comptime(T) : Type, comptime(op) : comptime_string) -> comptime(comptime_string))({
6855
+ __derive_ord_struct_body :: (fn(comptime(T) : Type, comptime(op) : comptime_str) -> comptime(comptime_str))({
7021
6856
  fields :: Type.get_struct_fields(T);
7022
6857
  fc :: fields.len();
7023
6858
  cond(
@@ -7029,7 +6864,7 @@ __derive_ord_struct_body :: (fn(comptime(T) : Type, comptime(op) : comptime_stri
7029
6864
  branches :: __yo_comptime_fold_range(
7030
6865
  fc,
7031
6866
  "",
7032
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6867
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
7033
6868
  fname :: fields.get(fi).name;
7034
6869
  branch :: cond(
7035
6870
  (fi == (fc - 1)) =>
@@ -7048,7 +6883,7 @@ __derive_ord_struct_body :: (fn(comptime(T) : Type, comptime(op) : comptime_stri
7048
6883
  )
7049
6884
  });
7050
6885
  // Helper: generate lexicographic comparison for enum variant bindings
7051
- __derive_ord_variant_body :: (fn(comptime(v) : VariantInfo, comptime(op) : comptime_string) -> comptime(comptime_string))(
6886
+ __derive_ord_variant_body :: (fn(comptime(v) : VariantInfo, comptime(op) : comptime_str) -> comptime(comptime_str))(
7052
6887
  cond(
7053
6888
  (v.fields.len() == 1) => {
7054
6889
  fname :: v.fields.get(0).name;
@@ -7058,7 +6893,7 @@ __derive_ord_variant_body :: (fn(comptime(v) : VariantInfo, comptime(op) : compt
7058
6893
  branches :: __yo_comptime_fold_range(
7059
6894
  v.fields.len(),
7060
6895
  "",
7061
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6896
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
7062
6897
  fname :: v.fields.get(fi).name;
7063
6898
  branch :: cond(
7064
6899
  (fi == (v.fields.len() - 1)) =>
@@ -7116,11 +6951,11 @@ __derive_ord :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime(
7116
6951
  variants :: Type.get_enum_variants(T);
7117
6952
  vc :: variants.len();
7118
6953
  // Generate one operator's match branches
7119
- __gen_op_branches :: (fn(comptime(op) : comptime_string, comptime(eq_val) : comptime_string) -> comptime(comptime_string))({
6954
+ __gen_op_branches :: (fn(comptime(op) : comptime_str, comptime(eq_val) : comptime_str) -> comptime(comptime_str))({
7120
6955
  branches :: __yo_comptime_fold_range(
7121
6956
  vc,
7122
6957
  "",
7123
- (fn(comptime(acc) : comptime_string, comptime(vi) : usize) -> comptime(comptime_string))({
6958
+ (fn(comptime(acc) : comptime_str, comptime(vi) : usize) -> comptime(comptime_str))({
7124
6959
  v :: variants.get(vi);
7125
6960
  branch :: cond(
7126
6961
  (v.fields.len() == 0) =>
@@ -7129,7 +6964,7 @@ __derive_ord :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime(
7129
6964
  lhs_bindings :: __yo_comptime_fold_range(
7130
6965
  v.fields.len(),
7131
6966
  "",
7132
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6967
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
7133
6968
  fname :: v.fields.get(fi).name;
7134
6969
  cond(
7135
6970
  (a == "") => __s2("__lhs_", fname),
@@ -7140,7 +6975,7 @@ __derive_ord :: (fn(comptime(T) : Type, comptime(ctx) : DeriveContext, comptime(
7140
6975
  rhs_bindings :: __yo_comptime_fold_range(
7141
6976
  v.fields.len(),
7142
6977
  "",
7143
- (fn(comptime(a) : comptime_string, comptime(fi) : usize) -> comptime(comptime_string))({
6978
+ (fn(comptime(a) : comptime_str, comptime(fi) : usize) -> comptime(comptime_str))({
7144
6979
  fname :: v.fields.get(fi).name;
7145
6980
  cond(
7146
6981
  (a == "") => __s2("__rhs_", fname),
@@ -7692,55 +7527,24 @@ IntoIterator :: trait(
7692
7527
  );
7693
7528
  export(IntoIterator);
7694
7529
  /// === Array Iterator ===
7695
- /// Position iterator for Array(T, N) — yields `usize` indices.
7696
- /// Used by `Array.iter()`; the for-macro pairs each yielded position
7697
- /// with `Array.project(pos)` (Indexable trait) to hand the body a
7698
- /// `ref(T)`-binding into the element. See plans/ITERATOR_REDESIGN.md.
7699
- _ArrayPosIter :: struct(
7700
- _index : usize,
7701
- _len : usize
7702
- );
7703
- impl(
7704
- _ArrayPosIter,
7705
- Iterator(
7706
- Item : usize,
7707
- next : (fn(ref(self) : Self) -> Option(usize))(
7708
- cond(
7709
- (self._index >= self._len) =>.None,
7710
- true => {
7711
- out := self._index;
7712
- self._index = (self._index + usize(1));
7713
- .Some(out)
7714
- }
7715
- )
7716
- )
7530
+ /// Value iterator for Array(T, N) — yields elements by value. Backs
7531
+ /// the for-macro value form `for(arr, (x) => body)` via `into_iter`.
7532
+ _ArrayIter :: (fn(comptime(T) : Type, comptime(N) : usize) -> comptime(Type))(
7533
+ struct(
7534
+ _arr : Array(T, N),
7535
+ _index : usize
7717
7536
  )
7718
7537
  );
7719
7538
  impl(
7720
7539
  forall(T : Type, N : usize),
7721
- Array(T, N),
7722
- iter : (fn(ref(self) : Self) -> _ArrayPosIter)(
7723
- _ArrayPosIter(_index : usize(0), _len : N)
7724
- )
7725
- );
7726
- /// === Slice Iterator ===
7727
- /// Position iterator for Slice(T) — yields `usize` indices into the
7728
- /// slice. Used by `Slice.iter()`; the for-macro pairs each yielded
7729
- /// position with `Slice.project(pos)` (Indexable) to bind the body's
7730
- /// `ref`-name. See plans/ITERATOR_REDESIGN.md.
7731
- _SlicePosIter :: struct(
7732
- _index : usize,
7733
- _len : usize
7734
- );
7735
- impl(
7736
- _SlicePosIter,
7540
+ _ArrayIter(T, N),
7737
7541
  Iterator(
7738
- Item : usize,
7739
- next : (fn(ref(self) : Self) -> Option(usize))(
7542
+ Item : T,
7543
+ next : (fn(ref(self) : Self) -> Option(T))(
7740
7544
  cond(
7741
- (self._index >= self._len) =>.None,
7545
+ (self._index >= N) =>.None,
7742
7546
  true => {
7743
- out := self._index;
7547
+ out := self._arr(self._index);
7744
7548
  self._index = (self._index + usize(1));
7745
7549
  .Some(out)
7746
7550
  }
@@ -7749,10 +7553,10 @@ impl(
7749
7553
  )
7750
7554
  );
7751
7555
  impl(
7752
- forall(T : Type),
7753
- Slice(T),
7754
- iter : (fn(ref(self) : Self) -> _SlicePosIter)(
7755
- _SlicePosIter(_index : usize(0), _len : self.len())
7556
+ forall(T : Type, N : usize),
7557
+ Array(T, N),
7558
+ into_iter : (fn(self : Self) -> _ArrayIter(T, N))(
7559
+ _ArrayIter(T, N)(_arr : self, _index : usize(0))
7756
7560
  )
7757
7561
  );
7758
7562
  /// TryFrom trait — fallible conversion from one type to another.
@@ -7818,33 +7622,30 @@ try :: (fn(quote(expr_to_try) : Expr) -> unquote(Expr))({
7818
7622
  })
7819
7623
  });
7820
7624
  export(try);
7821
- /// `for` macro — iterate over a collection. The lambda's binding shape
7822
- /// dictates whether the iteration borrows or consumes:
7823
- ///
7824
- /// `for(coll, ref(x) => body)` — borrow form. Calls `coll.iter()`
7825
- /// (must yield positions) + `coll.project(pos)` for each. `x` is
7826
- /// `ref`-bound to the element; reads auto-deref, writes propagate
7827
- /// back to the collection; `coll` survives the loop.
7625
+ /// `for` macro — iterate over a collection.
7828
7626
  ///
7829
- /// `for(coll, (x) => body)` — value form. Calls `coll.into_iter()`
7830
- /// and binds `x` to each yielded value. The collection is moved
7831
- /// into the iterator and consumed.
7627
+ /// `for(coll, (x) => body)` — calls `coll.into_iter()` and binds `x`
7628
+ /// to each yielded value. The collection is moved into the
7629
+ /// iterator; object elements are handles, so mutating `x` in the
7630
+ /// body mutates the element in place.
7832
7631
  ///
7833
- /// Combinator chains (`coll.iter().map(f)`, etc.) only support the
7834
- /// value form they yield computed values, not borrows. A blanket
7835
- /// `into_iter` impl on `Iterator` (below) makes the value form work
7836
- /// transparently on iterator chains.
7632
+ /// The old borrow form `for(coll, ref(x) => body)` was REMOVED: it
7633
+ /// required `ref`s into reallocatable storage, which is no longer
7634
+ /// expressible. Object elements mutate in place through the value
7635
+ /// handle; struct elements use an index loop with `get`/`set`.
7837
7636
  ///
7838
- /// See plans/ITERATOR_REDESIGN.md.
7637
+ /// Combinator chains (`coll.into_iter().map(f)`, etc.) work
7638
+ /// transparently: a blanket `into_iter` impl on `Iterator` (below)
7639
+ /// makes every iterator its own `IntoIterator`.
7839
7640
  ///
7840
7641
  /// # Examples
7841
7642
  /// ```rust
7842
- /// // Borrow form — mutate elements in place.
7843
- /// for(arr, ref(x) => {
7844
- /// x = (x + i32(1));
7643
+ /// // Object elements — mutate in place through the handle.
7644
+ /// for(names, (s) => {
7645
+ /// s.push_str("!");
7845
7646
  /// });
7846
7647
  ///
7847
- /// // Value form consume the collection.
7648
+ /// // Consume an iterator chain.
7848
7649
  /// for(list.into_iter(), (x) => print(x));
7849
7650
  /// ```
7850
7651
  for :: (
@@ -7875,38 +7676,14 @@ for :: (
7875
7676
  );
7876
7677
  cond(
7877
7678
  is_ref_form => {
7878
- v_args :: variable.get_args();
7879
- comptime_assert(v_args.len() == 1, "'for' macro: ref(name) requires exactly one name");
7880
- name :: v_args.car();
7881
- iter_var :: gensym("for_iter_var");
7882
- pos_var :: gensym("for_pos_var");
7883
- // Note: the borrow form does NOT materialize a local
7884
- // copy of `coll`. Writes through `ref(x) := …
7885
- // coll.project(pos)` need to propagate to the caller's
7886
- // storage; a value-typed local copy would receive the
7887
- // writes silently. The for-macro consumes `coll` as an
7888
- // expression directly so the `&coll` pointer it
7889
- // implicitly forms reaches the caller's collection.
7890
- // (This is correct for `coll : Array(T, N)` /
7891
- // `Slice(T)` / `String` value-typed collections and
7892
- // for `ref(coll)`-bound parameter inputs; for owning
7893
- // collections like `ArrayList` whose internal storage
7894
- // is heap, the receiver-by-ref semantics already work.)
7895
- quote({
7896
- unquote(iter_var) := unquote(coll).iter();
7897
- while(runtime(true), {
7898
- match(
7899
- unquote(iter_var).next(),
7900
- .Some(unquote(pos_var)) => {
7901
- ref(unquote(name)) := unquote(coll).project(unquote(pos_var));
7902
- unquote(body);
7903
- },
7904
- .None => {
7905
- break;
7906
- }
7907
- );
7908
- });
7909
- })
7679
+ // The borrow form is gone: it handed out refs into
7680
+ // reallocatable storage. Teach the migration instead
7681
+ // of failing with a resolution error.
7682
+ comptime_assert(
7683
+ false,
7684
+ "'for(coll, ref(x) => ...)' was removed - use the value form 'for(coll, (x) => ...)'. Object elements are handles and mutate in place; for struct elements use an index loop with get/set."
7685
+ );
7686
+ quote(())
7910
7687
  },
7911
7688
  true => {
7912
7689
  iter_var :: gensym("for_iter_var");