The joy of writing CoffeeScript

November 11, 2011


This post was originally published in the Rambling Labs Blog on November 11, 2011.


I have been a fan of JavaScript for a while now, and I have dived into the CoffeeScript world for the last month or so.

Guess what? I love it! It’s been a great experience so far.

Definitely the one thing that I’m loving the most right now about CoffeeScript is the syntactic sugar. It’s basically a lot of simple shorthands for certain things (the -> is so handy). Take this example (and ignore what the excluded methods are doing):

I had this:

class BuildUtils
  combine_source_files: (callback) ->
    self = @
    fs.readdir './src', (err, files) ->
      self.error_handler err
      content = new Array()

      files = files.sort()
      for file, index in files then do (file, index) ->
        unless file.indexOf('.') is 0
          fs.readFile "./src/#{file}", 'utf8', (err, fileContent) ->
            self.error_handler err
            content[content.length] = fileContent

            if index is files.length - 1
              callback content

And changed it to this:

class BuildUtils
  combine_source_files: (callback) ->
    self = @
    fs.readdir './src', (err, files) ->
      self.error_handler err
      content = new Array()

      files = files.sort()
      for file, index in files when file.indexOf('.') isnt 0 then do (file, index) ->
        fs.readFile "./src/#{file}", 'utf8', (err, fileContent) ->
          self.error_handler err
          content[content.length] = fileContent

          if index is files.length - 1
            callback content

Did you spot it? Let’s take a closer look:

Had this:

for file, index in files then do (file, index) ->
  unless file.indexOf('.') is 0
    # The code I want to run

And got this afterwards:

for file, index in files when file.indexOf('.') isnt 0 then do (file, index) ->
  # The code I want to run

Yes, I know, it’s a really simple change, and it’s basically doing the same. But doesn’t the second one read beautifully?

This is how I read it:

For file and index in files, when the file does not start with ‘.’ then do…“

What do you think?