A port of the Shen programming language for Chicken Scheme.
Shen is a hosted language that comes with a macro system, optional type system based on sequent calculus, pattern matching, λ calculus consistency, optional lazy evaluation, an integrated Prolog and compiler-compiler.
This egg comes with a standalone binary chicken-shen that provides a REPL and a library to use Shen inside Scheme.
David Ireland (djireland79 at gmail dot com)
The best source of information for Shen programming is The Book of Shen, Logic, Proof and Computation and the Shen web site .
Egg Source Code
Chicken Shen Usage
Usage for the standalone binary for running a REPL or loading a file or string is here:
$ chicken-shen -h
Usage: shen [options] [...args...] -h, --help : Prints help and exits -l, --load <file> : Loads Shen <file> -e, --eval <string> : Evaluates <string> -r, --repl : Run the REPL, even if -l or -e are provided Any additional arguments are passed to the Shen system in the variable shen-chicken.*argv*
Starting the REPL from a terminal
$ chicken-shen -r
Shen, copyright (C) 2010-2015 Mark Tarver www.shenlanguage.org, Shen 21.1 running under Scheme, implementation: Chicken port 0.1 ported by David Ireland (0-)
Calling Shen from Scheme
Runs the REPL inside Chicken Scheme
- read-file FILEprocedure
Reads and loads a Shen file
- read-from-string STRINGprocedure
Reads and loads a string containing Shen code.
(import (prefix shen shen:)) ;;; Load file example (shen:read-file "foo.shen") ;;; Evaluate string (shen:read-from-string "(define foo 0 -> 1 1 -> 0)") (shen:read-from-string "(foo 0)") ;;; Should return 1
Example Shen Code
Unlike Chicken Scheme symbols are implicitly quoted thus no ' is needed.
(0-) HI HI
Basic List processing
Lists in Shen are enclosed with [ ] for example:
(12-) [1 2 3] (13-) (head [1 2 3]) 1 (14-) (cons 1 )  (15-) [1 2 | ] [1 2 3]
Procedures are defined using a pattern matching. For example:
(define factorial 0 -> 1 X -> (* X (factorial (- X 1))))
(define total  -> 0 [X | Y] -> (+ X (total Y)))
(define triples  ->  [W X Y | Z] -> [[W X Y] | (triples Z)])
Shen has an internal YACC (yet another compiler compiler)
(defcc <binary?> X <binary?> := true where (element? X [0 1]); X := true where (element? X [0 1]); <e> := false;)
Shen also has an embedded Prolog for logic programming
(defprolog member xxX [X | _] <--; xxX [_ | Y] <-- (member X Y);)
The type system is optional and disabled by default. It can be enabled using:
(0-) (tc +) true (1+) 5 5 : number (2+) "ABC" "ABC" : string (3+) (+ 1 1) 2 : number
and off with:
(4+) (tc -) false : boolean (5-) 5 5 (6-) "ABC" "ABC" (7-) (+ 1 1) 2
Calling Scheme from Shen
Calling native Chicken procedures is done by prefixing 'lisp' to the procedure name. An example of calling Chicken's print is given below.
Shen, copyright (C) 2010-2015 Mark Tarver www.shenlanguage.org, Shen 21.1 running under Scheme, implementation: Chicken port 0.1 ported by David Ireland (0-) (lisp.print "Hello World") Hello World #<unspecified> (1-)
About this egg
BSD Clause 3