Simple Lisp SHell (sl-sh) is a lisp based shell written in Rust. It is not POSIX compliant and makes no effort to be. Sl-sh should run on any *nix platform as well as macOS (CI currently only tests against ubuntu and macOS).It is a Lisp-1 that is heavily inspired by Clojure and Common Lisp. It is a shell, it is a scripting language, and it is a REPL.
Some of the more prominent features:
- The contains both a shell and a lisp reader so familiar bash-isms like
"just work"
cat file | tr -s " " | cut -d " " -f 2,4
- Support for an rc file,
~/.config/slosh/init.slosh
, to set up environment and fully customize your prompt. - Common Lisp style macro system with support for quote and backquote (with clojure style ~ and ~@ expansion).
- Dynamically Typed
- Note lacks many features from legacy sl-sh but catching up (std lib is currently tiny).
Contains these crates:
- slosh: a REPL with debugger and extensions that use compiler, includes shell functionality.
- compiler: the core compiler code
- compile_state: helper crate with state contained by a VM for use with compiler
- vm: this is the bytecode VM that is target of the compiler
- builtins: set of some core builtins
- shell: contains shell specific code, this includes a shell reader (parser), job control etc
- bridge_macros: macros for exported Rust functions as slosh functions
- bridge_types: helper types for code using bridge_macros
- legacy (excluded): original sl-sh version, more complete but slower and worse core shell support
cargo run -p slosh
- Install git
git clone https://github.com/sl-sh-dev/sl-sh cd slsh
- Install Rust and build from source:
cargo build -p slosh --release ./target/release/slosh
- install binary
sudo install -D -m 755 target/release/slosh /usr/local/bin/
- add slosh to /etc/shells and change login shell to slosh
echo /usr/local/bin/slosh | sudo tee -a /etc/shells
chsh -s /usr/local/bin/slosh
These are a subset of sl-sh forms and most work exactly the same. See the sl-sh docs at: https://sl-sh-dev.github.io/sl-sh/mydoc_api.html
- True
- False
- Nil
- String Constant
- Symbol
- Keyword
- Character (chars are grapheme clusters)
- Float (56 bit float)
- Integer (56 bit signed integer)
- Byte
- Pair/ConsCell
- Vector
- HashMap
- String
The following special forms are currently in the compiler:
- def
- set!
- do
- fn
- macro
- if
- quote (')
- back-quote (` supports ~ ~@)
- and
- or
- err
- let
- call/cc
- defer
- on-error
- while
Normal forms follow normal calling evaluation. Note: These are all compiled to bytecode and once compiled are not dynamic anymore.
- not
- recur
- this-fn
- type
- +
- -
- *
- /
- inc!
- dec!
- list
- list-append
- cons
- car
- cdr
- xar!
- xdr!
- vec
- make-vec
- vec-push!
- vec-pop!
- str
- =
- /=
- <
- <=
- >
- >=
- eq?
- equal?
- Lisp reader (no reader macros yet)
- Lisp lists (pair/concell based)
- Vectors
- Tail call optimization
- Continuations (call/cc)
- Lambda/Closures (supports optional and variadic arguments)
- Garbage collection (basic but should function)
- Lisp back quotes (including nested back quotes)
- Macros
Slosh is the shell and scripting language REPL using the compiler, vm and shell crates.
These forms (written in Rust but callable from Lisp) are supported.
- pr (print)
- prn (println)
- dasm (disassemble a lambda or closure)
- load (load a lisp file and execute it)
- vec-slice (new vec that is a slice of old vec)
- vec->list (turn a vec to a list)
- get-prop (get a property from an object- either a global variable or a heap object)
- set-prop (set a property on an object- either a global variable or a heap object)
- eval (eval an expression)
- Line editor with history
- Debug on error, currently useful for probing VM state only
- sl-sh legacy shell: https://github.com/sl-sh-dev/sl-sh/legacy
- Install bencher
- To run benchmarks locally:
cargo bench
- To upload benchmarks to bencher.dev:
bencher run "cargo bench"
- Consider using iai in cloud: https://bencher.dev/learn/benchmarking/rust/iai/