Qriollo
El lenguaje más boludo del mundo

¿Qué es Qriollo?

Qriollo es un lenguaje de programación funcional, impuro, estricto, rioplatense y en joda.

El compilador de Qriollo está desarrollado en Haskell, tiene múltiples backends, y puede generar código C, código Python, y bytecode para la JVM. La implementación se encuentra en fase inestable/experimental y cuenta con una interfaz de funciones gringas.

Qriollo es un lenguaje estáticamente tipado, con inferencia de tipos, polimorfismo paramétrico y clases de tipos. Incorpora un sistema de módulos simple. Tiene las funcionalidades usuales de un lenguaje de programación de la familia de ML: tipos de datos algebraicos, análisis de casos por comparación de patrones, clausuras léxicas, optimización de invocaciones a la cola, referencias mutables y call/cc. El backend para C cuenta con un algoritmo de recolección de basura exacto y stop-and-copy.

HolaMundo.q
enchufar Chamuyo

el programa es
   escupir "Hola mundo\n"

Ejemplos

Elementos pares de una lista (para ejecutar interactivamente)

filtrar (la que dado x da x % 2# == 0#) [1#, 2#, 3#, 4#]

Calcular números primos (para compilar)

Primos.q
enchufar Chamuyo

el esPrimo
  dado p
    da nadie (esDivisor p) (2..p - 1)

el esDivisor
  dados p d
     da p % d == 0#

los primos
  dado n
    da filtrar esPrimo (2..n)

el programa es
   escupir . mostrar . primos $ 1000#
$ qr Primos.q --c -o Primos.c
$ gcc -o Primos Primos.c -Wall
$ ./Primos
    [2#, 3#, 5#, 7#, 11#, 13#, 17#, 19#, 23#, 29#, 31#, ...

Altura de un árbol binario

AB.q
enchufar Chamuyo

un Árbol de a es
   bien Hoja a
   bien Nodo a (Árbol de a) (Árbol de a)

el máximo
   dados n m
      si n > m da n
      si no    da m

la altura de Árbol de a en Numerito
  dado (Hoja _)     da 1
  dado (Nodo _ a b) da 1 + máximo (altura a)
                                  (altura b)

el programa es escupir . mostrar . altura $
   Nodo 'a'
        (Nodo 'b'
              (Hoja 'c')
              (Hoja 'd'))
        (Nodo 'e'
              (Hoja 'f')
              (Hoja 'g'))
$ qr AB.q
3#

Clases de tipos

ClasesDeTipos.q
enchufar Chamuyo

cualidad Escalable para coso
  el escalar de Numerito en coso en coso
boludo

encarnar Escalable para Numerito
  el escalar dados n m da n * m
boludo

encarnar Escalable para [coso] con Escalable para coso
  el escalar es fap . escalar
boludo

el programa es escupir . mostrar $
   escalar 2 [[1#, 2#, 3#],
              [4#, 5#, 6#],
              [7#, 8#, 9#]]
$ qr ClasesDeTipos.q
[[2#, 4#, 6#], [8#, 10#, 12#], [14#, 16#, 18#]]