風つかいです。
藤岡さん> よくわからない部分があります。「辞書に既に要素があってそれに追加する場
藤岡さん> 合」とはどのような場合なのでしょうか。
藤岡さん>
藤岡さん> 同一のキーに複数の値があるというか、リストを対応させているということな
藤岡さん> のでしょうか。しかし、リストの中にその値があるかどうかについても判定する
藤岡さん> 必要がありそうな気がしますが・・・
分かりにくい書き方で済みません。
辞書 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 / 杉本喜代志