Nemerle for OOP Programmers Week 1 (6)
Nemerleはおろか日記の更新も滞っていますが,ようやく少しずつ先が見えてきたのかな?ちなみにこの3連休は,初日に娘とアンパンマンを見て,残り2日は仕事でした.
Modules
C#2.0になってstaticクラスが導入されましたが,Moduleはまさにそんな感じですね.しかもメソッド・フィールドにはstaticを付ける必要はないみたい
module Operations { public Add (n1 : int, n2 : int) : int { n1 + n2 } public Substract (n1 : int, n2 : int) : int { n1 - n2 } } // Note that module members are accessed through class name System.Console.WriteLine (Operations.Add (1, 2));
そういえば以前Singletonを話題にしたことがあったけど,SingletonとModules/staticクラスの違いって何だろう?Singletonはインスタンスが1つしか生成されないことを保障するものだけど,Modules/staticクラスはそもそもインスタンスが作れない,って違いはあります.でもModules/staticクラスにstaticフィールドがある場合,ほとんどSingletonの代替として使えるんじゃないかなー?なにか思い違いしてる?
Type conversions
型の変換ですが,これまでは大抵C#にもある機能で理解が楽でしたが今回はそうではないみたいです.
えーと,Nemerleだと型の変換に関する2つの演算子があります.以下超訳...
- Type cast( :> )
このオペレーションは実行時にチェックされます.この演算子はダウンキャストの際に有効です.キャストに失敗するとInvalidCastException例外がthrowされます.
- Type enforcement( : )
このオペレーションはコンパイル時にチェックされます.というか,コンパイル時にチェックできるようなものにしか使えません.例えば,shortからintへの変換とかアップキャストとか...
こんな例が載ってます
def memoryStream = System.IO.MemoryStream (); def stream = memoryStream : System.IO.Stream; // MemoryStream is a subclass of Stream def n1 = int.Parse System.Console.ReadLine()); def n2 = int.Parse System.Console.ReadLine()); def resultAsShort = (n1 + n2) :> short; // We don't know if n1 + n2 fits on short, so we use :>
最初のは,System.IO.MemoryStreamのインスタンスをSystem.IO.Stream変数に入れるわけですから,アップキャストなのでType enforcementが使えます.次の例ではintとintの足し算した結果をshort変数に入れようとしていて,それが可能かは実行時でないと分かりません.なのでType castを使用して,キャストできなかったら例外throwですね.
...まぁ,こんなもんですかね.
演習問題が残っているけど,ようやくWeek 1が終わりです...って1ヶ月くらいかかってるんですけど(^^;;
Week 2からいよいよ関数型プログラミングです.とっとと演習終わらせよう