Under construction!

Nova Implementations

Categorization

Some Nova implementations run Nova rules directly. These are called interpreters, and they run on a single language.

Other Nova implementations generate Nova code to be run by another program. These are called compilers. They run on a single language, but some can create Nova programs in different languages.

Myte

The current main Javascript (aka Web Browser) Nova implementation.

Syntax
January
Type
Compiler
Runs on
Nodejs, Web browsers, ES5+ JS Runtimes
Output targets
Nodejs, Web browsers, ES5+ JS Runtimes
Notable uses
Nova Playground, Archipelago

Pyra

Lua powered implementation uses more modes in the syntax to require less configurable delimiters.

Syntax
Bespoke
Type
Compiler
Runs on
Lua
Output targets
Lua, Love2D, Ruby, Javascript, Graphviz
Notable uses
eevie.dev, axowotw

Serpens

The OG Nova prototype, rough around the edges

Syntax
January
Type
Interpreter
Runs on
Python

Nova syntaxes

January

The syntax used in the Introduction to Nova is called January, shortned to jan casually. As of right now, it's more of a set of guidelines than a formalized thing, but the Nova core devs are working to change that.

For a brief description: It's a two-level configurable delimiter syntax. The first non-whitespace character in a file is the rule-side delimiter.

After each rule-side delimiter, the next non-whitespace character is a stack-label delimiter.

$ is used to make a symbol as a variable. If the same variable name is used twice in a cause, Nova makes sure that both symbols are the same value.

| :cause stack name: symbol $variable | 
  :effect stack name: seen $variable
January Shorthands

We'll start with an example with some repetition written out:

| :do: one thing :do: second thing |
  :done: one :done: second

., if it's the first symbol after a stack label, allows you to write multiple facts without repeating the whole label. Using that, we can shorten things like so:

| :do: . one thing . second thing |
  :done: . one . second

If a fact begins with the symbol ( and ends with the symbol ), then each symbol between the parens is treated as a single-symbol fact. This allows us to rewrite things like so:

| :do: . one thing . second thing |
  :done: ( one second )