move builtin operator overloads into separate file; add array math operators
authorJudah Caruso <judah@tuta.io>
Tue, 5 Dec 2023 17:57:47 +0000 (10:57 -0700)
committerJudah Caruso <judah@tuta.io>
Tue, 5 Dec 2023 17:57:47 +0000 (10:57 -0700)
core/builtin.onyx
core/operations.onyx [new file with mode: 0644]

index eed4ad272dcebc535db8fd4979f986d65e0085e4..0a18e33992e3db95833ed306a9e9a56880d3a5c6 100644 (file)
@@ -577,12 +577,8 @@ package_id :: #distinct u32
 any_package :: cast(package_id) 0
 
 //
-// Allow for comparing `package_id`s
-#operator == macro (p1, p2: package_id) => cast(u32) p1 == cast(u32) p2;
-#operator != macro (p1, p2: package_id) => cast(u32) p1 != cast(u32) p2;
-
-#operator == macro (l, r: [$N]$T) => core.intrinsics.wasm.memory_equal(cast(rawptr)l, cast(rawptr)r, N * sizeof T);
-#operator != macro (l, r: [$N]$T) => !(l == r);
+// Load builtin operator overloads.
+#load "./operations.onyx"
 
 //
 // DEPRECATED THINGS
diff --git a/core/operations.onyx b/core/operations.onyx
new file mode 100644 (file)
index 0000000..6e203f6
--- /dev/null
@@ -0,0 +1,28 @@
+package builtin
+
+//
+// This file contains builtin operator overloads.
+// It's in a separate file because we need to defer resolution of some definitions
+// until certain types are defined (namely builtin code used for math operators).
+//
+
+//
+// Allows for comparing `package_id`s
+#operator == macro (p1, p2: package_id) => cast(u32) p1 == cast(u32) p2;
+#operator != macro (p1, p2: package_id) => cast(u32) p1 != cast(u32) p2;
+
+//
+// Allows for basic array programming support
+#operator + (l, r: [$N]$T) => __array_math_op(l, r, [a, b](a + b));
+#operator - (l, r: [$N]$T) => __array_math_op(l, r, [a, b](a - b));
+#operator * (l, r: [$N]$T) => __array_math_op(l, r, [a, b](a * b));
+#operator / (l, r: [$N]$T) => __array_math_op(l, r, [a, b](a / b));
+
+#operator == macro (l, r: [$N]$T) => core.intrinsics.wasm.memory_equal(cast(rawptr)l, cast(rawptr)r, N * sizeof T);
+#operator != macro (l, r: [$N]$T) => !(l == r);
+
+#local __array_math_op :: macro (l, r: [$N]$T, $body: Code) -> [N]T {
+   res: [N]T;
+   for 0..N do res[it] = #unquote body(l[it], r[it]);
+   return res;
+}