Nemerle for OOP Programmers Week 1 (7)

前回からずいぶん(一ヶ月以上!)間が空いてしまいました.
演習問題が残っていたので,ちょうどいいリハビリになりました.

Exercise 1

Personクラスを作ってみる

using System;
using System.Console;
using Nemerle.Utility;

class Person {
  [Accessor]
  firstName : string;
  [Accessor]
  lastName : string;
  [Accessor]
  birthDate : DateTime;

  public Age : int
  {
    get
    {
      def today : DateTime = DateTime.Now;
      mutable carry : int;
      if ((today.Month < birthDate.Month) || 
          (today.Month == birthDate.Month) && (today.Day < birthDate.Day))
      {
        carry = 1;
      }
      else
      {
        carry = 0;
      }
      
      today.Year - birthDate.Year - carry;
    }
  }

  public this(firstName : string, lastName : string, birthDate : DateTime)
  {
    this.firstName = firstName;
    this.lastName = lastName;
    this.birthDate = birthDate;
  }

}

def person = Person("scott", "tiger", DateTime.Parse("1999/11/11"));
WriteLine(String.Format("FirstName:={0},LastName:={1},BirthDate:={2},Age={3}",
	person.FirstName, person.LastName, person.BirthDate, person.Age));

(どうでもいい話ですが,コンストラクタの第3引数はDateTime型にしておいたほうがいいでしょう.これを,内部ではDateTimeで持つけど外部インタフェースとしてはstring型とかにすると,一見ユーザフレンドリーに見えて非常にめんどくさいことになります.)

Excercise 3

Animalクラスを作ってみる

using System;
using System.Console;
using Nemerle.Utility;

abstract class Animal {
  [Accessor]
  protected legs : int;

  public abstract Speak() : string;
}

class Dog : Animal
{
  public this()
  {
    legs = 4;
  }
  public override Speak() : string
  {
    "Bow wow";
  }
}

class Cat : Animal
{
  public this()
  {
    legs = 4;
  }
  public override Speak() : string
  {
    "Meow";
  }
}

class Human : Animal
{
  public this()
  {
    legs = 2;
  }
  public override Speak() : string
  {
    "Hello";
  }
}

def dog : Animal = Dog();
WriteLine("[Dog]");
WriteLine(String.Format("legs number is {0}", dog.Legs));
WriteLine(dog.Speak());

def cat : Animal = Cat();
WriteLine("[Cat]");
WriteLine(String.Format("legs number is {0}", cat.Legs));
WriteLine(cat.Speak());

def human : Animal = Human();
WriteLine("[Human]");
WriteLine(String.Format("legs number is {0}", human.Legs));
WriteLine(human.Speak());

Excercise 3

これは問題に出てくる以下のサイト
http://nemerle.org/~malekith/temp/chasing.n
がリンク切れになっていて回答不能です.