整数リストの中に平方数が含まれるか,というお題を 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
でしょう。ブロックにラベルを付けて,そのラベル付きブロックが返す値が何であるかを明示的に示すことが可能です。やっていることは手続き型的書き方と変わりませんが,ブロックが値を持つということを意識して書くことができるのが良いと思います。