///|
pub fn Closure::new(
  id : Int,
  params : Array[String],
  rest : String?,
  body : Array[Datum],
  env : Env,
) -> Closure {
  { id, params, rest, body, env }
}

///|
pub fn CaseClosure::new(
  id : Int,
  clauses : Array[CaseClause],
  env : Env,
) -> CaseClosure {
  { id, clauses, env }
}

///|
pub fn EvalEnv::new(id : Int, env : Env) -> EvalEnv {
  { id, env }
}

///|
pub fn Parameter::new(id : Int, value : Value, converter : Value?) -> Parameter {
  { id, value: Ref(value), converter }
}

///|
pub fn Promise::new(id : Int, state : PromiseState) -> Promise {
  { id, state: Ref(state) }
}

///|
pub fn SyntaxRule::new(
  pattern : Datum,
  template : Datum,
  fender : Datum?,
) -> SyntaxRule {
  { pattern, template, fender }
}

///|
pub fn SyntaxRules::new(
  literals : Array[String],
  rules : Array[SyntaxRule],
  ellipsis : String,
  kind : SyntaxRulesKind,
  def_env : Env,
) -> SyntaxRules {
  { literals, rules, ellipsis, kind, def_env }
}

///|
pub fn SyntaxObject::new(
  datum : Datum,
  scopes : Array[Int],
  binding_id : Int?,
) -> SyntaxObject {
  { datum, scopes, binding_id }
}

///|
pub fn CaseClause::new(
  params : Array[String],
  rest : String?,
  body : Array[Datum],
) -> CaseClause {
  { params, rest, body }
}

///|
pub fn GuardHandler::new(
  id : Int,
  name : String,
  clauses : Array[Datum],
  env : Env,
  resume_value : Value,
  handlers : Array[Value],
) -> GuardHandler {
  { id, name, clauses, env, resume_value, handlers }
}