Syntax

For performance reasons, Ralph is using JavaScript arrays as its core data structure,
instead of implementing its own list data structure based on objects. Arrays can be
created using the [] syntax (e.g. (first [1 2 3])).

The syntax for numbers and strings is that of JavaScript.

Symbols may contain any character which is not otherwise syntactically significant
(e.g., introduces a number, an array, etc). The character sequence :: in symbols
is treated as the separator for fully-qualified symbols: The first part is
the module name, the second is the symbol name.

Keywords have the same syntax as symbols and end with a colon (e.g., foo:).

The syntax for the canonical true value is #t, for the canonical false value #f.

In parameter lists, #rest is used to introduce the name of the variable containing
the additional arguments, and #key is used to introduce keyword parameters.

A single quote is used for quoting. A backquote is used for syntax-quoting (see macros).

A semicolon indicates the start of a comment.

Interoperability

The special operator %native allows writing inline JavaScript. All strings that are
passed to it are directly emitted as-is. Numbers are first converted to strings, and
symbols are properly renamed. Other forms are not supported.

For example, the following Ralph code

(bind ((delta 3))
(%native "x += " delta " * " 2))

would compile to the following JavaScript code:

var delta__1 = 3;
x += delta__1 * 2;

Ralph's compiler knows nothing about the global x and there is no need to
declare it exists.

The utility macro . can be used for easily writing JavaScript method calls.
For example,

(. (%native "console")
(log "Hello, %s" "World"))

would compile to:

console.log("Hello, %s!", "World");

Ralph also integrates well with Node.js. To be able to use a Node.js module
in Ralph, place a .rm file (ralph module definition) in src that specifies
the name, it is native (native?: #t) and the definitions it is exporting.

For example, a basic definition for the Node.js module vm could look like: