a vaguely lispy language in the context of javascript
Last updated 4 years ago by ogu .
MIT · Repository · Bugs · Original npm · Tarball · package.json
$ cnpm install evanup 
SYNC missed versions from official npm registry.

evan\up [wip]


Visit evanup.io to see it in action.

npm install evanup

build status NPM version



Evan's language constructs (aka semantics types, or sTypes for short) are structurally described in description.json file.

As an example, a binary operation definition looks like this:

"binary operation": {
  "properties": {
    "operator": { "type": "string" },
    "left": { "type": "any" },
    "right": { "type": "any" }

and here is an excerpt from an Evan program that uses this definition:

"body": {
  "$sType": "if-then-else",
  "condition": {
    "$sType": "binary operation",
    "operator": "<",
    "left": {
      "$sType": "value reference",
      "name": "n"
    "right": 2

For Evan, JSON is chosen as the concrete syntax- because it is a very well-known and supported format, and it's true.

But, of course, writing a program in JSON is tedious, uncomfortable and unproductive: after all, we'd be writing ASTs in a verbose form.


Enter evanup.io!, evanup is a peer to peer, decentralized webrtc client / projectional editor for building evan programs with friends in real-time.

It's built on top of many amazing technologies, which one of them happens to be Evan evaluator itself.

Execution == Evaluation

Evan "works" by providing the evaluator with any JSON input, and optionally an object table (external-objects).

The evaluator then tree-transforms this JSON according to the following rules:

  • Objects which have a string-valued property $sType are processed by their respective evaluation function.
    • This evaluation never throws but returns something sensible: either an issue object or undefined (which corresponds loosely to e.g. Scala's None).
    • The individual evaluation functions determine whether recursion into sub-values of sTyped objects happen.
  • All other values (so also objects which are not "sTyped") are returned as-is.

On type checking

  • Evaluation does (some) type checking - which obviously happens at runtime.
  • A separate type checker (once it exists) mimics the evaluator but computes and checks typing statically: this should help the developer beyond what's reasonable in terms of unit tests.
  • Evan is not statically typed, but could at some point become optionally-typed.

external Objects

External Objects is Evan's way of interfacing with things outside any Evan program on its own. It's nothing more than a map/dictionary of names to objects, which expose functions. Using the semantics type object-function invocation, you can interact with functions on these objects.


To get started with development, clone this repository and run npm install or yarn.





  --semantics    Print TypeScript semantics.
  -v, --version  Show meta-model version.
  -h, --help     Show this message.



Current Tags

  • 0.1.3                                ...           latest (4 years ago)

4 Versions

  • 0.1.3                                ...           4 years ago
  • 0.1.2                                ...           4 years ago
  • 0.1.1                                ...           4 years ago
  • 0.1.0                                ...           4 years ago
Maintainers (1)
Today 0
This Week 0
This Month 0
Last Day 0
Last Week 0
Last Month 1
Dependencies (4)
Dev Dependencies (60)
Dependents (0)

Copyright 2014 - 2017 © taobao.org |