Shen is a portable functional programming language by Mark Tarver. It is the successor to the award-winning Qi language, with the added goal of being highly portable across platforms.
More information is available on the official website and in The Book of Shen.
(define filter
_ [] -> []
F [X | Xs] -> [X | (filter F Xs)]
where (F X)
F [_ | Xs] -> (filter F Xs))
(define element?
_ [] -> false
X [X | _] -> true
X [_ | Y] -> (element? X Y))
(define walk
_ [] <- (fail)
F [X | _] -> X where (F X)
F [_ | Y] -> (walk F Y))
(define y-combinator
F -> ((/. X (X X))
(/. X (F (/. Y ((X X) Y))))))
(let F (freeze (output "Hello!"))
(thaw F))
> "Hello!"
(tc +)
(define map
{(A --> B) --> (list A) --> (list B)}
_ [] -> []
F [X | Xs] -> [(F X) | (map F Xs)])
(map (+ 1) ["a" "b" "c"])
> type error
(datatype maybe-type
_____________________
none : (maybe A);
X : A;
_____________________
(some X) : (maybe A);
M : (maybe A);
_____________________
(unwrap M) : A;)
(defprolog member
X [X | _] <-- ;
X [_ | Y] <-- (member X Y);)
(prolog?
(member X [1 2 3])
(member X [3 4 5])
(return X))
> 3
(define bit?
B -> (element? B [0 1]))
(defcc <b>
B <b> := [B | <b>] where (bit? B);
B := [B] where (bit? B);)
(defmacro infix-macro
[X + Y] -> [+ X Y]
[X * Y] -> [* X Y])
An in-browser REPL is hosted here where you can try out Shen and take a brief tutorial.
There are implementations of Shen for most platforms. Some have fallen out of date and could use support to reach Certified status and stay current.
An implementation is considered Certified if it passes the test suite included with the kernel sources.
To port Shen to a new platform, see the porting guide. You can submit a pull request to get it added here.
The Shen Open Source Kernel is authored in Shen itself and hosted on GitHub. Bug reports and suggested enhancements are welcome!
The following is a (non-exhaustive) list of developers who have contributed to the Shen Language Open Source Community. Thanks to everyone for contributing!