Concurrent Clean: 局所関数定義

こういうのはありらしい。へー。

Start w
    # (f,w) = stdio w
      f = let foo True f # f = fwrites "Hello " f
                           f = fwrites "World\n" f
                         = f
              foo False f = f
              bar n f | n > 0  = fwrites "greater\n" f
                      | n == 0 = fwrites "equal\n" f
                               = fwrites "less\n" f
          in case f of
               f # f = foo False f
                   f = bar -1 f
                   f = fwrites "----\n" f
                 = f
      (_,w) = fclose f w
    = w

同じことは、これでもよい。今回の目的には、こっちの方がよさそう。
ところで、withのインデントルールってちょっとよくわからないんだよなー。

Start w
    # (f,w) = stdio w
      f = case f of
            f # f = foo False f
                f = bar -1 f
                f = fwrites "----\n" f
              = f
          with
            foo True f # f = fwrites "Hello " f
                         f = fwrites "World\n" f
                       = f
            foo False f = f
            bar n f | n > 0  = fwrites "greater\n" f
                    | n == 0 = fwrites "equal\n" f
                             = fwrites "less\n" f
      (_,w) = fclose f w
    = w