作者: Hiroshi Shinohara
日時: 2003/8/30(00:18)
Iconミニ講座 あまり(procedure構成)

 ライブラリ整理の際、ちょっと遊んでみましたので、ご参考に。
 テーブルをリストの要素で参照する procedureの3つの例です。
-----^ PROC01.ICN ( date:03-08-29 time:23:38 ) -------------<cut here
####################
# テーブル参照プログラム例
####################
# proc01.icn Rev.1.1 2003/08/29 windy 風つかい H.S.
# TS Network TSfree
# This file is in the public domain.
procedure main()
  T := table()                                     # table生成
  T["a"] := "AA" ; T["b"] := "BB" ; T["c"] := "CC" # データ登録
        # ↓データ1  # ↓データ2
  L := [["a","b","c"],["a","d","c"]]               # テストデータ

  # procedure のテスト procedureを引数にして、procedureを呼ぶ。
  test(tbl_ref1,T,L)
  test(tbl_ref2,T,L)
  test(tbl_ref3,T,L)

end

# procedureのテスト
# arg [1]: procedure
#     [2]: table  テスト用 table
#     [3]: list   テスト用 list
procedure test(prcdr,T,L)
  write(image(prcdr))               # procedure名
  every L1 := !L do {               # テスト用 listからデータを取り出して
    every writes(" ",!L1)           # 書き出し
    writes(" -> ")
    L2 := prcdr(T,L1) | ["error"]   # 処理結果
    every writes(" ",!L2)           # 処理結果書き出し
    write()
  }
  write("----- ----- -----")        # 仕切線
end

###################
# Table参照し、結果を list連結
###################
# arg [1]: table  key -> value
#     [2]: list   参照する要素の list  例:["abc","def",...]
# value  : list   table参照結果を格納  例:["ABC","DEF",...]
# Usage  : L := tbl_ref(T,L)
# args[2]の 要素のいずれかが tableに存在しなければ、fail
# 条件が全て揃った場合だけ結果を返す(いずれかの条件が成立しなかった場合は、
# 全体を failさせる。)には、その部分を procedureにすること。

# 再帰
procedure tbl_ref1(T,L)  # ↓ \xは存在すればその値、なければ fail
  return if *L = 1 then [ \T[ L[1] ] ] #←listの最後なら再帰終了
                   else [ \T[ L[1] ] ]     |||   tbl_ref1(T,L[2:0])
end                           # listの連結 ↑    ↑最後でなければ、再帰

# every 
procedure tbl_ref2(T,L)  # <- この辺が分かりやすいかな。
  L1 := []
  every x := !L do put(L1,\T[x]) | fail  # いずれか辞書になければ、fail
  return L1
end

# whileループ
procedure tbl_ref3(T,L)
  L1 := []
  while x := get(L) do put(L1,\T[x]) | fail # いずれか辞書になければ、fail
  return L1
end
-----$ PROC01.ICN ( lines:65 words:234 ) -------------------<cut here

 動かすとこんな風です。
-----^ PROC01 ( date:03-08-29 time:23:38 ) -----------------<cut here
procedure tbl_ref1
 a b c ->  AA BB CC
 a d c ->  error
----- ----- -----
procedure tbl_ref2
 a b c ->  AA BB CC
 a d c ->  error
----- ----- -----
procedure tbl_ref3
 a b c ->  AA BB CC
 a d c ->  error
----- ----- -----
-----$ PROC01 ( lines:12 words:51 ) ------------------------<cut here

風つかい(hshinoh@...)
IconのWWWは、  http://www.cs.arizona.edu/icon/
UniconのWWWは、http://unicon.sourceforge.net/index.html
BGM: for Masqurade / 山見慶子