Native, fast starting Clojure interpreter for scripting
Find a file
Michiel Borkent 7e67d35586 gateway drug
2019-08-09 19:48:40 +02:00
.circleci initial commit 2019-08-09 15:43:27 +02:00
.clj-kondo initial commit 2019-08-09 15:43:27 +02:00
doc initial commit 2019-08-09 15:43:27 +02:00
resources bump version 2019-08-09 18:34:12 +02:00
script initial commit 2019-08-09 15:43:27 +02:00
src shorter notation for functions and regexes 2019-08-09 18:17:28 +02:00
test/babashka initial commit 2019-08-09 15:43:27 +02:00
.gitignore initial commit 2019-08-09 15:43:27 +02:00
LICENSE initial commit 2019-08-09 15:43:27 +02:00
project.clj initial commit 2019-08-09 15:43:27 +02:00
README.md gateway drug 2019-08-09 19:48:40 +02:00
reflection.json initial commit 2019-08-09 15:43:27 +02:00

babashka

CircleCI Clojars Project cljdoc badge

A pure, fast and (severely!) limited version of Clojure in Clojure for shell scripting.

Properties:

  • pure (no side effects)
  • fast startup time
  • interprets only one form
  • reads from stdin and writes to stdout

Rationale

Most of your script is in bash, but you want a tiny sprinkle of Clojure.

If most of your shell script evolves into Clojure, you might want to turn to:

Status

Experimental. Not all Clojure core functions are supported yet, but can be easily added. PRs welcome.

Installation

Linux and macOS binaries are provided via brew.

Install:

brew install borkdude/brew/babashka

Upgrade:

brew upgrade babashka

You may also download a binary from Github.

Usage

The first argument to bb is the form to be executed. There is one special variable, *in* which is EDN that is piped from stdin.

If the first argument is --version, then bb will print the version and exit. If the first argument is --raw, then bb will interpret stdin as string input.

Examples:

$ ls | bb --raw '*in*'
["LICENSE" "README.md" "bb" "doc" "pom.xml" "project.clj" "reflection.json" "resources" "script" "src" "target" "test"]

$ ls | bb --raw '(count *in*)'
11

$ echo '[1 1 1 1 2]' | bb '(vec (dedupe *in*))'
[1 2]

$ echo '[{:foo 1} {:bar 2}]' | bb '(filter :foo *in*)'
({:foo 1})

Functions are written using the reader tag #f. Currently up to three arguments are supported.

$ echo '3' | bb '(#f (+ %1 %2 %3) 1 2 *in*)'
6

Regexes are written using the reader tag #r.

$ ls | bb --raw '(filterv #f (re-find #r "reflection" %) *in*)'
["reflection.json"]

Test

Test the JVM version:

script/test

Test the native version:

BABASHKA_TEST_ENV=native script/test

Build

You will need leiningen and GraalVM.

script/compile

License

Copyright © 2019 Michiel Borkent

Distributed under the EPL License, same as Clojure. See LICENSE.