You are currently looking at the v6.0 - v8.2 docs (Reason v3.6 syntax edition). You can find the latest manual page here.
(These docs are equivalent to the old BuckleScript docs before the ReScript rebrand)
Overview
Note: the comparison is against our Reason syntax, not our ML syntax.
JavaScript | Us |
---|
Rules enforced by linter/formatter | No semicolon needed! |
JavaScript | Us |
---|
/* Comment */ | Same |
// Line comment | Same |
JavaScript | Us |
---|
const x = 5; | let x = 5 |
var x = y; | No equivalent (thankfully) |
let x = 5; x = x + 1; | let x = ref(5); x := x.contents + 1 |
| JavaScript | Us |
| ------------------------ | --------------------- | ---------------- | --- |
| "Hello world!"
| Same |
| 'Hello world!'
| Strings must use "
|
| "hello " + "world"
| "hello " ++ "world"
|
| `hello ${message}`
| \{j | Hello $(message) | j}
|
JavaScript | Us |
---|
true , false | Same |
!true | Same |
|| , && , <= , >= , < , > | Same |
a === b , a !== b | Same |
No deep equality (recursive compare) | a == b , a != b |
a == b | No equality with implicit casting (thankfully) |
JavaScript | Us |
---|
3 | Same * |
3.1415 | Same |
3 + 4 | Same |
3.0 + 4.5 | 3.0 +. 4.5 |
5 % 3 | 5 mod 3 |
* JS has no distinction between integer and float.
JavaScript | Us |
---|
no types | type point = {x: int, mutable y: int} |
{x: 30, y: 20} | Same |
point.x | Same |
point.y = 30; | Same |
{...point, x: 30} | Same |
JavaScript | Us |
---|
[1, 2, 3] | [|1, 2, 3|] |
myArray[1] = 10 | Same |
[1, "Bob", true] | (1, "Bob", true) * |
* Heterogenous arrays in JS are disallowed for us. Use tuple instead.
JavaScript | Us |
---|
null , undefined | None * |
* Again, only a spiritual equivalent; we don't have nulls, nor null bugs! But we do have an option
type for when you actually need nullability.
JavaScript | Us |
---|
arg => retVal | Same |
function named(arg) {...} | let named = (arg) => {...} |
const f = function(arg) {...} | let f = (arg) => {...} |
add(4, add(5, 6)) | Same |
JavaScript | US |
---|
const myFun = (x, y) => {
const doubleX = x + x;
const doubleY = y + y;
return doubleX + doubleY;
};
| let myFun = (x, y) => {
let doubleX = x + x
let doubleY = y + y
doubleX + doubleY
}
|
* Our conditionals are always expressions! You can write let result = if (a) {"hello"} else {"bye"}
JavaScript | Us |
---|
const {a, b} = data | let {a, b} = data |
const [a, b] = data | let [|a, b|] = data * |
const {a: aa, b: bb} = data | let {a: aa, b: bb} = data |
* Gives good compiler warning that data
might not be of length 2.
JavaScript | Us |
---|
for (let i = 0; i <= 10; i++) {...} | for (i in 0 to 10) {...} |
for (let i = 10; i >= 0; i--) {...} | for (i in 10 downto 0) {...} |
while (true) {...} | while (true) {...} |
JavaScript | Us |
---|
<Comp message="hi" onClick={handler} /> | Same |
<Comp message=message /> | <Comp message /> * |
<input checked /> | <input checked=true /> |
No children spread | <Comp>...children</Comp> |
* Argument punning!
JavaScript | Us |
---|
throw new SomeError(...) | raise(SomeError(...)) |
try {a} catch (Err) {...} finally {...} | try a catch { | Err => ...} * |
* No finally.
The last expression of a block delimited by {}
implicitly returns (including function body). In JavaScript, this can only be simulated via an immediately-invoked function expression (since function bodies have their own local scope).
JavaScript | US |
---|
let result = (function() {
const x = 23;
const y = 34;
return x + y;
})();
| let result = {
let x = 23
let y = 34
x + y
}
|
| Feature | Example | JavaScript Output |
| ------------------------------- | ------------------------------------ | ------------------------------------------ | --- | -------------------- |
| String | "Hello"
| "Hello"
|
| String Interpolation | \{j | Hello $(message) | j}
| "Hello " + message
|
| Character (disrecommended) | 'x'
| 120
(char code) |
| Integer | 23
, -23
| 23
, -23
|
| Float | 23.0
, -23.0
| 23.0
, -23.0
|
| Integer Addition | 23 + 1
| 23 + 1
|
| Float Addition | 23.0 +. 1.0
| 23.0 + 1.0
|
| Integer Division/Multiplication | 2 / 23 * 1
| 2 / 23 * 1
|
| Float Division/Multiplication | 2.0 /. 23.0 *. 1.0
| 2.0 / 23.0 * 1.0
|
| Float Exponentiation | 2.0 ** 3.0
| Math.pow(2.0, 3.0)
|
| String Concatenation | "Hello " ++ "World"
| "Hello " + "World"
|
| Comparison | >
, <
, >=
, <=
| >
, <
, >=
, <=
|
| Boolean operation | !
, &&
, \|\|
| !
, &&
, \|\|
|
| Shallow and deep Equality | ===
, ==
| ===
, ==
|
| List (disrecommended) | [1, 2, 3]
| {hd: 1, tl: {hd: 2, tl: {hd: 3, tl: 0}}}
|
| List Prepend | [a1, a2, ...oldList]
| {hd: a1, tl: {hd: a2, tl: theRest}}
|
| Array | [|1, 2, 3|]
| [1, 2, 3]
|
| Record | type t = {b: int}; let a = {b: 10}
| var a = {b: 10}
|
| Multiline Comment | /* Comment here */
| Not in output |
| Single line Comment | // Comment here
| Not in output |