Files
leporello-js/README.md
Dmitry Vasilev fad075ad37 initial
2022-09-10 02:48:13 +08:00

4.0 KiB

Leporello.js

Leporello.js is live coding IDE for pure functional subset of javascript. It provides novel debugging experience

Try online

Features

  • Mutating values is not allowed Mutating

  • All values are immutable. You create new values by applying change to old values Immutable

  • Functional programs are trees of expressions that map values to other values, rather than a sequence of imperative statements which update the running state of the program. Because data is never mutated, you can jump to any point in execution of your program Navigation

  • and inspect any intermediate values Inspect

  • Expressions that were evaluated have blue background. And that were not reached have white background. Background

  • Expressions that throw errors are red Errors

  • When you put cursor inside function, the first call of this function is found Follow cursor

  • You can edit this function and immediately see result Live coding

  • Leporello is (mostly) self-hosted, i.e. built in itself Self-hosted

Supported javascript subset

Variables are declared by const declaration. var is not supported. let variables can be declared to be assigned later, for cases when value depends on condition. Example:

let result
if (n == 0 || n == 1) {
  result = n
} else {
  result = fib(n - 1) + fib(n - 2)
}

Currenlty only one declaration for single const statement is supported (TODO).

Any kind of loops are not supported. Use recursion or array functions instead.

if / else can only contain blocks, not single statements (TODO).

Functions can be declared only by arrow function syntax. function keyword and method definitions (like const foo = { bar() { /* body */ } } may be supported in future. Both concise and block body are supported.

Classes are not supported. Some sort of immutable classes may be supported in future. this keyword is not currently supported. new operator is supported for instantiating builtin classes.

switch statements will be supported in future.

try, catch and finally will be supported in future. throw is currently supported.

ES6 modules are suppoted. Default exports are not currently supported, only named exports. Circular module dependencies are not supported (currently they crash IDE (TODO)). Import/export aliases are not supported. Exporting let variables is not supported. import.meta is not supported.

Generators are not supported.

Async/await will be supported in future.

Destructuring is mostly supported.

Some operators are not currently supported:

  • Unary negation, unary plus
  • Bitwise operators
  • in, instanceof
  • void
  • comma operator

Operators that are not supported by design (not pure functional):

  • increment, decrement
  • delete

Hotkeys

See built-in Help

Editing local files

Editing local files is possible via File System Access API. Click "Allow access to local project folder" to grant access to local directory.

Run Leporello locally

To run it locally, you need to clone repo to local folder and serve it via HTTPS protocol (HTTPS is required by File System Access API). See How to use HTTPS for local development

Running test suite

run tests in node.js:

node test/run.js

run tests in leporello itself: Tests

  • grant local folder access
  • select test/run.js as entrypoint

Roadmap

  • Support async/await and calling impure (performing IO) functions
  • Use production level JS parser, probably typescript parser (so it will be possible to program in pure functional subset of typescript)
  • Implement VSCode plugin