# Writing At First

Because Atom uses a lot of CoffeeScript to product itself. And writing some plugins can use it through JavaScript is also allowed. So I will study it to write some Atom plugins or Chrome plugins.

# What is CoffeeScript

From Coffee.org:

CoffeeScript is a little language that compiles into JavaScript. Underneath that awkward Java-esque patina, JavaScript has always had a gorgeous heart. CoffeeScript is an attempt to expose the good parts of JavaScript in a simple way.

Also it need I to know JavaScript. And I know a little. I think it is enough.

I think its grammar likes Python.

## Define a variable

Like this:

a = 0
b = "i"

And after compiling, its JavaScript code like this:

var a, b;

a = 0;

b = "i";

## Define a function

Like this:

add = (a,b) -> a+b
multiply = (a,b) -> a*b

And after compiling, its JavaScript code like this:

var add, multiply;

return a + b;
};

multiply = function(a, b) {
return a * b;
};

Multi-line function:

add = (a,b) ->
a+=b
a++
a+b

And after compiling, its JavaScript code like this:

var add;

a += b;
a++;
return a + b;
};

The last expression's return value is the function's return value.

## Using Compare

A normal compare:

biggest = 10
things = 5
comp = things < biggest

Compiles to JavaScript:

var biggest, comp, things;

biggest = 10;

things = 5;

comp = things < biggest;

In Coffee, there is an easy way to put together compare.

Like this:

smallest = 0
biggest = 10
things = 5
comp = smallest < things < biggest

Compiles to JavaScript:

var biggest, comp, smallest, things;

smallest = 0;

biggest = 10;

things = 5;

comp = (smallest < things && things < biggest);

## Using if

Like this:

a = 1
if a=0
a++

Compiles to JavaScript:

var a;

a = 1;

if (a = 0) {
a++;
}

## Create an array

[1..10] is to create a array:

a = [1..10]

Compiles to JavaScript:

var a;

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

Use variable to create an array:

a = 5
b = 10
c = [a..b]

Compiles to JavaScript:

var a, b, c, i, results;

a = 5;

b = 10;

c = (function() {
results = [];
for (var i = a; a <= b ? i <= b : i >= b; a <= b ? i++ : i--){ results.push(i); }
return results;
}).apply(this);

## Using for

for a in [1..10]
alert(a)

Compiles to JavaScript:

var a, i;

for (a = i = 1; i <= 10; a = ++i) {
}

If you want its step is 2:

for a in [1..10] by 2
alert(a)

Compiles to JavaScript:

var a, i;

for (a = i = 1; i <= 10; a = i += 2) {
}