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)
Migrate to New Syntax
Starting from v8.2.0
, BuckleScript and the JS part of Reason are now fused into the new ReScript. We've also introduced a new syntax similar to the old Reason syntax, but tremendously improved.
The old ML and Reason syntax are still supported (see our support commitment here). The gist is: this is mostly just a rebranding and shouldn't affect your existing code much.
Upgrade Your Codebase
There are lots of exciting improvements in the new syntax (features, speed, error messages, etc.). The upgrade is trivial, backward-compatible and can be done on a per-file basis:
Upgrade your project to
bs-platform 8.2.0
or later.node_modules/.bin/bsc -format MyFile.re > MyFile.res
That's it! MyFile.re
could be any .re
, .rei
, .ml
and .mli
file.
Enjoy the improved experience!
Difference With Old Reason
Complete removal of semicolon (you can still write them).
No need for parentheses around
if
,switch
andtry
.Type arguments: from
option(int)
tooption<int>
.Old interpolated string: from
{j|hello ${name}|j}
toj`hello ${name}`
. Now with proper unicode support!New interpolated string:
`hello world`
. Also supports multiline and unicode."hello world"
string is now singleline.Polymorphic variants: from
`red
to#red
.Arrays: from
[|1,2,3|]
to[1,2,3]
. In JS, arrays are the right default.Lists: from
[1,2,3]
tolist[1,2,3]
(8.1.1 update: now it islist{1, 2, 3}
). This ties with upcoming plans to access containers in a uniform way:set[...]
andmap[...]
. Maybe temporary.Exception: from
try (compute()) { | Not_found => Js.log("oops")}
totry compute() catch { | Not_found => Js.log("oops")}
.First class module: from
(module S: Student)
tomodule(S: Student)
.No custom infix operator for now (including
mod
).Object access: from
settings##visible #= true
tosettings["visible"] = true
. Rejoice!Object: from
Js.t({"age": int})
to just{"age": int}
. TheJs.t
part is now implicit.Attribute: from
[@bs.deriving accessors]
to@bs.deriving(accessors)
. From[%re bla]
to%re(bla)
.Removed dereference syntax
result^
. Just useresult.contents
.fun
pattern matching syntax removed.Type declaration is non-recursive by default, consistent with let bindings. To have recursive types, use
type rec myList<'a> = Nil | Cons('a, myList<'a>)
.Use any words, including reserved keywords, as your identifier name:
let \"try" = true
.