作者: Hiroshi Shinohara
日時: 2003/10/09(20:08)
  金木犀も当地では散り始め、また一段と秋が深まっていきます。
  夏の盛りの Iconミニ講座からちょっと時間が空きましたので、リハビリを兼ねて
少し Iconの話題を。

  プログラムを組んでいて、複数の条件のアンドを取ったり、条件が成立するかどうか
によって複数の処理に分岐することはよくあります。
  ループ処理と分岐処理はプログラムの基本ですので、この辺は、言語ごとに、大体は
似たような構文が用意されています。
  アンド条件処理と分岐(選択)の処理について、Iconでは、どういう構文があるかな
と簡単な例で考えてみました。

  まず、アンド条件処理について。数があって(例では、0〜4)について、0 < n < 4 
かつ 奇数ならば出力するという例です。

-----^ AND.ICN ( date:03-10-09 time:19:52 ) ----------------<cut here
####################
# AND条件式の例
####################
# and.icn Rev.1.1 2003/10/09 風つかい
# 0 < n < 4 かつ 奇数 を選ぶ
# This file is in the public domain.

procedure main()
  L_test := [0,1,2,3,4] # テスト用データ(リスト)を生成
  S_ref  := set([1,3])  # テスト用参照データ(セット)を作成(要素は 1と 3)

  every n := !L_test do {    # リストから順次取り出して、

    # 1) if then で条件を絞る
    if 0 < n then if n < 4 then if n % 2 = 1 then writes("1: ",n)

    # 2) if の中の &で条件を絞る
    if (0 < n) & (n < 4) & (n % 2 = 1) then writes("  2: ",n)

    # 3) 全部 &で条件を取る
    (0 < n) & (n < 4) & (n % 2 = 1) & writes("  3: ",n)

    # 4) 括弧式で &条件を取る (括弧内の全ての項が成功すれば、全体が成功)
    (0 < n,n < 4,n % 2 = 1,writes("  4: ",n))

    # 5) 括弧式で &条件を取る (writeの引数内で条件を取る)
                                       # ↓指定がなければ、最後の項の値を取る
    writes("  5: ",(0 < n,n < 4,n % 2 = 1,n))

    # 6) 括弧式で &条件を取る (writeの引数内で条件を取り、括弧式の値を指定)
                # ↓ 括弧の値として、1番目の式の値を指定
    writes("  6: ",1(0 < n,n < 4,n % 2 = 1))
                     # ↑比較式は成功すれば、右辺の値を取る

    # 7) セット(集合)の要素かどうかで条件を取る
    write( "  7: ",member(S_ref,n))
                  # ↑nが S_refのメンバーなら成功し、値は nとなる。
  }
end
-----$ AND.ICN ( lines:39 words:184 ) ----------------------<cut here

  3)〜6)あたりが Icon風のやり方でしょうか? 実際は、1)〜7)のどれが簡潔で
分かりやすいかで、選ぶことになります。

  動作結果は、どれも同じで面白みはありませんが。
-----^ AND.1 ( date:03-10-09 time:19:57 ) ------------------<cut here
1: 1  2: 1  3: 1  4: 1  5: 1  6: 1  7: 1
1: 3  2: 3  3: 3  4: 3  5: 3  6: 3  7: 3
-----$ AND.1 ( lines:2 words:28 ) --------------------------<cut here

  次は、分岐処理の例です。数の値の範囲によって処理を分けています。

-----^ OR.ICN ( date:03-10-09 time:19:53 ) -----------------<cut here
####################
# 選択条件式の例
####################
# or.icn Rev.1.1 2003/10/09 風つかい
# 数の値の範囲により処理を変更
# This file is in the public domain.

procedure main()
  L_test := [0,1,2,3,4]        # テスト用データ(リスト)を生成
  T_ref  := table()            # テスト用参照テーブルを生成
  # テーブルデータセット
  T_ref[0] := "Lo"
  T_ref[1] := T_ref[2] := T_ref[3] := "OK"
  T_ref[4] := "Hi"

  every n := !L_test do {      # リストから数を順次取り出して、

    # 1) if then elseによる選択
    if      n < 1 then   writes("Lo:1 ",n)
    else if n > 3 then   writes("Hi:1 ",n)
                  else   writes("OK:1 ",n)

    # 2) case による選択
    case n of {
      0 :              writes("  Lo:3 ",n)
      1 | 2 | 3 :      writes("  OK:3 ",n)
      4 :              writes("  Hi:3 ",n)
    }

    # 3) if then elseによる選択 (writeの引数内での選択)
    writes(if      n < 1 then "  Lo:2 " || n
           else if n > 3 then "  Hi:2 " || n
                         else "  OK:2 " || n )
                                      # ↑文字列の連結

    # 4) case による選択 (writeの引数内での選択)
    writes(case n of {
        0 :                   "  Lo:4 " || n
        1 | 2 | 3 :           "  OK:4 " || n
        4 :                   "  Hi:4 " || n
    } )

    # 5) 選択式 expr1 | expr2 | ...による選択 (括弧式使用)
                (n < 1,writes("  Lo:5 ",n)) |
                (n > 3,writes("  Hi:5 ",n)) |
                       writes("  OK:5 ",n)

    # 6) 選択式 expr1 | expr2 | ...による選択 (writeの引数内で 条件付け)
                       writes("  Lo:6 ",1 > n) |
                       writes("  Hi:6 ",3 < n) |
                       writes("  OK:6 ",n)

    # 7) 選択式 expr1 | expr2 | ...による選択 (writeの引数内での選択)
                      writes(("  Lo:7 " || (1 > n)) |
                             ("  Hi:7 " || (3 < n)) |
                             ("  OK:7 " || n) )

    # 8) table参照による選択
                 write("  ",\T_ref[n],":8 ",n)
                          # ↑テーブル T_refに nが keyとして存在すれば
  }
end
-----$ OR.ICN ( lines:62 words:270 ) -----------------------<cut here

  3)〜7)あたりが Icon風のやり方でしょうか?

  動作結果は、こんな風です。
-----^ OR.1 ( date:03-10-09 time:19:55 ) -------------------<cut here
Lo:1 0  Lo:3 0  Lo:2 0  Lo:4 0  Lo:5 0  Lo:6 0  Lo:7 0  Lo:8 0
OK:1 1  OK:3 1  OK:2 1  OK:4 1  OK:5 1  OK:6 1  OK:7 1  OK:8 1
OK:1 2  OK:3 2  OK:2 2  OK:4 2  OK:5 2  OK:6 2  OK:7 2  OK:8 2
OK:1 3  OK:3 3  OK:2 3  OK:4 3  OK:5 3  OK:6 3  OK:7 3  OK:8 3
Hi:1 4  Hi:3 4  Hi:2 4  Hi:4 4  Hi:5 4  Hi:6 4  Hi:7 4  Hi:8 4
-----$ OR.1 ( lines:5 words:80 ) ---------------------------<cut here

  Iconは、色々と面白い構文が使えます。お試し頂けるとうれしいです。

風つかい(hshinoh@...)
IconのWWWは、  http://www.cs.arizona.edu/icon/
UniconのWWWは、http://unicon.sourceforge.net/index.html
BGM: Sweet Jazzy / 杉本喜代志