金木犀も当地では散り始め、また一段と秋が深まっていきます。
夏の盛りの 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 / 杉本喜代志