return/break

投票の結果が反映され、return/breakに相当するものがサポートされました。

using System;
using Nemerle.Block;

module M {
  Equals (lhs : array [int], rhs : array [int]) : bool {
    block (return) {
      when (lhs.Length != rhs.Length)
        return (false);
      for (mutable i = 0; i < lhs.Length; ++i)
        when (lhs [i] != rhs [i])
          return (false);
      true;
    }
  }

  Find (arr : array [int], val : int) : bool {
    mutable i = 0;

    block (break) {
      for (i = 0; i < arr.Length; ++i)
        when (arr [i] == val)
          break ();
    }
    i != arr.Length;
  }

  Main () : void {
    Console.WriteLine (Equals (array [10, 20, 30], array [10, 20, 40]));
    Console.WriteLine (Find (array [10, 20, 30], 30));
  }
}

/*
 False
 True
 */

blockの引数が脱出用のキーワードになっています。例ではreturn/breakを使いましたが、何でも良いです。

ただ、これで確定ではないようで、こんな案も出ています。個人的には

label: { ... label (xxx) }

だと、vimの自動インデントが使いにくくなるので嫌かなぁ・・・と、私的な都合を言ってみたり。(^^;