Nemerle for OOP Programmers Week 0 ; Exercise

演習に入る前に……

昨日のサンプルで,

class Asker {
  public static Run () : string
  {
    System.Console.ReadLine ()
  }
}
 
def name = Asker.Run ();
System.Console.WriteLine ("Hello " + name);

最後の2行が気になってましたが,
http://nemerle.ring.hatena.ne.jp/bbs/2/5
で,akirameiさんが解説してくれてます.

実は、先ほどのようにmoduleとMainメソッドを省略してグローバルレベルにコードを書くと自動的にmoduleとMainを補ってくれるのでした。

moduleが馴染みがないと思いますが、これはメンバーが全てstaticになるクラスと考えてください。C#2.0におけるstatic classですね。ただ、Nemerleの場合は、各メンバーにstaticを付ける必要はありません。

というわけで,さきほどのプログラムはこうなる?

class Asker {
  public static Run () : string
  {
    System.Console.ReadLine ()
  }
}
module M {
  Main () : void {
    def name = Asker.Run ();
    System.Console.WriteLine ("Hello " + name);
  }
}
-- 実行結果
>Asker.exe
kurip
Hello kurip

たしかにお手軽.自分も多用しそうです.

Exercise 1

問題はこんな感じです.

以下のコンソールアプリを作れ.
・ユーザに2つの数値を入力させ、それらの和・差・積・商と余りを表示する.
・ユーザに角度を入力させ、それらの正弦・余弦正接を表示する.

まずは素直に解いてみます.

using System;

Console.Write("Input a first number > ");
def s1 = Console.ReadLine();
Console.Write("Input a second number > ");
def s2 = Console.ReadLine();
Console.WriteLine("You inputted numbers is ({0},{1})", s1, s2);

def num1 = int.Parse(s1);
def num2 = int.Parse(s2);
Console.WriteLine("(added, subtracted, multiplied, divided, modulus):=({0},{1},{2},{3},{4})", num1+num2, num1-num2, num1*num2, num1/num2, num1%num2);

Console.WriteLine("");
Console.Write("Input a angle(degree) > ");
def s3 = Console.ReadLine();
Console.WriteLine("You inputted angle is ({0})", s3);

def degreeAngle = double.Parse(s3);
def radianAngle = degreeAngle / 180.0 * Math.PI;
Console.WriteLine("(sin,cos,tan):=({0},{1},{2})",Math.Sin(radianAngle), Math.Cos(radianAngle), Math.Tan(radianAngle));
-- 実行結果
>calc.exe
Input a first number > 10
Input a second number > 3
You inputted numbers is (10,3)
(added, subtracted, multiplied, divided, modulus):=(13,7,30,3,1)

Input a angle(degree) > 30
You inputted angle is (30)
(sin,cos,tan):=(0.5,0.866025403784439,0.577350269189626)

リファクタリングしたい気持ちに駆られるけど,それは次の設問にもありそうなので今回はこれでよしとしましょう.それと例外処理については,しばらくは考慮しない(見て見ぬふり)ことにします.


今日は疲れてるので,この辺にしておきます.