Fixed arity

Every invocable in ral — builtin, prelude function, user binding — takes a fixed number of arguments. There is no variadic application, and no optional or default argument anywhere in the language, the prelude, or the builtins.

A computation’s arity is part of its type. Under call-by-push-value a function is a computation that consumes a fixed sequence of value arguments; admitting a variable count would make application irregular and defeat the clean value/computation separation the type discipline rests on.

Optionality, where genuinely needed, is expressed as data rather than as a hole in an argument list: an open variant (`some v / `none), passed as an ordinary value. The caller always supplies every argument; the value it supplies may carry presence or absence.

This is a hard rule, not a stylistic preference. Do not introduce:

  • variadic builtins;
  • splat parameters;
  • defaulted prelude arguments.