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)))