Skip to content

rkoeninger/ShenScript

Repository files navigation

Shen Version Build Status Docs Status npm

Shen for JavaScript

An implementation of the Shen Language by Mark Tarver for JavaScript. Full documentation can be viewed at shenscript.readthedocs.io.

Features

  • Allows integration with arbitrary I/O.
  • Async operations are transparent to written Shen code.
  • Easy interop: JS can be called from Shen, Shen can be called from JS.
  • Fairly small production webpack bundle (~370KB uncompressed, ~60KB gzip compressed).
  • Decent web startup time (~50ms in Chromium, ~100ms in Firefox).

Prerequisites

Requires recent version (10+) of Node.js and npm.

Works in most modern browers (Chromium, Firefox, Safari and Edge).

Building and Testing

First, run npm install as you would with any other Node project. Then run the following scripts build and test the project. Steps need to be run in order - steps after fetch-kernel won't work if the kernel hasn't been fetched.

Script Description
test-backend Runs mocha tests for the basic environment and compiler.
fetch-kernel Downloads the kernel sources from shen-sources to kernel/.
render-kernel Translates the kernel sources to JavaScript and stores under kernel/js/.
test-kernel Runs the test suite that comes with the Shen kernel.
test-frontend Runs mocha tests for helper and interop functions.
bundle-dev Applies babel transforms and webpack's into web-deployable bundle.
bundle Builds bundle in production mode.
bundle-min Builds minified production bundle.
bundles Generates all bundles.
lint If you make changes, run lint to check adherence to style and code quality.

Running

Demo Page

Run npm start to start webpack watch or npm run bundle-dev to do a one-time build.

If you open index.html in your browser a basic webpage will load, and when ready, it will display the load time. (The production webpack bundle does not automatically create a Shen environment and does not log anything.) index.html should be viewable without hosting in a web server, but you will not be able to use the load function to load additional Shen code if opened from a relative file:// path. http-server is adequate for hosting in a web server.

If you open the JavaScript console in the developer tools, it is possible to access to the $ global object and execute commands:

$.exec("(+ 1 1)").then(console.log);

Chaining the then call is necessary because exec will return a Promise. For more information refer to the documentation.

REPL

Run npm run repl to run a command-line REPL. It should have the same behavior as the shen-cl REPL. node. functions will be available. Run (node.exit) to exit the REPL.

Neither command-line options nor the launcher kernel extension are implemented. ShenScript is not intended to take the form of a standalone executable.