You are looking at historical revision 37162 of this page. It may differ significantly from its current revision.

shen

A port of the Shen programming language for Chicken Scheme.

Shen

Shen is a hosted language that comes with a macro system, prolog, optional type system based on sequent calculus and a YACC.

Egg Author

David Ireland (djireland79 at gmail dot com)

Shen Documentation

The best source of information for Shen programming is the The Book of Shen and the Shen web site .

Egg Source Code

Chicken-Shen

Chicken Shen Usage

$ 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-wasp.*argv*

Embedded in Scheme

 (import (prefix shen shen:))

Starting the REPL from a terminal

$ chicken-shen 
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-) 

Example Shen Code

Symbols

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 [])
[1]
(15-) [1 2 | [3]]
[1 2 3]

Procedures

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

YACC

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

Prolog

Shen also has an emebedded prolog for logic programming

(defprolog member
xxX [X | _] <--;
xxX [_ | Y] <-- (member X Y);)

Type System

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 native Scheme code

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

License

BSD Clause 3

Dependencies

srfi-1 srfi-13

Versions

0.1