- Kip es un lenguaje de programación experimental que integra los casos gramaticales y el modo (mood) del turco en su sistema de tipos, explorando la combinación de la morfología del lenguaje natural con la teoría de tipos
- Refleja en la estructura del código la declinación de los sustantivos y la armonía vocálica del turco, distinguiendo las relaciones entre argumentos de funciones mediante sufijos de caso y permitiendo flexibilidad en el orden de los argumentos
- Expresa funciones clave de los lenguajes funcionales modernos, como pattern matching, tipos polimórficos, tipos de datos inductivos y efectos de entrada/salida, en formas gramaticales del turco
- Se compila con el analizador morfológico Foma y Haskell Stack, y ofrece un entorno de ejecución en navegador basado en WASM junto con una función de caché de bytecode (.iz)
- Es un proyecto de investigación y educativo que muestra la intersección entre la lingüística y el diseño de lenguajes de programación, como un experimento sobre la viabilidad de diseñar lenguajes basados en lenguaje natural
Resumen de Kip
- Kip toma su nombre de la palabra turca “kip” (modo) y es un lenguaje experimental que incorpora los casos gramaticales del turco en el sistema de tipos
- Integra en el diseño del lenguaje de programación la declinación de los sustantivos (ismin halleri) y la armonía vocálica (vowel harmony) del turco
- Es un proyecto con fines de investigación y enseñanza, no un lenguaje para despliegue real
- Ofrece tutoriales en turco e inglés para aprender a escribir programas en Kip
- La gramática y el comportamiento están en una etapa experimental, por lo que pueden cambiar en el futuro
Características del lenguaje
- Uso de los casos gramaticales del turco como tipos
- Soporta 8 casos: nominativo, acusativo, dativo, locativo, ablativo, genitivo, instrumental y posesivo
- Cada caso se marca con un sufijo, diferenciando explícitamente las relaciones entre argumentos de funciones
- Orden flexible de argumentos
- Como los sufijos de caso dejan claras las relaciones entre argumentos, cambiar el orden no altera el significado
- Ej.:
(5'le 3'ün farkını) yaz. y (3'ün 5'le farkını) yaz. producen el mismo resultado
- Definición de tipos de datos inductivos
- Soporte para tipos polimórficos
- Permite definir estructuras de datos genéricas
- Ej.: definición de tipo lista en la forma
(öğe listesi)
- Pattern matching
- Realiza pattern matching usando el sufijo condicional
-sa/-se
- Soporta patrones anidados, binders y comodines (
değilse)
- Definición de constantes
- Declara constantes con nombre mediante la palabra clave
diyelim
- Ej.:
sıfırın ardılına bir diyelim.
- Entrada/salida y manejo de efectos
- Tipos básicos
- Enteros (
tam-sayı): soporta operaciones como toplamı, farkı, çarpımı
- Cadenas (
dizge): ofrece uzunluğu, birleşimi, tam-sayı-hali
- Entrada/salida: soporta los comandos
yazmak, okumak
- Comentarios y literales
- Comentarios:
(* ... *)
- Literales: forma como
"merhaba"'yı yaz. con sufijos de caso incluidos
Instalación y ejecución
- Herramientas requeridas
- Foma: toolkit de análisis morfológico de estado finito
- Stack: herramienta de compilación de Haskell
- Método de compilación
- Ejecutar el script
install.sh o compilar manualmente con el comando stack build
- Incluye el transductor TRmorph en
vendor/trmorph.fst
- Ejecución
- REPL:
stack exec kip
- Ejecutar archivo:
stack exec kip -- --exec path/to/file.kip
- Instalación en PATH:
stack install
Playground WASM
- El directorio
playground/ incluye una compilación para ejecución en navegador
- Compila
kip-playground para wasm32-wasi
- Permite ejecutar Kip en el navegador con un harness en HTML/JS
- Para el procedimiento detallado de compilación, consultar
playground/README.md
Caché de bytecode (.iz)
- Guarda en archivos
.iz los resultados del type checking de cada archivo .kip
- Si no cambian el código fuente ni las dependencias, reutiliza la caché
- Si se elimina un archivo
.iz, vuelve a hacer parsing y type checking
- Incluye un hash del compilador, por lo que se invalida automáticamente al cambiar de versión
Programas de ejemplo
- Incluye ejemplos de definición de números naturales, declaración de constantes, función de suma y salida del resultado
Bir doğal-sayı
ya sıfır
ya da bir doğal-sayının ardılı
olabilir.
sıfırın ardılına bir diyelim.
birin ardılına iki diyelim.
ikinin ardılına üç diyelim.
(bu doğal-sayıyla) (şu doğal-sayının) toplamı,
bu sıfırsa,
şu,
öncülün ardılıysa,
(öncülle) (şunun ardılının) toplamıdır.
(ikiyle üçün toplamını) yaz.
Estructura del proyecto
- app/ : punto de entrada del CLI (
Main.hs)
- src/Kip/ : incluye AST, caché, intérprete, parser, renderer y type checker
- lib/ : módulos base (
giriş.kip, temel.kip, temel-liste.kip, etc.)
- tests/ : casos de prueba de éxito (
succeed/) y fallo (fail/)
- vendor/ : transductor morfológico
trmorph.fst
Pruebas
- Se ejecutan con el comando
stack test
tests/succeed/: pruebas que deben pasar
tests/fail/: pruebas que deben fallar
Análisis morfológico
- Kip usa TRmorph para realizar análisis morfológico del turco
- Al parsear, conserva todas las interpretaciones posibles de palabras ambiguas (ej.: “takası”)
- El significado se determina en la etapa de type checking
- Para forzar una interpretación específica, se usa apóstrofo (
') (taka'sı, takas'ı)
Licencia
- Consultar el archivo LICENSE
1 comentarios
Comentarios en Hacker News
Hola a todos, soy el desarrollador de Kip
Originalmente quería hacerlo público después de terminar el playground y la landing page, pero por ahora comparto el playground basado en navegador que he construido hasta ahora
https://alpaylan.github.io/kip/
La transpilación a JavaScript apenas está comenzando y todavía no funciona, pero el lenguaje en sí ya se puede ejecutar en su mayor parte
Si encuentran errores, agradecería que los reportaran en los issues del repo
Quería llamarlo “Ç”, pero al final no lo hice. Me alegra ver que alguien sí lo intentó
Personalmente, creo que “tense” es lo más cercano
Como referencia relacionada, vi la explicación de BBC Bitesize
Por ejemplo En frases así, me pregunto si el significado de ‘farkını’ (diferencia) y la posición de las partículas distinguen entre 5-3 y 3-5
Como la sintaxis está basada en lenguaje natural, se siente como un lenguaje para describir definiciones matemáticas
https://kip-dili.github.io/
La estructura del lenguaje todavía parece seguir un orden gramatical anglosajón
Me gustaría ver algo como esto, más alineado con la gramática turca
Felicidades; este intento por sí mismo ya es un excelente punto de partida
Este proyecto está realmente increíble
Yo también estoy experimentando una idea parecida en Logicaffeine Studio
También valdría la pena revisar Logos lang. Me gusta además que hayas elegido Haskell
Los de generaciones anteriores quizá recuerden Lingua::Romana::Perligata
https://metacpan.org/dist/Lingua-Romana-Perligata/view/lib/Lingua/Romana/Perligata.pm
Yo también experimenté con una idea similar hace unos años
https://github.com/celaleddin/sembolik-fikir
Planeo revisarlo más a fondo en los próximos días
En Kip se usa TRmorph para realizar por completo el análisis morfológico, y la ambigüedad se resuelve en la etapa de verificación de tipos
Por eso casi no hacen falta apóstrofos. Fue difícil de implementar, pero fue un problema divertido
Puedo leer un poco de turco, y gracias a este proyecto mi día mejoró
Me parece interesante que el sistema de casos del turco sea tan fuerte y estandarizado que haga posible diseñar un lenguaje así
Por ejemplo, una oración como “Colonel Mustard killed him in the study at 5:00 with his own knife.” mantiene su significado aunque cambie el orden
En la poesía latina o rusa también aparecen a menudo estos órdenes sintácticos complejos
Al principio hice clic en el enlace con cierto prejuicio, pero la definición es limpia y fácil de entender
Sería divertido ver también una versión en alemán
Más que por el lenguaje en sí, comparto esta entrada de Language Log como referencia relacionada con la gramática
Mi novia es turca y estaba aprendiendo turco; ahora siento que podría acelerar el aprendizaje con una intuición de programación
De verdad me sorprende
Es una muy buena motivación para retomar un aprendizaje que se había quedado estancado en nivel intermedio
En la era de la IA, cada país puede crear lenguajes de programación que reflejen su propia tradición lingüística
Eso amplía enormemente la autonomía y diversidad de la cultura de desarrollo