Reason (programming language)

Last updated
Reason
Reason-logo.svg
Paradigms Multi-paradigm: functional, imperative, modular, object-oriented
Family ML: Caml: OCaml
Designed by Jordan Walke
First appearedMay 16, 2016;8 years ago (2016-05-16) [1]
Stable release
3.14.0 [2]   OOjs UI icon edit-ltr-progressive.svg / November 29, 2024;2 months ago (November 29, 2024)
License MIT
Filename extensions .re, .rei
Website reasonml.github.io OOjs UI icon edit-ltr-progressive.svg
Influenced by
OCaml, JavaScript

Reason, also known as ReasonML, is a general-purpose, high-level, multi-paradigm, functional and object-oriented programming language and syntax extension and toolchain for OCaml created by Jordan Walke, who also created the React framework, at Facebook. [3] [4] Reason uses many syntax elements from JavaScript, compiles to native code using OCaml's compiler toolchain, and can compile to JavaScript using the ReScript compiler. [5]

Contents

The Reason community officially provides ReasonReact as a solution for React-based web applications. [6]

BuckleScript and ReScript

Reason was originally compiled to JavaScript using the BuckleScript compiler, [7] which was created at Bloomberg L.P.

In 2020, the BuckleScript and Reason toolchain was rebranded to ReScript, essentially creating a separate language that had different syntax from Reason and only compiled to JavaScript. [8]

BuckleScript was forked to Melange [9] to continue to support compiling OCaml to JavaScript.

Differences from OCaml Syntax

While Reason compiles down to native code via OCaml's toolchain, it specifically differs in its syntax, error messaging, and editor tooling. [10] This allows Reason to provide an experience more similar to JavaScript or TypeScript for developers, which some may be more familiar with.

While OCaml often relies on Indentation and begin/end keywords, Reason tends to use curly braces to delimit blocks and semicolons for separation of expressions. Like JavaScript, Reason also defines functions via arrow-like syntax. Other notable differences include usage of a switch construct (instead of a match construct) and a reformatter for error messages.

Example

typeschoolPerson=Teacher|Director|Student(string);letgreeting=person=>switch(person){|Teacher=>"Hey Professor!"|Director=>"Hello Director."|Student("Richard")=>"Still here Ricky?"|Student(anyOtherName)=>"Hey, "++anyOtherName++"."};

See also

References

  1. "Simple, fast & type safe code that leverages the JavaScript & OCaml ecosystems: facebook/reason". GitHub. Facebook. 2019-03-23. Retrieved 2019-03-23.
  2. "Release 3.14.0". 29 November 2024. Retrieved 27 December 2024.
  3. "What is ReasonML?". 2ality. Retrieved 2019-03-23.
  4. Rauschmayer, Axel (2018). Exploring ReasonML and functional programming. ReasonML Hub. Retrieved 2024-05-14.
  5. "Overview: ReScript Documentation". rescript-lang.org. Retrieved 2020-08-10.
  6. "ReasonReact". GitHub .
  7. "BuckleScript". Bloomberg L.p. Retrieved 2022-09-11.
  8. "BuckleScript & Reason Rebranding". rescript-lang. Retrieved 2022-09-11.
  9. "ANN: Melange 1.0 – compile OCaml / ReasonML to JavaScript". OCaml. 2023-06-02. Retrieved 2024-05-24.
  10. "What & Why · Reason". reasonml.github.io. Retrieved 2025-02-08.