CoffeeScript - CoffeeScript

CoffeeScript
CoffeeScript-logo.png
Paradigma Multi-paradigma : baseado em protótipo , funcional , imperativo , script
Projetado por Jeremy Ashkenas
Desenvolvedor Jeremy Ashkenas
Apareceu pela primeira vez 13 de dezembro de 2009 ; 11 anos atrás ( 13/12/2009 )
Versão estável
2.5.1  Edite isso no Wikidata / 31 de janeiro de 2020 ; 20 meses atrás ( 31 de janeiro de 2020 )
Disciplina de digitação dinâmico , implícito
SO Plataforma cruzada
Licença Licença MIT
Extensões de nome de arquivo .café, .litcoffee
Local na rede Internet coffeescript .org
Influenciado por
Haskell , JavaScript , Perl , Python , Ruby , YAML
Influenciado
MoonScript, LiveScript , JavaScript

CoffeeScript é uma linguagem de programação que compila em JavaScript . Ele adiciona açúcar sintático inspirado em Ruby , Python e Haskell em um esforço para melhorar a brevidade e legibilidade do JavaScript. Recursos adicionais específicos incluem compreensão de lista e atribuição de desestruturação .

O suporte para CoffeeScript está incluído no Ruby on Rails versão 3.1 e no Play Framework . Em 2011, Brendan Eich fez referência ao CoffeeScript como uma influência em seus pensamentos sobre o futuro do JavaScript.

História

Em 13 de dezembro de 2009, Jeremy Ashkenas fez o primeiro commit do Git do CoffeeScript com o comentário: "commit inicial da linguagem de mistério." O compilador foi escrito em Ruby. Em 24 de dezembro, ele fez o primeiro lançamento marcado e documentado, 0.1.0. Em 21 de fevereiro de 2010, ele comprometeu a versão 0.5, que substituiu o compilador Ruby por uma versão de auto-hospedagem em CoffeeScript puro. Naquela época, o projeto havia atraído vários outros colaboradores no GitHub e estava recebendo mais de 300 visitas de página por dia.

Em 24 de dezembro de 2010, Ashkenas anunciou o lançamento do estável 1.0.0 para Hacker News , o site onde o projeto foi anunciado pela primeira vez.

Em 18 de setembro de 2017, a versão 2.0.0 foi introduzida, que "visa trazer o CoffeeScript para a era JavaScript moderna, fechando as lacunas de compatibilidade com o JavaScript enquanto preserva a sintaxe limpa que é a marca registrada do CoffeeScript."

Sintaxe

Quase tudo é uma expressão em CoffeeScript, por exemplo if, switche as forexpressões (que não têm valor de retorno em JavaScript) retornam um valor. Como em Perl , essas instruções de controle também têm versões pós-fixadas; por exemplo, iftambém pode ser escrito na consequent if conditionforma.

Muitos parênteses e colchetes desnecessários podem ser omitidos; por exemplo, blocos de código podem ser denotados por indentação em vez de colchetes, chamadas de função são implícitas e literais de objeto geralmente são detectados automaticamente.

Para calcular o índice de massa corporal , pode-se fazer (aqui em JavaScript ):

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

Com CoffeeScript, o intervalo é descrito diretamente:

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

Para calcular o máximo divisor comum de dois inteiros com o algoritmo de Euclides , em JavaScript um geralmente precisa de um enquanto loop:

gcd = (x, y) => {
  do {
    [x, y] = [y, x%y];
  } while (y !== 0)
  return x
}

Considerando que, em CoffeeScript, pode-se usar uma untilatribuição de desestruturação em vez disso:

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

Qualquer loop for pode ser substituído por uma compreensão de lista ; de modo que, para calcular os quadrados dos números ímpares positivos menores do que dez (ou seja, números cujo módulo restante 2 é 1), pode-se fazer:

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

Como alternativa, existe:

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

Uma pesquisa linear pode ser implementada com uma linha usando a palavra-chave when:

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

A for ... insintaxe permite o loop em arrays, enquanto a for ... ofsintaxe permite o loop em objetos.

A ?palavra-chave verifica rapidamente se uma variável é nullou undefined :

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

Isso alertaria "Nenhuma pessoa" se a variável for nullou undefinede "Tenho pessoa" se houver algo lá.

Um snippet de JavaScript comum usando a biblioteca jQuery é:

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

Ou mesmo apenas:

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

Em CoffeeScript, a functionpalavra-chave é substituída pelo ->símbolo e o recuo é usado em vez de chaves, como em outras linguagens de regra externas, como Python e Haskell. Além disso, os parênteses geralmente podem ser omitidos, usando o nível de indentação em vez de denotar uma função ou bloco. Portanto, o equivalente CoffeeScript do snippet acima é:

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

Ou apenas:

$ ->
  # Initialization code goes here

A interpolação de strings no estilo Ruby está incluída no CoffeeScript. Strings entre aspas duplas permitem valores interpolados, usando # {...}, e strings entre aspas simples são literais.

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

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

CoffeeScript foi criticado por suas regras de escopo incomuns. Em particular, ele desautoriza completamente o sombreamento de variável, o que torna o raciocínio sobre o código mais difícil e sujeito a erros em alguns padrões básicos de programação estabelecidos e tidos como certos desde que os princípios de programação procedural foram definidos.

Por exemplo, com o seguinte snippet de código em JavaScript, não é necessário olhar para fora do {}-block para saber com certeza que nenhuma foovariável possível no escopo externo pode ser substituída acidentalmente:

  // ...
  function baz() {
    var foo = "bar"
    console.log(`foo = ${foo}`)
  }
  // ...
}

No CoffeeScript não há como saber se o escopo de uma variável está limitado a um bloco ou não sem olhar para fora do bloco.

Desenvolvimento e distribuição

O compilador CoffeeScript é auto-hospedado desde a versão 0.5 e está disponível como um utilitário Node.js. no entanto, o compilador principal não depende do Node.js e pode ser executado em qualquer ambiente JavaScript . Uma alternativa ao utilitário Node.js é o Plugin Coffee Maven, um plugin para o sistema de compilação Apache Maven . O plugin usa o mecanismo Rhino JavaScript escrito em Java .

O site oficial em CoffeeScript.org tem um botão "Try CoffeeScript" na barra de menus; clicar nele abre uma janela modal na qual os usuários podem entrar no CoffeeScript, ver a saída JavaScript e executá-la diretamente no navegador. O site js2coffee oferece tradução bidirecional.

Últimas adições

  • Os mapas de origem permitem que os usuários depurem seu código CoffeeScript diretamente, suportando rastreamentos do CoffeeScript em erros de tempo de execução.
  • CoffeeScript suporta uma forma de programação literária , usando a extensão de arquivo .coffee.mdou .litcoffee. Isso permite que o código-fonte do CoffeeScript seja escrito em Markdown . O compilador tratará quaisquer blocos recuados (a maneira de Markdown de indicar o código-fonte) como código e ignorará o resto como comentários.

Extensões

Iced CoffeeScript é um superconjunto do CoffeeScript que adiciona duas novas palavras-chave: awaite defer. Essas adições simplificam o fluxo de controle assíncrono, tornando o código mais parecido com uma linguagem de programação procedural , eliminando a cadeia de retorno de chamada. Ele pode ser usado no lado do servidor e no navegador.

Adoção

Em 13 de setembro de 2012, o Dropbox anunciou que sua base de código do lado do navegador foi reescrita de JavaScript para CoffeeScript, mas foi migrada para TypeScript em 2017.

O guia de estilo interno do GitHub disse uma vez "escreva novo JS em CoffeeScript" e, embora não o faça mais, todos os conselhos no guia de estilo fazem referência a como escrever um bom CoffeeScript, e seu editor de texto Atom também foi escrito na linguagem.

Pixel Game Maker MV usa CoffeeScript como parte de seu ambiente de desenvolvimento de jogos.

Veja também

Referências

Leitura adicional

links externos