KScript

JavaScript al estilo ML

Documentaciónnpm

Características

Sintáxis de ML

La sintaxis contiene menos parentesis, comas, puntos y comas y llaves. Todo ello con el fin de que el código se más facil de comprender.

Por ejemplo, el siguiente bloque de código crea un elemento div e imprime una alerta al hacerle click.

const div = document.createElement "div"

div.addEventListener "click" #(
    $.preventDefault()
    alert "Hiciste click en el div."
)

Es basado en indentación, similar a Python. Sin embargo, se acerca más a lenguajes como F# u OCaml.

Expresiones

Similar a otros lenguajes funcionales, en KScript todo es una expresión. Esto quiere decir que todas las estructuras se pueden usar en todos lados.

Por ejemplo, si se quiere asignar un descuento de 7.5% si el valor de la compra supera los $200, o 5 en el caso contrario, en JavaScript, se haría lo siguiente:

let descuento;
if (precio > 200) {
    descuento = 7.5;
} else {
    descuento = 5;
}

En KScript, los condicionales (y el resto de estructuras) son expresiones, por lo que se puede expresar esa misma lógica de forma segura y concisa.

const descuento =
    if precio > 200 do 7.5
    else 5

Tipos de datos algebraicos

KScript ofrece acceso a los tipos de datos algebraicos a JavaScript. Son una forma rápida, concisa y segura de definir tipos de datos.

Si quisieramos modelar los tipos de heroes de un juego, haríamos:

covar TipoHeroe =
    | Fuerza
    | Agilidad
    | Inteligencia

Y más adelante, se hace referencia a estos valores.

const heroeZeuz = {
    nombre "Zeuz"
    vida 750
    mana 500
    tipo Inteligencia
}

Contratos

KScript permite validación de tipos de datos y valores en tiempo de ejecución opcional. Esto es posible gracias a pattern matching.

Por ejemplo, la siguiente función para dividir requiere 2 parámetros, ambos de tipo number, y el último diferente de cero. Entonces, se definen esos requisitos en la función, como pre-condiciones.

fun dividir
| x: $ is number
| y: $ is number && y != 0
: $ is number && $ != NaN
=
    x / y

Si una llamada no satisface las condiciones en tiempo de ejecución, se lanza una excepción.
Se pueden usar otros tipos de datos, definir post-condiciones, incluso múltiples definiciones para manejar casos adicionales.