evanup v0.1.3
evan\up wip
Visit evanup.io to see it in action.
npm install evanup
Evan
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.
evanup.io
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'sNone
). - The individual evaluation functions determine whether recursion into sub-values of sTyped objects happen.
- This evaluation never throws but returns something sensible: either an issue object or
- 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.
Development
To get started with development, clone this repository and run npm install
or yarn
.
Usage
evan FILE OPTIONS
Options:
--semantics Print TypeScript semantics.
-v, --version Show meta-model version.
-h, --help Show this message.
License
mit