CoffeeScript

From Infogalactic: the planetary knowledge core
Jump to: navigation, search
CoffeeScript
CoffeeScript-logo.png
Paradigm Multi-paradigm: prototype-based, functional, imperative, scripting
Designed by Jeremy Ashkenas
Developer Jeremy Ashkenas, et al.
First appeared December 13, 2009; 14 years ago (2009-12-13)
Stable release 1.10.0 / September 3, 2015; 8 years ago (2015-09-03)
OS Cross-platform
License MIT License
Filename extensions .coffee, .litcoffee
Website coffeescript.org
Influenced by
Haskell, JavaScript, Perl,[citation needed] Python,[1] Ruby, YAML[2]
Influenced
MoonScript, LiveScript

CoffeeScript is a programming language that transcompiles to JavaScript. It adds syntactic sugar inspired by Ruby, Python and Haskell in an effort to enhance JavaScript's brevity and readability.[3] Specific additional features include list comprehension and pattern matching.

CoffeeScript support is included in Ruby on Rails version 3.1.[4] In 2011, Brendan Eich referenced CoffeeScript as an influence on his thoughts about the future of JavaScript.[5][6]

History

On December 13, 2009, Jeremy Ashkenas made the first Git commit of CoffeeScript with the comment: "initial commit of the mystery language."[7] The compiler was written in Ruby. On December 24, he made the first tagged and documented release, 0.1.0. On February 21, 2010, he committed version 0.5, which replaced the Ruby compiler with a self-hosting version in pure CoffeeScript. By that time the project had attracted several other contributors on GitHub, and was receiving over 300 page hits per day.

On December 24, 2010, Ashkenas announced the release of stable 1.0.0 to Hacker News, the site where the project was announced for the first time.[8][9]

Syntax

Almost everything is an expression in CoffeeScript, for example if, switch and for expressions (which have no return value in JavaScript) return a value. As in Perl, these control statements also have postfix versions; for example, if can also be written after the conditional statement.

Many unnecessary parentheses and braces can be omitted; for example, blocks of code can be denoted by indentation instead of braces, function calls are implicit, and object literals are often detected automatically.

Examples

Interval test

To compute the body mass index, one may do (here in JavaScript):

var mass = 72
var height = 1.78
var BMI = mass / (height * height)
if (18.5 < BMI && BMI < 25) alert('You are healthy!')

With CoffeeScript the interval is directly described:

mass = 72
height = 1.78
BMI = mass / height**2
alert 'You are healthy!' if 18.5 < BMI < 25

Loops and comprehensions

To compute the greatest common divisor of two integers with the euclidean algorithm, one usually needs a while loop:

function gcd(x, y) {
  var z
  do {
    z = x % y
    x = y
    y = z
  } while (y != 0)
  return x
}

Whereas in CoffeeScript one can use until and pattern-matching instead:

gcd = (x, y) ->
  [x, y] = [y, x%y] until y is 0
  x

Any for loop can be replaced by a list comprehension; so that to compute the squares of the positive odd numbers smaller than ten (i.e. numbers which remainder modulo 2 is 1), one can do:

alert n*n for n in [1..10] when n%2 is 1

Alternatively, there is:

alert n*n for n in [1..10] by 2

You can implement a linear search with a one-liner using the when keyword:

names = ["Ivan", "Joanna", "Nikolay", "Mihaela"]
linearSearch = (searchName) -> alert(name) for name in names when name is searchName

The for ... in syntax allows you to loop over arrays while the for ... of syntax allows you to loop over objects.

You can use the ? keyword to quickly check if a variable is null or undefined :

personCheck = ->
  if not person? then alert("No person") else alert("Have person")
person = null
personCheck() 
person = "Ivan"
personCheck()

This would alert "No person" if the variable is null or undefined and "Have person" if there is something there.

Functions and jQuery

A common JavaScript snippet using the jQuery library is:

$(document).ready(function() {
  // Initialization code goes here
})

Or even just:

$(function() {
  // Initialization code goes here
})

In CoffeeScript, the function keyword is replaced by the -> symbol, and indentation is used instead of curly braces, as in other off-side rule languages such as Python and Haskell. Also, parentheses can usually be omitted, using indentation level instead to denote a function or block. Thus, the CoffeeScript equivalent of the snippet above is:

$(document).ready ->
  # Initialization code goes here

Or just:

$ ->
  # Initialization code goes here

String interpolation

Ruby-style string interpolation is included in CoffeeScript. Double-quoted strings allow for interpolated values, using #{ ... }, and single-quoted strings are literal.[10]

author = "Wittgenstein"
quote  = "A picture is a fact. -- #{ author }"

sentence = "#{ 22 / 7 } is a decent approximation of π"

Compiling

The CoffeeScript compiler has been written in CoffeeScript since version 0.5 and is available as a Node.js utility; however, the core compiler does not rely on Node.js and can be run in any JavaScript environment.[11] One alternative to the Node.js utility is the Coffee Maven Plugin, a plugin for the popular Apache Maven build system. The plugin uses the Rhino JavaScript engine written in Java.

The official site at CoffeeScript.org has a "Try CoffeeScript" button in the menu bar; clicking it opens a modal window in which users can enter CoffeeScript, see the JavaScript output, and run it directly in the browser. The js2coffee[12] site provides bi-directional translation.

Latest additions

  • Source maps allow users to debug their CoffeeScript code directly, supporting CoffeeScript tracebacks on runtime errors.
  • CoffeeScript supports a form of Literate Programming, using the .coffee.md or .litcoffee file extension. This allows CoffeeScript source code to be written in Markdown. The compiler will treat any indented blocks (Markdown's way of indicating source code) as code, and ignore the rest as comments.

Adoption

On September 13, 2012, Dropbox announced that their browser-side codebase has been rewritten from JavaScript to CoffeeScript.[13]

GitHub's internal style guide once said "write new JS in CoffeeScript", and while it no longer does, all the advice in the style guide references how to write good CoffeeScript,[14] and their Atom text editor is also written in the language.[15]

See also

References

  1. http://coffeescript.org/ "CoffeeScript borrows chained comparisons from Python"
  2. Lua error in package.lua at line 80: module 'strict' not found.
  3. Lua error in package.lua at line 80: module 'strict' not found.
  4. , Joshua. Tweet by Rails Core Team Member on Apr 13, 2011
  5. Eich, Brendan. "Harmony of My Dreams"
  6. Eich, Brendan. "My JSConf.US Presentation"
  7. Github. 'initial commit of the mystery language'
  8. Hacker News. CoffeeScript 1.0.0 announcement posted by Jeremy Ashkenas on Dec 24, 2010
  9. Hacker News. Original CoffeeScript announcement posted by Jeremy Ashkenas on Dec 24, 2009
  10. Lua error in package.lua at line 80: module 'strict' not found.
  11. CoffeeScript. Jashkenas.github.com. Retrieved on 2013-07-21.
  12. Lua error in package.lua at line 80: module 'strict' not found.
  13. Lua error in package.lua at line 80: module 'strict' not found.
  14. Lua error in package.lua at line 80: module 'strict' not found.
  15. Atom source code. github.com. Retrieved on 2015-07-22.
  16. Lua error in package.lua at line 80: module 'strict' not found.

Further reading

  • Lua error in package.lua at line 80: module 'strict' not found.
  • Lua error in package.lua at line 80: module 'strict' not found.
  • Lua error in package.lua at line 80: module 'strict' not found.
  • Lua error in package.lua at line 80: module 'strict' not found.
  • Lua error in package.lua at line 80: module 'strict' not found.

External links