No longer in development
8. JavaScript interoperability

8. JavaScript interoperability

JavaScript and Squiggle are friends. Because Squiggle just compiles down to JavaScript files, it's trivial to call Squiggle code from JavaScript, or vice- versa. Squiggle uses all the same data as JavaScript, so you don't even have to convert anything.

Arity problems

Squiggle functions check their arity, but many JavaScript functions are built assuming variadic functions. For example:

# File: helpers.sqg

def add(x) do
  x + 1
end

export add
// File: main.js

var helpers = require("./helpers");
var xs = [1, 2, 3].map(helpers.add);
console.log(xs);

This will fail because Array.prototype.map actually passes three parameters to its callback function: data, index, and array. In scenarios like this, you can wrap the Squiggle function like so:

var xs = [1, 2, 3].map(function(data) {
  return helpers.add(data);
});
console.log(xs);

Mutability problems

Sometimes you need mutable data. Fortunately, it's still possible to create it in Squiggle. Simply put a & before your array or object literals.

let {Object, console} = global

let a = &["sup", "cool"]
let o = &{key: "nothing", key2: "interesting"}

Object.assign(a, {"0": "hi"})
Object.assign(o, {key: "value"})

console.log([a, o])
#=> [["hi", "cool"], {key: "value", key2: "interesting"}]

Problems with this or new

Squiggle does not feature the keywords this or new from JavaScript because they cause more harm than good, and are not necessary. Some libraries require their use, however, so Squiggle has functions for dealing with this.

Remember that any Squiggle function can still use JavaScript's this value if it's explicitly declared as a named parameter with an @ prefix:

jQuery("something").on("click", fn(@this) do
  jQuery(this).somethingElse()
end)

If you need to supply the value of this to a function, you can simply use the standard JavaScript function methods .apply or .call:

someFn.call(myThisValue, param1, param2)

someFn.apply(myThisValue, [param1, param2])

new is harder to do away with since many APIs (e.g. Date and Promise) require its use to create an instance. Some way to invoke new on a function will be provided.