(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

CoffeeScriptはじめました

Railsアプリケーションを書くときに、JavaScriptを書くことがある場合だいたいCoffeeScriptを書くことになると思います。ご多分に漏れず僕もCoffeeScriptを書くことになります。

TypeScriptとかHaxeとか、altJS色々ありますけどRailsのエコシステムに端から組み込まれているCoffeeをわざわざ使わない理由はないよなって思います。開発しているときにコンパイルとか気にしなくて良いし。

インストールはこの辺参考にして、僕はUbuntuなのでさくっといれました。
Installing Node.js via package manager · joyent/node Wiki · GitHub

sudo apt-get update
sudo apt-get install -y python-software-properties python g++ make
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

nodeJSをさっくり入れて、npm install coffee-scriptするだけね。

ちなみに個人的にCoffee初めて良かったなって思ったのは、なんとなく「括弧のないLisp」ぽいところです。

zero =
  (f) ->
    (x) -> x

add_1 =
  (n) ->
    (f) ->
      (x) ->
        f((n f) x)

to_int =
  (c) ->
    ((c (x) -> x + 1) 0)
    
console.log to_int add_1 add_1 zero

Coffeeのコードスタイルは詳しく知らないけど、lowerCamelCaseが本当はいいみたい。だけど@師匠の教えによりsnake_caseで書いてみたりしている。まぁRails書いてるとsnake_caseの方が馴染みやすい気はするし、この言語がlowerCamelCaseってなんか芋っぽい気がするなーとか。

polarmobile/coffeescript-style-guide · GitHub

FizzBuzzなんかもこんな感じで

fizz_buzz = [1..100].map (n) ->
  if n%15 is 0 then "FizzBuzz"
  else if n%5 is 0 then "Buzz"
  else if n%3 is 0 then "Fizz"
  else n

console.log fizz_buzz

あと、個人的に面白かったのはこれ。

hoge =
  "foo": -> console.log "hoge foo"
  "bar": -> console.log "hoge bar"

hoge.foo()
hoge.bar()

連想配列をすっと呼び出して、あたかも関数かのようにそのまま実行できるのステキじゃないですか?

これRubyだったらこう書く。

hoge = {
  foo: lambda {puts "hoge foo"},
  bar: lambda {puts "hoge bar"}
}

hoge[:foo].call # hoge[:foo].() でも可
hoge[:bar].call

ちょっとRubyがこれだとダサい感じに見えるのは仕方ないんですかね…。

ちなみにGaucheならこんな感じ?

(define hoge
  '((foo . (^() (print "hoge foo")))
    (bar . (^() (print "hoge bar")))))

(eval `(,(assq-ref hoge 'foo))
      (interaction-environment))
(eval `(,(assq-ref hoge 'bar))
      (interaction-environment))

んー?本当?分からないけど。

まぁそんな感じでちょっとJavaScript方面に対して苦手意識があったけど、少しずつ慣れていきたい所存。

追記 2014/2/10

@さんにGauche版について突っ込まれたので修正。

(define hoge
  `((foo . ,(^() (print "hoge foo")))
    (bar . ,(^() (print "hoge bar")))))

((assq-ref hoge 'foo))
((assq-ref hoge 'bar))

この形はある意味僕が求めていたものなんだけど、unquoteをそこで使えるのかって驚いた。だって自分の考えになかったんだもの。ないものはどうしようもない。