Nemerle for OOP Programmers Week 0 ; Exercise 2

早速演習に取り掛かります.

Exercise 2

問題はこんな感じです.

ユーザがオペレーションを選択できるように、先ほどのプログラムにメニュー(可能なオペレーションのリストと、選択のためのプロンプトを持つもの)を追加する.数値を読み込むメソッドとメニューを表示するメソッドは分けること.

前回の問題では,2数の加減乗除と角度の正弦・余弦正接を1プログラムにしていました.今回それをベースにしようと思ったのですが,メニュー周りが煩雑になるので,角度のほうは無しにしました(^^;;

using System;

class Asker
{
  public static Input() : array[string]
  {
    Console.Write("Input a first number > ");
    def lhs = Console.ReadLine();
    Console.Write("Input a second number > ");
    def rhs = Console.ReadLine();

    array[lhs, rhs];
  }

  public static Menu() : string
  {
    Console.Write("Choose a operation to perform. Add, substract, multiply, divide(a/s/m/d) > ");
    Console.ReadLine();
  }
}

def input = Asker.Input();
def item = Asker.Menu();

def lhs = int.Parse(input[0]);
def rhs = int.Parse(input[1]);
if (item == "a")
{
  Console.WriteLine("Added is {0}.", lhs + rhs);
}
else if (item == "s")
{
  Console.WriteLine("Substracted is {0}.", lhs - rhs);
}
else if (item == "m")
{
  Console.WriteLine("Multiplied is {0}.", lhs * rhs);
}
else if (item == "d")
{
  Console.WriteLine("Divided is {0}.", lhs / rhs);
  Console.WriteLine("Modules is {0}.", lhs % rhs);
}
else
{
  Console.WriteLine("Bye.");
}

実は今回,意外とてこずりました.Inputメソッドで戻り値で2数を返すのですが,配列がstring[]でないところで少しだけハマリ.

string[] input = new string[2];

みたいなコードを書くと,newなんて知らないと怒られ.
それでInputメソッドは

public static Input() : array[string]
{
  Console.Write("Input a first number > ");
  def lhs = Console.ReadLine();
  Console.Write("Input a second number > ");
  def rhs = Console.ReadLine();

  def input = array(2);
  input[0] = lhs;
  input[1] = rhs;
  input;
}

としてたんだけど,いかにも最後のinput;がいやだったので現在の形に改善しました.
ちなみに本当は配列を返したいのではなく2値を返したいので,tupleのほうがいいような気もしますが,そのうち出てくるでしょうってことで放置.またstringの2値をintの2値に変換するところも,Haskellでいうところのmap関数みたいなのがありそう……ってところで,簡単そうな問題でもいろいろ考えるところは出てきますね.