Nemerle のブロック


整数リストの中に平方数が含まれるか,というお題を Nemerle で 3 通りの方法で書いてみました。

using System.Math;
using Nemerle.Imperative;

def isSquare(x : int)
{
   Sqrt(x) % 1 == 0;
}

def squareAnyFunctional(values)
{
   match (values)
   {
      | [] => false;
      | x :: xs => if (isSquare(x)) true
                   else squareAnyFunctional(xs);
   }
}

def squareAnyProcedural(values)
{
   foreach (x in values)
   {
      when (isSquare(x))
      {
         return true;
      }
   }
   false;
}

def squareAnyLabeledBlock(values)
{
   ret:
   {
      foreach (x in values)
      {
         when (isSquare(x))
         {
            ret(true);
         }
      }
      false;
   }
}

squareAnyFunctional はパターンマッチングによる関数型的な書き方, squareAnyProcedural は普通の手続き型的な書き方です。 Nemerle 的に面白いのは 3 つ目の squareAnyBlock でしょう。ブロックにラベルを付けて,そのラベル付きブロックが返す値が何であるかを明示的に示すことが可能です。やっていることは手続き型的書き方と変わりませんが,ブロックが値を持つということを意識して書くことができるのが良いと思います。