jcubic / Lips
Programming Languages
Projects that are alternatives of or similar to Lips
LIPS is a powerful Scheme-based, Lisp language written in JavaScript. It is based on the Scheme dialect and the R5RS/R7RS specifications. It has extensions to make it easier to interact with JavaScript. It work both in the browser and with Node.js.
The name is a recursive acronym which stands for LIPS Is Pretty Simple.
Demo
Features
- Literal regular expression.
- Asynchronous execution.
- Possibility to add new syntax (similar to vectors and object).
- Powerful introspection.
- Great integration with JavaScript.
- Auto formatting lisp of code (pretty print)
- Lisp and hygienic Scheme macros and macroexpand.
- Builtin help system.
Installation
To install you can use npm (or yarn)
NOTE: The version that is on NPM is heavily outdated, use beta version:
npm install @jcubic/[email protected]
or yarn:
yarn add @jcubic/[email protected]
then include the file in the script tag. You can grab the version from unpkg.com
https://unpkg.com/@jcubic/[email protected]
or from jsdelivery
https://cdn.jsdelivr.net/npm/@jcubic/[email protected]/dist/lips.min.js
Bookmarklet REPL
You can also run the REPL on any page while you learn Scheme using the bookmarklet:
https://github.com/jcubic/lips/blob/master/lib/js/bookmark.js
Create any link in your bookmarks, edit it and copy paste the content of that file. Affter you click on the link it will create the REPL at the bottom of the page. (NOTE: It may not work on every page because of content security policy; e.g. google.com or gihub.com)
If you have trouble with creating the bookmarklet you can open LISP Scheme home page where you can find a link that you can drag to your bookmarks.
Usage
The simplest way is to include the lips code in the script tag:
<script type="text/x-scheme" bootstrap>
(let ((what "world")
(greet "hello"))
(display (string-append "hello" " " what)))
</script>
or use the src
attribute:
<script type="text/x-scheme" bootstrap src="example.scm"></script>
Bootstrapping Scheme system
Big part of LIPS is written in LIPS itself, but to use full power of LIPS you need
to load those additional Scheme files. The easiest way is to add bootstrap
attribute
on first script tag with text/x-scheme
type. By default it will use CDN from
jsdelivr. To load each file using builtin load function
(that will fetch the file using AJAX and evaluate it).
<script src="https://cdn.jsdelivr.net/npm/@jcubic/[email protected]/dist/lips.min.js" bootstrap></script>
Running LIPS programmatically
var {exec} = require('@jcubic/lips'); // node
// or
var {exec} = lips; // browser
exec(string).then(function(results) {
results.forEach(function(result) {
console.log(result.toString());
});
});
When running exec you will also need to bootstrap the language and loaded files from /lib/
directory.
Documentation about beta version can be found in Wiki.
Standalone executable
NOTE: Executable don't require bootstrapping lib files.
If you install lips globally with:
npm install -g @jcubic/[email protected]
you can run the interpreter from the terminal:
You can also run code in a string with:
lips -c '(let ((what "World")) (display (string-append "Hello " what)))'
and you can run a file using:
cat > foo.scm <<EOF
(let ((what "World"))
(display (string-append "Hello " what))
(newline))
EOF
lips foo.scm
You can also write executable files that use lips using shebang (SRFI-22)
cat foo.scm
#!/usr/bin/env lips
(let ((what "World"))
(display (string-append "Hello " what))
(newline))
chmod a+x foo.scm
./foo.scm
Executables also return a S-Expression according to SRFI-176 use lips --version
or lips -V
.
Links
Roadmap
1.0
- [x] Full support for R5RS
- [ ] Full support for R7RS
- [ ] Continuations.
- [ ] Tail Call Optimization (TCO).
- [ ] Fully tested Numerical Tower.
- [ ] R7RS libraries (
import
/export
/define-library
). - [ ] All recursive function in JS don't consume stack.
- [ ] Finish
syntax-rules
(ignore limitations of current approach).- [ ] Objects.
- [ ] Vectors.
1.1
- [ ] Proper expansion time for both macro system.
- [ ] Fully working and tested R7RS hygienic Macros (
syntax-rules
).
Acknowledgments
- Font used in logo is Telegrafico by ficod.
- Current parser is inspired by implementation in BiwaScheme by Yutaka HARA (yhara).
-
fetch
polyfill use unfetch by Jason Miller. - Browser
init
function use ContentLoaded. - The rationalize algorithm is based on Kawa Scheme by Per M.A. Bothner, Alan Bawden and Marc Feeley.
-
ucs2decode
function taken from punycode.js by Mathias Bynens. - Rosetta Code is used for:
- StackOverlow code was used for functions:
- Code formatter is roughly based on scheme-style and GNU Emacs scheme mode.
License
Released under MIT license
Copyright (c) 2018-2021 Jakub T. Jankiewicz