Volver al inicio

Lenguaje Shik para tuberías REPL

Shik — lenguaje minimalista para REPL y automatización de tareas en la terminal. Sintaxis basada en Lisp/Haskell con tuberías y currying simplifica el procesamiento de archivos y datos. Comparación con bash, Python, Fish.

Shik: por qué un nuevo lenguaje para scripting en terminal
Advertisement 728x90

Shik: Lenguaje minimalista para tuberías en terminal y REPL

Tareas como buscar cadenas en archivos o contar líneas en un proyecto suelen requerir encadenar utilidades con APIs inconsistentes. Bash te obliga a lidiar con [ -f ] vs [[ -f ]], grep -q vs grep -l, y comillas para espacios en nombres de archivos. Python dispersa las operaciones de archivos entre os, shutil y pathlib. Shells como Nushell se centran en datos estructurados, pero fallan en guiones concisos.

Shik es un lenguaje inspirado en Lisp/Haskell, diseñado para REPL y automatización. Su sintaxis gira en torno a la aplicación de funciones mediante espacios, tuberías con $>, y composición con #>.

Ejemplos: De Bash a Shik

Buscar archivos con "- links" y moverlos a topics/:

Google AdInline article slot

Bash: 5 líneas llenas de trampas con banderas de grep y dolores de cabeza con comillas.

Shik:```

file.glob :./* $>

Google AdInline article slot

list.filter file.is-file $>

list.filter (fn [f] file.read f $> string.has "- links") $>

list.iterate (file.move :topics)

Google AdInline article slot
Cuatro pasos de tubería, sin importaciones, sin comandos externos.

Contar líneas en archivos `.rs`:

file.glob :./src/*/.rs $>

list.map (file.read #> string.lines #> list.len) $>

list.sum $>

print

Las tuberías fluyen de izquierda a derecha, el currying simplifica la aplicación parcial.

## Diseño central: Lisp se encuentra con Haskell

Todo es una función. `+ 1 2`, `list.map`, `file.glob` — todos se invocan de la misma manera. Los espacios aplican funciones; no se necesitan paréntesis para argumentos simples.

Cuatro operadores clave:

1. Espacio: `f x`
2. `#>`: composición `f #> g` → `fn [x] g (f x)`
3. `$`: aplicación de baja precedencia `print $ + 1 2`
4. `$>`: tubería `x $> f`

Currying automático: `(+ 1)` se convierte en la función "sumar 1". Orden de argumentos: el primer argumento es el modificador fijo.

let lst [1 2 3 4]

lst $> list.map (+ 1) ; [2 3 4 5]

lst $> list.map (* 2) ; [2 4 6 8]

Aritmética uniforme, sin necesidad de `flip`.

## Hoja de trucos de sintaxis: 5 minutos para dominarlo

**Literales:**```
42                    ; número
"hello"             ; cadena
:hello               ; símbolo (sin espacios)
[1 2 3]              ; lista
{:name :Alice}       ; objeto
fn [arg] body        ; función

Variables:```

let name :Alice

let greet fn [name] "¡Hola, {name}!"

print $ greet name

set x (+ x 5) ; mutación


Interpolación de cadenas con `{expr}`. Los puntos forman parte de los nombres: `string.+`, `file.read`.

**Funciones integradas:** `file.`, `list.`, `string.`, `shell.` listas para usar. `help list.map` muestra la documentación en el REPL.

## Ergonomía en terminal

No hay declaraciones vs expresiones — todo es una expresión. Solo datos y funciones globales, sin clases/métodos. Prueba en REPL puro, sin flechas necesarias.

La tubería `$>` elimina la anidación:

**Sin tubería:** `print (list.sum (list.map ...))` — un lío.

**Con tubería:** los datos fluyen de izquierda a derecha, legibilidad lineal.

Ejemplos de currying con `let`:

let add-one (+ 1)

let files-with-links (fn [dir] file.glob dir $> list.filter (file.read #> string.has "- links"))


## Características clave

- Aplicación de funciones unificada minimiza el aprendizaje de sintaxis.
- Tubería `$>` y currying para cadenas de datos sin anidación.
- Integradas `file.`, `list.`, `string.` — sin importaciones.
- REPL primero: `help`, símbolos `:`, interpolación `{}`.
- Orden de argumentos: el primero es modificador para parciales fáciles.

— Editorial Team

Advertisement 728x90

Leer después