[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みたいな言語が出たら最高だと思う。そこらへんの所感についてはあとで書く。