Introduce StaticType::Variadic for variadic parameters

This commit introduces `StaticType::Variadic` to represent variadic
parameter types in function signatures. This allows for more precise
type checking of functions that accept a variable number of arguments,
such as arithmetic operators.

Previously, variadic functions were handled using `StaticType::Any`,
which was too permissive and could lead to runtime errors. The new
`Variadic` type enforces that all arguments must conform to a specified
inner type.

Changes include:

- Adding `StaticType::Variadic` to `src/ast/types.rs`.
- Updating the type checker to handle `Variadic` types correctly when
  unifying with tuples or single arguments.
- Modifying built-in functions like arithmetic operators to use
  `Variadic` for their parameter types.
- Improving error messages for function call mismatches to be more
  specific.
- Adding a new test case to ensure arithmetic type mismatches are caught
  at compile time.
- A new example `data_stream_pipe_buffered.myc` is added.
- The `HMA.myc` example now has a `Skip: output` directive.
This commit is contained in:
2026-03-30 11:36:26 +02:00
parent f1621ed1ac
commit 8aa2a67b5b
9 changed files with 89 additions and 20 deletions
+3 -3
View File
@@ -104,10 +104,10 @@ pub fn register(env: &Environment) {
}).doc("Returns the absolute value of a number. Works for both int and float.")
.examples(&["(abs -5)", "(abs -3.14)"]);
// Variadic min / max
// Variadic min / max — each argument must be numeric
let variadic_ty = StaticType::Function(Box::new(Signature {
params: StaticType::Any,
ret: StaticType::Any,
params: StaticType::Variadic(Box::new(StaticType::Float)),
ret: StaticType::Float,
}));
env.register_native_fn("min", variadic_ty.clone(), Purity::Pure, |args| {