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からいよいよ関数型プログラミングです.とっとと演習終わらせよう