No longer in development
Squiggle

{Squiggle}

a strict, expression-oriented, compile-to-JS programming language

read the tutorial or try it out

Hello world

global.console.log("Hello, world!")

Check out the compiler on GitHub.

Install it!

npm install -g squiggle-lang

Features

Simple syntax

Squiggle does not use semicolons, and indentation does not matter. Data literals mostly match JS for ease of learning.

Arity checked functions

Calling a function made in Squiggle with the wrong number of arguments throws an exception.

Named-this

JavaScript's this becomes a normal named parameter, making it easy to nest functions and use callbacks.

Rest parameters

No more mucking around with arguments, simply name the extra arguments like ...args.

No use before definition

Squiggle warngs you about using a variable before it's defined, eliminating an entire class of errors.

Frozen literals

Array and object literals are frozen with Object.freeze by default, so you can't accidentally mutate them.

Easy updates

Simple operators ++ to concatenate two arrays or two strings, and ~ to merge two objects into a new frozen object with the prototype of the first object.

Destructuring assignment

Grab object properties or array elements when you assign variables, like: let [x, y] = [1, 2] or let {x, y} = {x: 1, y: 2}.

Pattern matching

Like JS switch but with destructuring power built-in and no dangerous fall-through.

No type coercion

Standard operators like +, -, *, and more, have been replaced with strict version that do not perform any type coercions, throwing exceptions on bad inputs.

Concise function syntax

Functions are simple: fn(x) x + 1.

Easy errors

Simple error "some message" to throw an error with the desired message.

Expression try/catch

try/catch rethought as an operator producing ["ok", value] or ["fail", error] as its result. Pairs well with pattern matching.

Safer property access

The expression foo.bar throws an error if "bar" is undefined in foo.

No accidental reference equality

The operator == performs an equality check only for value types. It throws on reference types (objects/arrays).