作者: Hiroshi Shinohara
日時: 2003/8/30(11:50)
 風つかいです。

藤岡さん>  よくわからない部分があります。「辞書に既に要素があってそれに追加する場
藤岡さん> 合」とはどのような場合なのでしょうか。
藤岡さん>
藤岡さん>  同一のキーに複数の値があるというか、リストを対応させているということな
藤岡さん> のでしょうか。しかし、リストの中にその値があるかどうかについても判定する
藤岡さん> 必要がありそうな気がしますが・・・

 分かりにくい書き方で済みません。
 辞書 tableには、例えば key:"abc" に対応した 値として、ソートして小文字化すると
"abc"となる単語を登録します。 そういう単語は複数ある可能性がありますので、
key:"abc"に対応する 値は listとして、その中に 順次追加していきます。

  <1>最初 値に "ABC"を追加 key:"abc" -> ["ABC"] としたい。
    ・・・key:"abc"が無い状態から追加

  <2>次は 値に "BcA"を追加 key:"abc" -> ["ABC","BcA"] としたい。 
    ・・・既に key:"abc"に対応する要素 "ABC"があって更に "BcA"を追加

 <1>の状態(key:"abc"が無い状態)で、key:"abc"の値に listがあるつもりで
<2>と同じやり方で、単語を追加しようと listへの追加処理をすると、該当する
 keyが無いということで、エラーが発生します。

     put(T_dic[s_word],word) は、エラーが発生。
     (ランタイムエラー:存在しない値(&null)にアクセスしようとした。)

(補足:listの追加処理で、追加先の listが無いというエラーも発生する条件だが、
 tableの keyが無いというエラーが先だと思います。)

 <2>の状態なら key:"abc"は存在して、値には list ["ABC"]が存在していますので、
  このlistへの追加処理で単語が追加できます。
     put(T_dic[s_word],word) で、単語が追加できる。

 <1>の状態(key:"abc"が無い状態)で値に単語を追加する場合は、
     T_dic["abc"] := ["ABC"]で、 key:"abc"の値に要素数1の listをセット
しなければいけません。

 この<1>と<2>処理の違いを if..then..else..で分けていたという意味でした。

 さて、(key:"abc"が無い状態)をチェックするには、member(T_dic,"abc")で
できますが、実際に key:"abc"で tableにアクセス(T_dic["abc"])してエラーが
発生するかどうかでもチェックできます。

 でも、ランタイムエラーが発生するとプログラムが止まってしまいます。

 それでは困るのですが、Iconには、存在しない(&null)かどうかを判定する仕掛け
があります。
 \T_dic["abc"] は、存在すれば key:"abc"に対応する T_dicの値を、
          存在しなければ、&fail(エラー状態)となり、
 ランタイムエラーにはなりません。

(key:"abc"が無い状態)で、
   put(T_dic["abc"],word)は、ランタイムエラーを発生しますが、
   put(\T_dic[["abc"],word)は、ランタイムエラーを発生せず failして、
   値は、&failとなります。

    put(\T_dic[s_word],word) | (T_dic[s_word] := [word]) としておくと
      "|"の左辺が &failとなった場合は、右辺の式が生きてきますので、
   (T_dic[s_word] := [word])が実行されます。

 補足説明になりましたでしょうか?

藤岡和夫さんから
>毎度ご苦労様です。
>
>On Sat, 30 Aug 2003 00:16:56 +0900
>Hiroshi Shinohara <hshinoh@...> さんwrote:
>
>>       if member(T_dic,s_word)            # 辞書テーブルにあるかチェック
>>       then  put(T_dic[s_word],    word)  # あれば、その listに追加
>>       else      T_dic[s_word] := [word]  # 無ければ、listに入れて登録
>>  という部分があります。 よくある if .. then .. else .. で、辞書に既に 要素が
>> あってそれに追加する場合と、keyが無くて新たに 要素を追加するケースで、異なる
>> 処理をしています。これは、
>
> よくわからない部分があります。「辞書に既に要素があってそれに追加する場
>合」とはどのような場合なのでしょうか。
>
> 同一のキーに複数の値があるというか、リストを対応させているということな
>のでしょうか。しかし、リストの中にその値があるかどうかについても判定する
>必要がありそうな気がしますが・・・
>
>藤岡 和夫
>FGALTS@...
>kazuf@...
>TS Networkのために http://homepage1.nifty.com/kazuf/
-------------------------------------------------------
風つかい(hshinoh@...)
IconのWWWは、http://www.cs.arizona.edu/icon/
UniconのWWWは、http://unicon.sourceforge.net/index.html
BGM: Round Midnight / 杉本喜代志