Check out the compiler on GitHub.

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.