Lenguaje de programación Shen

eisenfaust

Siento no poder tener tiempo para currarme una descripción decente, pero bueno, básicamente se trata de la nueva versión de Qi, en mi opinión lo más importante que le ha pasado a la comunidad Lisper desde CLOS y Clojure. Posiblemente el lenguaje más avanzado que existe actualmente, con macros, engine lógico integrado, tipación skinnable muy superior a la de Haskell... etc etc etc. Compila a Common Lisp de forma muy eficiente y está previsto (si no lo hace ya) que compile a Javascript, Python y Clojure.

En la web http://shenlanguage.org/ y tenéis la opción de descargar para win, unix, etc. Ya no hace falta rellenar ningún formulario.

También está disponible el libro "Functional Programming in Qi" ya adaptado para Shen. El cual es una muy buena introducción a la programación funcional.

Un ejemplo de código, sacado de http://jng.imagine27.com/articles/2011-06-28-141124_purely_functional_types_red_black_trees_in_qi.html

(tc +)

(datatype tree-node
    Key : number; Val : B;
    ======================
    [Key Val] : tree-node;)

(datatype color
    if (element? Color [red black])
    _______________________________
    Color : color;)

(datatype tree
    if (empty? Tree)
    ________________
    Tree : tree;

Color : color; LTree : tree; TreeNode : tree-node; RTree : tree;
================================================================
[Color LTree TreeNode RTree] : tree;)

(define node-key
    {tree-node --> number}
    [Key Val] -> Key)

(define make-tree-black
    {tree --> tree}
    [Color A X B] -> [black A X B])

(define member
    {tree-node --> tree --> boolean}
    X NIL -> false
    X [Color A Y B] -> (if (< (node-key X) (node-key Y))
         (member X A)
         (if (< (node-key Y) (node-key X))
             (member X B)
             true)))

(define balance
    {tree --> tree}
    [black [red [red A X B] Y C] Z D] -> [red [black A X B] Y [black C Z D]]
    [black [red A X [red B Y C]] Z D] -> [red [black A X B] Y [black C Z D]]
    [black A X [red [red B Y C] Z D]] -> [red [black A X B] Y [black C Z D]]
    [black A X [red B Y [red C Z D]]] -> [red [black A X B] Y [black C Z D]]
    S -> S)

(define insert-
    {tree-node --> tree --> tree}
    X [] -> [red [] X []]
    X [Color A Y B] -> (if (< (node-key X) (node-key Y))
                           (balance [Color (insert- X A) Y B])
                           (if (< (node-key Y) (node-key X))
                               (balance [Color A Y (insert- X B)])
                               [Color A Y B])))

(define insert
  {tree-node --> tree --> tree}
  X S -> (make-tree-black (insert- X S)))

Usuarios habituales

  • eisenfaust