///|
fn sqrt_spec() -> FunctionSpec {
  FunctionSpec::make(
    ["\\sqrt"],
    1,
    num_optional_args=1,
    primitive_after_missing_optional=0,
    handler=sqrt_handler,
  )
}

///|
fn sqrt_handler(
  context : FunctionContext,
  args : Array[ParseNode],
  opt_args : Array[ParseNode?],
) -> ParseNode raise ParseFailure {
  guard args.get(0) is Some(body) else {
    raise InternalInvariant(message="Missing body argument for \\sqrt")
  }
  guard opt_args.get(0) is Some(index) else {
    raise InternalInvariant(message="Missing optional argument slot for \\sqrt")
  }
  Sqrt(mode=context.mode, body~, index~)
}