Lenguaje funcional con efectos algebraicos y fibras aisladas. Sin recolector de basura, sin borrow checker.

Diseñado para que humanos y agentes lo escriban juntos.

¿por qué este nombre?

effect.kai
effect Log {
  log(msg: String) : Unit
}

fn greet(name: String) : Unit / Log {
  Log.log("hello, #{name}")
}

fn main() {
  handle {
    greet("kaikai")
    greet("world")
  } with Log {
    log(msg, resume) -> {
      println("[INFO] #{msg}")
      resume(())
    }
  }
}

Por qué kaikai

Efectos algebraicos

Efectos visibles en el tipo, handlers compositivos. Sin async/await que se propaga por toda la pila de llamadas.

Familia de pipes

Cuatro operadores, cuatro intenciones: |> aplica, | mapea, || aplana, |? filtra. Cada forma dice qué hace antes de leer la función.

Sin GC, sin borrow checker

Perceus reference counting + fibras aisladas. La memoria es por-fibra; no hay pausas globales.

Kinds: unidades, monedas, regiones

Real<m/s> para medidas, monedas que no se mezclan, arenas con region { }. Información en el tipo, costo cero en runtime.

Contratos y refinements

requires, ensures, Int where >= 0. Lo que hace SPARK, sin SMT solver.

Diálogo con el compilador

Holes (?), --holes-json, diagnósticos JSON. Diseñado para que humanos y agentes escriban juntos.