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.
(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])
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.
Platform | URL |
---|---|
Active Ports | |
Common Lisp | Common Lisp (by Mark Tarver) |
Scheme | tizoc/shen-scheme |
Inactive Ports | |
Common Lisp | Shen-Language/shen-cl |
C | otabat/shen-c |
CLR | rkoeninger/ShenSharp |
Emacs Lisp | deech/shen-elisp |
Erlang | sborrazas/shen-erl |
Go | tiancaiamao/shen-go |
Haskell | mthom/shentong |
Java | otabat/shen-jvm |
Ruby | gregspurrier/shen-ruby |
Truffle | ragnard/shen-truffle |
Wasp Lisp | doublec/shen-wasp |
JavaScript | rkoeninger/ShenScript |
JavaScript | gravicappa/shen-js |
C++ | wehu/ShenCPP |
Clojure | hraberg/shen.clj |
Java | hraberg/Shen.java |
Python | gravicappa/shen-py |
Python | yminer/pyshen |
The Shen Open Source Kernel is authored in Shen itself and hosted on GitHub. Bug reports and suggested enhancements are welcome!