[coffee-script] coffee-scriptでrubyのModuleっぽいものを実装してみた

とはいっても関数1つだけど。

ここしばらくずっとtypescript書いてる。
typescriptのmoduleをコンパイルされたコードみてたら、名前空間がなかったら作る、あったら何もしない。と、それだけの実装だったので普通の関数として実装してみた。

root =
  if window? then window
  else if global? then global
  else this

root._module_ = (ns, f) =>
  context = root
  hist = []
  for name in ns.split('.')
    unless context[name]?
      context[name] = {}
    context = context[name]
    hist.push context
  f.apply context, hist

ドットで区切られた名前空間ごとの参照は、引数で受け取る事ができる

こんなふうに使うことを想定している

# how to use
_module_ 'App', (App) ->
  class @Main
    constructor: ->
      App.instance = @
      @hoge_model = new App.Model.Hoge
      @hoge_view = App.View.Hoge @hoge_model
  @instance = null

_module_ 'App.Model', (App, Model) ->
  class @Hoge

_module_ 'App.View', (App, View) ->
  class @Hoge
    constructor: (@model)->

new App.Main
console.log App.instance

require.jsは無駄に規約が多いのでこれぐらいがすっきりしそうに思った。関数1つだし。

Interfaceについて

typescriptのinterfaceの実装もしようとしたんだけど、あるオブジェクトがこのインターフェースを満たすか、っていうのは、言語レベルでもない限り、テストのヘルパでやれって気がしたので面倒になってやめた。実コードでやるものではない。
IEntity = Interface {x: Number, y: Number} って書きかけて飽きた。

Typescript、CoffeeScriptに比べるとやはり無駄に冗長なので、インデントやらなにやらだけcoffee-scriptなTypedCoffeeScriptみたいな言語が出たら最高だと思う。そこらへんの所感についてはあとで書く。