エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

どれかと一致する・補遺

Haskellで書いてみたり…

data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec deriving Eq

foo m = if elem m [Jan, Mar, May, Jul, Aug, Oct, Dec]
          then putStrLn "odd month"
          else putStrLn "even month"

Pascalで書いてみたり…

type
  TMonth = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);

procedure Foo(month: TMonth);
begin
  if month in [Jan, Mar, May, Jul, Aug, Oct, Dec] then
    Writeln('大の月')
  else
    Writeln('小の月')
end;

…しているうちに、配列を使ってもいいのなら別解があることに気がつきました。

配列に同じものが含まれる場合に真を返す関数。第2引数に配列を受け取るのがポイント。

template<typename T, int N>
bool equalsEither(T x, const T (&a)[N])
{
    for(int i = 0; i < N; ++i)
    {
        if(x == a[i])
        {
            return true;
        }
    }
    return false;
}

C++では式の中で要素を並べて配列にするようなことができないので、式の外で配列を定義する必要があるという差がありますが。

#include <iostream>

enum Month
{
    Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
};

void foo(Month month)
{
    const Month oddMonths[] = { Jan, Mar, May, Jul, Aug, Oct, Dec };

    if(equalsEither(month, oddMonths))
    {
        std::cout << "大の月" << std::endl;
    }
    else
    {
        std::cout << "小の月" << std::endl;
    }
}

追記:さかのぼること半年前…

わー。半年前にも同じことしているよ。これとかこれとかこれとか。進歩してるんだか、してないんだか。