Rev.02 1997/04/23 風つかい Rev.01 1997/03/22 風つかい ■ Icon > Icon日記(1) はじめに 風つかい Iconは AWKや Perlの仲間のテキスト処理言語です。Iconはデータ構造や制御構造 が豊富で、もっと使われてよい言語と思います。 しかし、未だ日本語の入門書がありませんので、 AWKについて、ある程度の知識を お持ちになっている方を対象として、入門講座を書きました。 この Icon日記はその続編として、その後作ったプログラムや Icon入門講座で書き 落としたところを解説したものを、まとめたものです。 Icon入門講座といっしょにご覧になって Iconを使って頂けるとうれしいです。 Iconのプログラムおよびライブラリーは、次のところから入手できます。 http://www.cs.arizona.edu/icon/index.html Iconは PDSですので、この入門講座も同じ扱いとします。(転載・編集自由) (This textbook is in the public domain.) 目次 (1)はじめに (2)ファイル分割 (3)linkって賢い (4)除夜の鐘なんぞを (5)top.icn (6)横のものを縦に(1) (7)横のものを縦に(2) (8)横のものを縦に(3) (9)suspend/generator (10)sort (11)Icon in Java (12)NURSE.ICN (13)Wicon ベータ7 (14)dump.icn (15)再びIconの特徴 (16)Recursive generator (17)文字の組み合わせ(1) (18)文字の組み合わせ(2) (19)文字の組み合わせ(3) (20)シフトJIS処理(1) (21)シフトJIS処理(2) (22)シフトJIS処理(3) (23)Backtracking (24)Generator (25)5クイーン(1) (26)5クイーン(2) (27)Wicon ベータ8 (28)idump2.icn (29)Record (30)むすび 風つかい (TRA11936@biglobe.ne.jp/PFF01531@niftyserve.or.jp) < IconのWWWは、http://www.cs.arizona.edu/icon/index.html> BGM: ロング・バージョン/稲垣潤一 (icon_127.txt 1997/03/19 PCVAN PIG) ■ Icon > Icon日記(2) ファイル分割 風つかい HDDの容量が少なくなってきましたので、ログファイルをFDへセーブしようと 思いましたら、2Mのログファイルがありました。 エディターで分割するのも疲れるということで、適当な区切り文字のところで分割 するプログラムを作りました。 fsplit van1023.log #2500 とかやると、van1023.log を、行の先頭が "#2500"のところで分割して、van1023.001 と van1023.002 に分けてくれます。 fsplit fsplit.icn procedure とかやると、fsplit.icn を、procedure毎に区切って、fsplit.001 と fsplit.002 に 分けてくれます。 -----^ FSPLIT.ICN ( date:96-12-23 time:10:32 ) ------------- (icon100.txt 1996/12/23 PCVAN PIG) ■ Icon > Icon日記(3) linkって賢い。 風つかい 今年は年末・年始に休めるので、日頃やっていないHDDのバックアップとかIconで あやふやな理解しかしていない所とかを色々試してみたりしたいな〜と思っています。 HDDって結構飛びますね〜。年1回は飛ばしています。 でも、その頃には容量不足を感じていますので修理には出さず、大きな容量のものに 買い換えてしまいます。それと、修理期間を待っていられないということもあります。 中毒だな。もうこりゃ。 アル中、ヤニ中、パソ中か。 長生きしないな〜。 さて、Iconのコンパイラー(icont.exe)には、モジュール分割支援のために、linkと いう機能があります。 つぎのように、test02.icn を linkする test01.icn があるとします。 test02.icnを予め、icont -c test02.icn にて、コンパイルしておいて test01.icnを、icont test01.icn によりコンパイルすると、test02.icn がlinkされた、test01.exe ができあがります。 test01.icn ------------------- |link test02 | ----------> test02.icn |procedure main() | -------------------- | ... | ----> |procedure test02(s) | | test02("AAA") | ----- | ... | | ... | | return ... | |end | |end | ------------------- -------------------- -----^ TEST01.ICN ( date:96-12-28 time:11:26 ) ------------- test04.icn | procedure main()| -------------------- | ... | |link test05,test06 | ----> test05.icn | ... | -------------------- | ------------------- | tst01("ABC") | -------------------------> | |procedure tst01(s) | | ... | | | ... | | tst02("DEF") | ------------------- | | return ... | | ... | | | |end | | tst03("GHI") | ------------- | | | | | ... | | -----> | |procedure tst02(s) | | end | | | | ... | ----------------- | | | return ... | | | |end | | | ------------------- | | | -> test06.icn | ------------------- -----------> |procedure tst03(s) | | ... | | return ... | |end | ------------------- mainが含まれるファイルです。 -----^ TEST03.ICN ( date:96-12-28 time:12:50 ) ------------- BGM: 熱くなれ/大黒摩季 BGD: 茉莉花茶 BGS: Mild Seven Menthol (icon_101.txt 1996/12/28 PCVAN PIG) ■ Icon > Icon日記(4) 除夜の鐘なんぞを 風つかい 年末・年始の休みに入りましたので、日頃さぼっているHDDのバックアップを やりかけていましたが、ついこんなものを思い付いたりして、全然進みません。 -----^ JOYA.ICN ( date:96-12-29 time:11:43 ) --------------- 0 do { writes("煩悩はあと",right(n1,3),"個 ") s1 ? { while s2 := move(2) do { # 鐘の音 delay(100) writes(s2) } } write() delay(500) # 余韻 n1 -:= 1 # 煩悩を1つ消す。 } write() write("★★★★★ あけましておめでとうございます。 ★★★★★") end -----$ JOYA.ICN ( lines:27 words:65 ) ---------------------- BGM: なし BGD: 日本盛 BGS: Mild Seven Menthol (icon_102.txt 1996/12/28 PCVAN PIG, 1996/12/29 niftyserve FPL) ■ Icon > Icon日記(5) top.icn 風つかい HDDのバックアップをやっと済ませたところで、今年も暮れていきます。 バックアップ用FDがだいぶたまってきましたので、整理箱を近所のスーパーで捜し てみました。 文房具コーナーに「TVゲームソフトかたづけBOX」というのが売っていましたの で買いました。 ちょうど3.5インチのFDにサイズが合いましてなかなかいいです。 100枚位をまとめてしまっておけます。 500円でおつりがきました。 さて、Icon講座の中のプログラムに、top_get.icn top_cut.icn というのがありま す。 これは、ファイル名から拡張子を除いた部分を作ったり、パスつきファイル名 から、パスの部分を除いたりするために使っています。 Icon のライブラリー(bipl)の中にもそういう処理をおこなう procedureがあるの ですが、top_get.icn top_cut.icn を作った当時は、未だ biplのにどんな procedure が入っているのか知らなかったので、自前で作ってしまいました。 Icon講座を読みなおしてみますと、どうもこの procedureがひっかかります。 今ならこうは作らないだろうなということで、もう一度考えてみました。 当初のプログラムは、次のようになっています。 -----^ TOP2.ICN ( date:96-12-01 time:22:30 ) --------------- BGM: なし BGD: ジャスミン・ティー BGS: Mild Seven Menthol (icon_103.txt 1996/12/31 PCVAN PIG) ■ Icon > Icon日記(6) 横のものを縦に(1) 風つかい 明けましておめでとうございます。 横浜方面は、晴れて暖かい新年を迎えており ます。 今年もよろしくお願いいたします。 さて、「縦のものを横にもしない。」 というのは、いつもかみさんから言われて いる言葉ですが、今年も言われっぱなしになろうと、新年の誓いを新たにしたところ です。 さて、昨年に Iconの紹介のために、会議室のタイトルリストファイル(PCVANのTL コマンド結果をファイルに落としたもの)から、月別書込み数の棒グラフを作成する プログラムをアップロードしました。 ちなみに、テキストデータ処理会議室の96/12月までの結果は次のようになり ます。 -----^ TL9612.H ( date:97-03-20 time:23:15 ) --------------- BGM: 愛の言霊/サザンオールスターズ BGD: ジャスミン・ティー BGS: Mild Seven Menthol (icon_104.txt 1997/01/02 PCVAN PIG) ■ Icon > Icon日記(7) 横のものを縦に(2) 風つかい 昨年に作成した、PCVANの書き込みタイトルから月別書き込み数グラフを 作るプログラムです。 -----^ VPOS2GH.ICN ( date:97-01-02 time:23:14 ) ------------ Icon日記 top.icnを改版 風つかい # 定数定義 Usage := "Usage: vpos2gh title_list" c_mark := "*" n_size := 3 # 月別書込み数カウントの桁数 step := 2 # グラフの刻み(マーク1個で何個分を示すか) mark := 5 # 目盛りの刻み(目盛りをマーク何個毎に出すか) mark_max := 12 # 最大目盛り (=目盛りの数) graph_max := (mark_max +1) * mark -1 # マークの数の最大 # タイトルリストファイルをオープン。コマンドラインの引数の1番目をファイル # 名としてファイルオープン。引数の数が1以外またはファイルオープンできなけ # ればストップ。 if *args = 1 then dir := open(args[1]) | stop("cannot open ",args[1]) else stop(Usage) # 書込み数テーブルを生成(初期値:0):awkの連想配列相当 Tyearmonth := table(0) # テーブルに書込み数の足し込み # key:YYMM(年月), value:number of posting(書込み数) while line := read(dir) do { # ファイルから1行ずつ line へ読み込み if chr_chk(' /' ++ &digits,line[1:15]) # タイトル行チェック # 行データの文字列から年月部分を取り出して、スペースは0に置換して # 年月データを作成しテーブルのキーとし、対応する値を+1 then Tyearmonth[map(line[7:9] || line[10:12]," ","0")] +:= 1 } # テーブルをキーでソートし、キー、値、キー、値、...と連なったリストを # 生成。 この場合は年月、書込み数、年月、書込み数、... Lyearmonth := sort(Tyearmonth,3) # 歯抜け月(書込みが無かった月)検出用の年月データ初期値セット。 # リストのトップのデータから1と月分減らした年月をセット。 YYMM_old := dec_month(Lyearmonth[1]) # グラフのタイトルを出力 write("月別書き込み数グラフ") # タイトル上段のはじめの部分を出力 writes(" 書込 ",repl(" ",mark -1)) # repl:文字列のくり返し # ここでは、" "を(mark-1)個 # 目盛り生成 目盛りにつける数を計算し、左寄せ桁あわせをおこない出力 # 目盛りの1番目から最大目盛りまでおこなう。 every writes(left(step * mark * (1 to mark_max),mark)) write() # 改行出力 # タイトル下段のはじめの部分出力 writes( " 月 件数 ") # " |"を目盛り数ぶん出力 every 1 to mark_max do { writes(repl(" ",mark -1), "|") } write() # グラフデータ書き出し while YYMM := get(Lyearmonth) do { # リストから順次取り出し # 歯抜け月検出および歯抜け月データ(書込み0データ)出力 # 直前の処理データ(YYMM_old)に+1月した値と、今取り出したデータを比較。 # 一致しなければ、直前のデータへ+1月した月のデータ(書込み無し)を # 出力。 ↓文字列の(不)一致比較 while (YYMM_next := inc_month(YYMM_old)) ~== YYMM do { write(YYMM_next," ",right("0",n_size)) # 書込み数 0のデータ出力 YYMM_old := YYMM_next # YYMM_oldを更新 } # リストから取り出したデータによりデータ出力 # 先に取り出していた年月と書込み数と書込み数に対応した数の c_markを出力 # YYMM_oldも更新。 write(YYMM," ",right(n := get(Lyearmonth),n_size)," ", trim(left(repl(c_mark,integer(n/step)),graph_max))) YYMM_old := YYMM } end -----$ VPOS2GH.ICN ( lines:84 words:262 ) ------------------ (pcv1013.txt 1996/10/13 PCVAN PIG) ■ Icon > Icon日記(8) 横のものを縦に(3) 風つかい 縦棒グラフ作成のプログラムです。 前半は、横棒グラフのプログラムと殆ど 同じです。 # グラフデータ書き出し というコメントあたりが2重リストへの格納処理で、 # グラフを描く というコメントあたりからがその出力処理となっています。 -----^ VPOS2GV.ICN ( date:97-01-02 time:18:04 ) ------------ Icon日記 top.icnを改版 風つかい # 定数定義 Usage := "Usage: vpos2gv title_list" c_mark := "*" # 棒グラフ用文字 c_wall := "-" # 仕切り線用文字 n_size := 3 # 月別書込み数カウントの桁数 step := 5 # グラフの刻み(マーク1個で何個分を示すか) mark := 2 # 目盛りの刻み(目盛りをマーク何個毎に出すか) mark_max := 12 # 最大目盛り (=目盛りの数) graph_max := (mark_max +1) * mark -1 YYMM_size := 4 # 年月データサイズ mark_size := 4 # 目盛り欄サイズ sep_size := 1 # 目盛り欄とデータ欄の境の空きサイズ title := "月別書き込み数グラフ" # グラフタイトル s_post := ["月書","別込"," 数"] # 書込み数のタイトル s_YYMM := [" 年 "," "," 月 "," "] # 年月欄のタイトル # タイトルリストファイルをオープン。コマンドラインの引数の1番目をファイル # 名としてファイルオープン。引数の数が1以外またはファイルオープンできなけ # ればストップ。 if *args = 1 then dir := open(args[1]) | stop("cannot open ",args[1]) else stop(Usage) # 書込み数テーブルを生成(初期値:0) Tyearmonth := table(0) # テーブルに書込み数の足し込み # key:YYMM(年月), value:number of posting(書込み数) while line := read(dir) do { # ファイルから1行ずつ line へ読み込み if chr_chk(' /' ++ &digits,line[1:15]) # タイトル行かどうかのチェック # 行データの文字列から年月部分を取り出して、スペースは"0"に置換して # 年月データを作成し、テーブルのキーとし、対応する値を+1 then Tyearmonth[map(line[7:9] || line[10:12]," ","0")] +:= 1 } # テーブルをキーでソートし、キー、値、キー、値、...と連なったリストを # 生成。 この場合は年月、書込み数、年月、書込み数、... Lyearmonth := sort(Tyearmonth,3) # 歯抜け月(書込みが無かった月)検出用の年月データ初期値セット。 # リストのトップのデータから1と月分減らした年月をセット。 YYMM_old := dec_month(Lyearmonth[1]) # グラフデータ書き出し用リスト生成 Lgraph := [[],[],[]] # 年月、書き込み数、グラフデータ # グラフデータ書き出し while YYMM := get(Lyearmonth) do{ # リストから順次取り出し # 歯抜け月検出および歯抜け月データ(書込み0データ) # 直前の処理データ(YYMM_old)に+1月した値と、今取り出したデータを比較。 # 一致しなければ、直前のデータへ+1月した月のデータ(書込み無し)を # 格納。 ↓文字列の(不)一致比較 while (YYMM_next := inc_month(YYMM_old)) ~== YYMM do { # 書込み数 0の月のデータ格納。 put(Lgraph[1],YYMM_next) # 年月 put(Lgraph[2],right(0,n_size)) # 書込み数 put(Lgraph[3],left(" ",graph_max)) # グラフデータ YYMM_old := YYMM_next # YYMM_oldを更新 } # 書き込み数リストから取り出したデータによりグラフデータを生成。 # 先に取り出していた年月と書込み数と書込み数に対応した数の c_markを格納 # YYMM_oldも更新。 put(Lgraph[1],YYMM) put(Lgraph[2],right(n := get(Lyearmonth),n_size)) put(Lgraph[3],left(repl(c_mark,integer(n/step)),graph_max)) YYMM_old := YYMM } # グラフを描く write(title) # グラフデータ部出力 every i := graph_max to 1 by -1 do { # 月毎データの末尾から出力 # 目盛りの1行分を出力 if (i % mark) = 0 then writes(right(i * step,mark_size -1),c_wall) else writes(repl(" ",mark_size)) writes(repl(" ",sep_size)) # 棒グラフの1行分を出力 every j := 1 to *Lgraph[3] do writes(Lgraph[3][j][i]) # 全ての月につき行う write() } write(repl(c_wall,mark_size + sep_size + *Lgraph[1])) # 仕切り線 # 書込み数データ部出力 every i := 1 to n_size do { # 書込み数行につき writes(s_post[i],repl(" ",sep_size)) # 目盛り欄文字出力 every j := 1 to *Lgraph[2] do writes(Lgraph[2][j][i]) # 全ての月につき行う write() } write(repl(c_wall,mark_size + sep_size + *Lgraph[1])) # 仕切り線 # 年月データ every i := 1 to YYMM_size do { # 年月行につき writes(s_YYMM[i],repl(" ",sep_size)) # 目盛り欄文字出力 every j := 1 to *Lgraph[1] do writes(Lgraph[1][j][i]) # 全ての月につき行う write() } end -----$ VPOS2GV.ICN ( lines:112 words:382 ) ----------------- BGM: 愛の言霊/サザンオールスターズ BGD: ジャスミン・ティー BGS: Mild Seven Menthol (icon_105.txt 1997/01/02 PCVAN PIG) ■ Icon > Icon日記(9) suspend/generator 風つかい 年明け早々風邪をひいてしまいまして、グスン・グスンとやっています。 年を取る毎に直りが遅くなってきます。20代は酒を呑んで1晩あければ大抵 直っていました。 30代は2〜3日、 40代になると、一度ひくと春まで 体のどこかに残っているみたいです。 さて、Icon入門講座では、suspend/generator のあたりは、私が使いこなせ ていませんので、説明が手抜きですが、多少の補足をしたいと思います。 まず、generatorのほうから。 generatorは、複数のデータを順に発生するものです。データが無くなると 通常failします。(failするように procedureを作ります。) generatorの例としては次のようなものがあります。 ・read(file) fileから(改行で区切られた)データを順に読み込み、そのデータを値 として持ちます。 ・式1 | 式2 | 式3 | ... "a1" | "a2" | "a3" というような表記ですが、generatorとして考える と、式1、式2、式3の値を順に発生するもの となります。 ・i to j by k (by k は省略可) 5 to 10 や 50 to 100 by 10 というような表記です。 数字を順に 発生します。 ・! !は、なんらかのデータ構造から順にデータを取り出すものです。 !"abcdefg" は文字列 "abcdefg"から、順に1文字づつ文字を取り出し ます。 !["a1","a2","a3"] はリストから、順に1要素づつ取り出します。 BIPLの中には、generatorを集めた gener.icn という procedureがあります。 その中から参考にいくつか示します。 procedure days() # 週の名前を順に出してくれるものです。 suspend "Sunday" | "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday" | "Saturday" end procedure hex() # 16進コードの文字列 00-ffを順に出してくれます。 suspend !"0123456789abcdef" || !"0123456789abcdef" end procedure months() # 月の名前を順に出してくれます。 suspend "January" | "February" | "March" | "April" | "May" | "June" | "July" | "August" | "September" | "October" | "November" | "December" end procedure octal() # 8進コードの文字列を 000-377を順に出してくれます。 suspend (0 to 3) || (0 to 7) || (0 to 7) end で、サンプルプログラムです。 -----^ GENER~.ICN ( date:97-01-15 time:21:57 ) ------------- BGM: Always/風の背中/篠原美也子 BGD: 小柴胡湯液(風邪薬です。ハイ) BGS: Mild Seven Menthol (icon_106.txt 1997/01/15 PCVAN PIG) ■ Icon > Icon日記(10) sort 風つかい アリゾナ大のWEBを眺めていましたら、学生さんのWEBコーナーがありました。 メニューに名前がずらっと並んでいます。 日本人みたいな名前がいくつかありましたので、入ってみましたらやっぱり日本から の留学生の方でした。結構いらっしゃるんですね。 関西の方で、関西弁講座(日本のコアラにあるもの。)にリンクを張っていらしゃる 方がいました。 発音例が聞けるようになっていて面白かったです。 こういう風に学生さんがWEBを作れると家族もアクセスできていいですね。親とし ては成績表も見れるといいんでしょうが。 まあ、声とか写真を載せられるというのは 便利だと思います。 さて、Windows-Iconの勉強が進んでいないもので、窓対応以外の部分の補足を相変わ らずやっていきます。 Iconでは、setや tableをソートすると、その後の処理がやりやすいように、listに 変換されます。 文字なら、アルファベット順、数字なら若番から順にソートされます。 で、逆順に ソートしたい場合は、ソートされたリストを後ろから順に使っていくというやり方にな ります。 アリゾナ大の Iconのドキュメントに、文章の中の単語を数え上げて、グラフィック 表示するプログラムの例がありましたので、グラフィックにする部分を除いたものを 次にあげます。 コメントで大体動作はおわかりいただけると思います。 実際は、バーグラフにする例になっているのですが、うまく動かせていないので今日 はその手前までにします。 -----^ CHUMP01C.ICN ( date:97-01-20 time:22:05 ) ----------- BGM: Good Friend/篠原美也子 BGD: 日本盛 BGS: Mild Seven Menthol (icon_107.txt 1997/01/20 PCVAN PIG) ■ Icon > Icon日記(11) Icon in Java 風つかい アリゾナ大の Iconサポートグループ icon-projectでは、定期的に The Icon News- letterを発行しています。 今は年2回発行されています。 以前は郵送配布でしたが、現在はWWWで見ることができます。46号からアリゾナ 大学のWWWに載っています。 現在の URLは以下の通りです。 http://www.cs.arizona.edu/icon/newsletter/inl.html にメニューがあります。 Icon Newsletter 51. December 1, 1996 Icon Newsletter 50. August 1, 1996 Icon Newsletter 49. April 1, 1996 Icon Newsletter 48. November 28, 1995 Icon Newsletter 47. July 15, 1995 Icon Newsletter 46. December 29, 1994 最新号は51号で、昨年12月の発行です。 http://www.cs.arizona.edu/icon/newsletter/inl51/inl51.html 目次は以下のようになっています。 Third Edition of The Icon Programming Language Graphics Programming Book Version 9.3 of Icon Version 9.3 of the Program Library New MS-DOS Implementation Icon in Java Teaching Icon Web Links Chicon Icon Programming Language の第3版の出版紹介とか、Graphic Programming Book の発行予告とかが載っています。 この中で、Icon in Java というのが興味を引きます。Iconは中間言語方式の言語で、 ・ソースプログラムをトランスレータで中間言語に翻訳し ・中間言語ファイルを解釈実行する。 というステップで動かします。 プラットフォーム(OS等)に応じたトランスレータ と中間言語実行ソフトを用意して、色んなプラットフォームで動作させます。 近頃、巷で噂の Javaも同じ考え方です。 で、 Javaも中間言語を持っていますので Iconが Javaの中間言語で動くようにすれば、Javaが動く環境なら Iconも動くようにで きる。 ということで、そのためのプロジェクトが発足したそうです。 年単位のプロジェクトと思いますので、リリース前に Javaがダージリンとかに取って 代わられていないように、願っていましょう。 風つかい (TRA11936@biglobe.ne.jp/PFF01531@niftyserve.or.jp) < IconのWWWは、http://www.cs.arizona.edu/icon/index.html > BGM: 海になりたい青/篠原美也子 BGD: ジャスミン・ティー BGS: Mild Seven Menthol (icon_108.txt 1997/01/26 PCVAN PIG) ■ Icon > Icon日記(12) NURSE.ICN 風つかい (PCVANのテキストデータ処理会議室で、コントロールコードが混じったテキス トファイルから、コントロールコードを除去するプログラムが、話題にでました。 その話題に関連して作ったものです。 NURSE.ICNという名前もそのテキストファイル の名前に由来しています。) Icon でもコントロールコード除去のプログラムを作らないといけない。 というこ とで、作ってみました。 テキストファイルしか扱った事が無かったので手こずりました。ファイルオープン のパラメータに注意しないといけないようです。 -----^ NURSE.ICN ( date:97-02-01 time:16:32 ) -------------- 'abcdef' # This file is in the public domain. local c, i c := '' # 空cset every i := ord(c1) to ord(c2) do c ++:= char(i) # cset足し込み # ↑キャラクタ番号関数 ↑キャラクタ番号→キャラクタ関数 return c end #テストデータ #procedure main() # write(c_ft('a','f')) # 'abcdef' # write(c_ft('0','5')) # '012345' #end -----$ C_FT.ICN ( lines:17 words:64 ) ---------------------- BGM: アンバランス/大黒摩季 BGD: 月桂冠 BGS: Mild Seven Menthol (icon_109.txt 1997/02/01 PCVAN PIG) ■ Icon > Icon日記(13) Wicon ベータ7 風つかい icon-project では、Icon のグラフィック機能の整備を行っています。 Unixバージョンではグラフィック機能がサポートされていますが、Windows-95,NTでは 、未だ正式リリース版はありません。しかしベータ版はリリースされています。 http://www.cs.arizona.edu/icon からたどれますが、次の所にベータ版がおいてあ ります。 ftp://ftp.cs.arizona.edu/icon/beta/windows/ ここにベータ版をまとめた complete.zip 771 Kb Wed Nov 06 05:38:00 1996 Zip Compressed Data があります。 中身は次のようになっています。 (unzip -l complete.zip) Archive: COMPLETE.ZIP Length Date Time Name ("^" ==> case ------ ---- ---- ---- conversion) 4295 96-11-05 02:44 READ.ME 235876 96-10-12 16:35 ged.bat 228482 96-11-05 02:26 gipd.hlp 48828 96-11-05 02:26 iconintr.hlp 122456 96-11-05 02:26 iconref.hlp 28085 96-11-05 02:26 ipd271.doc 102133 96-11-05 02:26 ipd271.ps 3225 96-02-08 23:09 keysyms.icn 73 96-04-08 23:40 noop.bat 543042 96-10-12 16:36 vib.bat 382976 96-11-05 02:26 wicon.exe 46888 96-11-05 02:26 wicon.hlp 262144 96-11-05 02:53 wicont.exe 420352 96-11-05 02:26 wiconx.exe ------ ------- 2428855 14 主なプログラムは、 wicont.exe が、プログラムの中間言語へのトランスレータ。 wiconx.exe が、中間言語の実行プログラム。 wicon.exe が、ランチャー。(プログラムをエディットして、トランスレータ 中間言語実行プログラムを呼んで実行させる。) となっています。 尚、グラフィック機能を使うためには、ライブラリーの BIPL,GIPLは必須です。 グラフィック以外の機能は、BIPLが無くとも色々試せましたが、グラフィック関係 はBIPL,GIPLがリンクできるようになっていないと動かせません。 私の環境(Windows-95)で、ぼちぼち試していますが、 ・標準出力Windowが、日本語に対応していない。(エディットウィンドウは 日本語が使える。) 日本語をウィンドウに出さない(ファイルへ出力し てしまう。)と問題ないが、出すと日本語文字が化ける。 ウィンドウを生成してそこへ出力しても文字が化ける。 ・コマンドラインパラメータが渡せない。(みたい。) というような状況です。 使いはじめたばかりなので、私の設定とか使い方が間違っている可能性もありま す。 日頃、テキストファイルを加工して、別のテキストファイルへ変換する処理しか やっていないもので、あまりグラフィック機能の必要性を感じてませんので、勉強 のペースがいまいちです。 テキスト処理結果やテキスト処理マンマシンインターフェースを、グラフィック 処理できる言語と言えば、Tcl/Tk、Tkperl、Tkpython、Javaとかがあるようなので すが Iconでもやれるといいなという方はお試しを。 風つかい (TRA11936@biglobe.ne.jp/PFF01531@niftyserve.or.jp) < IconのWWWは、http://www.cs.arizona.edu/icon/index.html > BGM: roka/遊佐未森 BGD: 月桂冠 BGS: Mild Seven Menthol (icon_110.txt 1997/02/03 PCVAN PIG) ■ Icon > Icon日記(14) dump.icn 風つかい Nurse.icnでバイナリーファイルを初めて扱いましたが、ついでにバイナリーファイル のヘキサダンププログラムを作ってみましょう。 こんな風にバイナリーファイルの内容をヘキサ表示で出力するものです。 この例は、 idump idump.exe >idump.txt として、idump.exeの内容を表示した ものです。 -----^ IDUMP.TXT ( date:97-03-22 time:13:10 ) --------------1 then f_name := args[1] else stop(Usage) # ファイルオープン dir := open(f_name,"ru") | stop("cannot open ",f_name) # ↑読込・改行非変換モード #ファイル読み込み→16進変換出力 while s := reads(dir,256) do { # ↑バイナリー読込関数。サイズの256は適当な値です。 every c := !s do { # s から1文字ずつ取り出す。 if byte_count % 16 = 0 # 16バイト単位にバイト数を表示 then writes("\n",(hexstring(byte_count,7,""))," ") #↑バイト番号を7桁の16進数表記に変換。 else { # 2バイト毎にスペース挿入 if byte_count % 2 = 0 then writes(" ") } byte_count +:= 1 writes(hexstring(ord(c),2,"")) #↑文字を文字番号に変換し、2桁の16進数表記に変換。 } write() } end # hexstring(i,n,lowercase) は、ライブラリーBIPLの hexcvt.icn に含まれる関数。 # 10進数 iを16進数表記に変換する。nは桁数。3番目のパラメータに何か入れる # と a-fは小文字(デフォルトは A-Fは大文字)。 -----$ IDUMP.ICN ( lines:36 words:118 ) -------------------- *s then s := right(s,n,if i >= 0 then "0" else hexchars[16]) return sign || s end -----$ HEXCVT.ICN ( lines:54 words:218 ) ------------------- BGM: Vivien/篠原美也子 BGD: 月桂冠 BGS: Mild Seven Menthol (icon_111.txt 1997/02/05 PCVAN PIG) ■ Icon > Icon日記(15) 再びIconの特徴 風つかい プログラムは、AWKと Iconで精々1ページに納まる程度のものしか組んでいないので すが、プログラムミスの修正に相当の時間を費やしています。 一番の原因は、 思い込み ですね。 何でこんな数行の procedureがすんなり動かないんだろう! で、原因はデータタイプが違っていて、エラーメッセージもそう出ているんですけれ ど、合っていると思い込んでいて、何故か気づかず なして〜!? と悩んでいたというのが多いです。 思い込みと言えば、【スパゲッティミートソース】という料理がありますね。 昔これを、 【スパゲッティ meet ソース】 と思い込んでいました。 初めて、喫茶店か食堂のメニューでみたとき、何故かそう思い込んだんですね。 【 スパゲッティ と ソース の出会い】 お〜、割と粋な名前じゃん! 確か高校生位の頃だったと思います。 で、勘違いに気付いたのは、ずいぶん後の ことで、TVのCMで、ミートソースの宣伝を見て、ハタと meat だと...。 【え〜、そんなそっけない名前だったの〜。】 世の中には、美しく誤解したままの方が幸せということもあるという訳です。 思い込みの原因は、当時Jazzを聞きはじめていたんですが、有名なプレーヤー を2人共演させた、タイトルが だれだれ meets だれだれ というようなレコードが がいくつかありました。 それが頭にあったもんで、連想で meet だと。 なんで、スパゲッティなら meetsと3人称単数現在の sがつくと思わなかったんだ ろう? いや、スパゲッティは1本じゃなくて沢山あるんだから、複数扱いでいいの だ。 あれ、英語では単数かな? 複数かな?(笑) さて、今日は、再び Iconの特徴ということで、Icon入門講座では AWKと比べたIcon の特徴というかたちで説明しましたが、今回は、他の言語と比較しても 【だいぶ違うのではないだろうか】 という点をあげてみたいと思います。 だろうかというのは、私が他の言語は AWK以外ははよく知らないもので...(汗) 1)文字(列)検索をプログラムできる仕掛けが組み込まれている。 文字(列)パターンマッチについて、例えば正規表現以外のマッチのやり方も プログラムで組めるということです。 これは逆に正規表現も組まないといけ ないといけないということになります。 (と言っても正規表現以外のパターンマッチのというのは思い付きません。 無理矢理作ればできると思うんですが、実用的な用途であるのかしら?) 2)データ構造 set(集合)、list(リスト)、table(テーブル)は、その 要素にまた set(集合)、list(リスト)、table(テーブル)を含むことが できる。 例えば、setの要素に setや listや tableを持てて、 その setや listや tableの要素に、また setや listや tableを、持てて.. と幾重にも階層構造を作れるということです。 3)バックトラッキングの仕掛けが組み込まれている。 バックトラッキングというのは、後戻り探索ですよね。例えば、迷路があって ある道筋をたどって行き止まりなら、戻って別のルートを捜すようなしかけを 必要とするプログラムが組みやすいということです。 Icon教典(The Icon Programming Language)には、エイト・クイーン問題の例 が載っています。 8x8のチェス盤に8個のクイーンをお互いに取られない位置に置くとしたら 何通りあるか というような問題です。 私の思い込みでは、以上3つあげたなかで、3)のバックトラッキングが一番特徴的 かなとも思うのですが...。 エイト・クイーンの解を洗いだすプログラムは Iconのライブラリーにはいっていま す。 動かすと、これはスゴイ! と思います。 しかし〜。 エイト・クイーン問題が解けて何の役に立つんだろう? 他に良い利用法 が無いものかと考えている今日このごろです。 風つかい (TRA11936@biglobe.ne.jp/PFF01531@niftyserve.or.jp) < IconのWWWは、http://www.cs.arizona.edu/icon/index.html > BGM: Vivien/篠原美也子(http://www.j-plaza.or.jp/msap/ARTIST/SHINOHARA/) (icon_112.txt 1997/02/21 PCVAN PIG) ■ Icon > Icon日記(16) Recursive generator 風つかい 金・土と春一番の突風が吹き荒れていました。すぐこういうのに影響されて、キャン ディーズの春一番が聞きたくなったりします。 近ごろ、自宅のパソコンを触っているときは、必ずCDを聞いています。 パソコンを買い換えたときCDドライブがついてたもので、遊ばせておくのも勿体ない ので音楽CDをレピートモードで掛けっぱなしで聞いています。 パソコンの売れ行きが伸びるとCDの売れ行きも伸びているのかしら? 私の場合は、手持ちのCDを聞き飽きてしまって、新しいCDを買うようになりまし た。 さて、今回は Recursive generator 再帰的ジェネレータです。 ジェネレータは、 次々に値を発生しますが、その構成に再帰的な構成を使ったものです。 再帰的というのは、procedureのプログラムの中に自分自身を呼んでいる部分がある ような構成になっているものです。 例えば、文字列 "ABC" があったとして、この3文字の組み合わせを全て作るとしま す。 "ABC","ACB","BAC",...というような組み合わせを全てあげていく訳です。 プログラムの考え方は、 まず、3文字の中から1文字を取り出します。これは3通りのやり方があります。 この3通りのやり方で取り出した1文字に、残りの2文字の組み合わせの文字列を つなげたものが、組み合わせの全てになります。 残りの2文字の組み合わせの作り方も同様のやり方で、 この2文字からまた1文字取り出します。 これは2通りあります。 この2通りのやり方で取り出した1文字に、残りの1文字の組み合わせの文字列 (1文字しか残っていないのですから1通りしかありませんが)をつなげたもの が全ての組み合わせとなります。 残りが1文字になったら、もう組み合わせる必要がありません。 ここで終わりにな るようにします。 再帰的構成では、残りの部分に同じやり方を適用するという部分で、自分自身を呼び ます。 Iconのライブラリーに以上の考え方で作られた procedureがあります。 strings.icnの中の permute.icnです。permute.icnでは、1文字でも再度しつこく、 同じやり方で残りが空文字列になって終わるようになっています。 多分、文字列に空文字が指定されたケースの事を配慮しているのだと思います。 では次にサンプルプログラムを。 -----^ PERM01.ICN ( date:97-02-23 time:23:57 ) -------------perm01.txt とした時の結果です。 -----^ PERM01.TXT ( date:97-02-23 time:23:58 ) ------------- BGM: 春一番/キャンディーズ (icon_113txt 1997/02/24 PCVAN PIG) ■ Icon > Icon日記(17) 文字の組み合わせ(1)風つかい 先日、渋谷のレコード店で、近ごろ聞いている女性歌手のCDリリース記念ミニライ ブというのがありまして、聞きにいきました。 小さなステージに何故かパソコンがおいてありまして、何につかうんだろうと思って いました。 メンバーが、ベース、ギター、エレピ、歌手と登場して、曲が始まるとエレピの方が パソコンをちょっと触ると、なんとドラムの音がしてきて、やっと分かりました。 ライブは、10年位聞いていなかったのですが、今はパソコンも楽器になっているん ですね。 たまには、聞きにいってみるもんだ。 さて、Iconの Recursive generatorの続きです。 前回は、英文の文字列の組み合わ せでした。 やっぱ、日本人ならせめて、かな文字くらいは組み合わせないといけませ んね。 というわけで、かな文字の組み合わせです。文字が2バイトで表わされていま すので、2バイト単位に処理をしていきます。 -----^ PERM02.ICN ( date:97-02-26 time:19:30 ) -------------perm02.txt とした時の結果です。 -----^ PERM02.TXT ( date:97-02-26 time:19:29 ) ------------- BGM: いとおしいグレイ/篠原美也子 (http://www.j-plaza.or.jp/msap/ARTIST/SHINOHARA/) (icon_114.txt 1997/02/26 PCVAN PIG) ■ Icon > Icon日記(18) 文字の組み合わせ(2)風つかい さて、文字の組み合わせのつづきです。 前々回の perm01.icn も、前回の perm02.icnも文字列の中に、同じ文字が 2つ出てきても配慮していません。 perm01 ABA >perm01b.txt とすると、 -----^ PERM01B.TXT ( date:97-02-26 time:20:12 ) ------------perm03.txt としますと、違う文字列のみ発生します。 -----^ PERM03.TXT ( date:97-02-26 time:19:56 ) ------------- BGM: そのままの君でいて/岡本真夜 (icon_115.txt 1997/02/26 PCVAN PIG) ■ Icon > Icon日記(19) 文字の組み合わせ(3)風つかい さて、今回も文字の組み合わせのつづきです。 シフトJISの1バイト文字、2バイト文字が混在していても組み合わせできるよう に拡張します。 文字列から順に文字を取り出す処理にシフトJISコードの2バイト文字の判定処理 をいれています。 -----^ PERM04.ICN ( date:97-02-28 time:01:07 ) -------------perm04.txt とやると、つぎのような結果になります。 -----^ PERM04.TXT ( date:97-02-28 time:01:21 ) ------------- BGM: 海になりたい青/篠原美也子 (icon_116.txt 1997/02/28 PCVAN PIG) ■ Icon > Icon日記(20) シフトJIS処理(1)風つかい はやいもので、もう明日から3月ですね。 季節は、もう春だ。 春になったら、Icon日記のタイトルも変えたいな。 Icon日記は、来月で終わり にして、別のタイトルにしようと思います。 Icon日記では、あと シフトJIS処理、バックトラッキング、レコード にトラ イしてみようかと思います。 いずれも今まで使ったことが無いものですので、うま く説明ができるといいのですが。 さて、シフトJIS処理については、string scanning 関係の関数をシフトJIS 対応にしてみたいと思います。 string scanningに関係する関数は、upto,many,find,move などがあります。 upto,manyは、文字列に、指定された文字(の集合)が含まれるかどうか? に関す る動作をします。 シフトJISには2バイト文字がありますので、文字指定に cset(1バイト文字) ではなく、2バイト文字(Iconでは文字列)も扱える set(集合)を使う必要があり ます。 find は、文字列中に、別の文字列が含まれるかを調べます。 1バイト文字か2バイト文字かを意識せず、1バイトの文字のつながりとみなして検 索しても大丈夫なケースもあります。 しかし、厳密な照合をしたいときはシフトJISの文字の境をチェックして、2バイ ト文字の2バイト目から照合をはじめないようにする必要があります。 move は、1バイト文字・2バイト文字にかかわらず、指定文字数だけ走査位置を移 動させます。(必要無いような気もしますが、ものはついでと。) こういう文字列検索の事を考えていると、AWKやIconの検索は英文向きだな〜と思いま す。 単語やデータが、通常スペース区切りになっていますので、単語やデータを切り出す のが非常に楽なんですね。 日本語は、単語の区切りが検出しにくい言語ですね。 今回は、手始めに2バイト文字の集合を扱いやすくするために、2バイト文字の集合 を from-to指定できる procedureを作りました。 -----^ JC_FT.ICN ( date:97-02-28 time:22:39 ) -------------- "0","1","2","3","4" の set # jc_ft("あ","お",2) -> "あ","い","う","え","お" の set # This file is in the public domain. local S, i /step := 1 S := set() # 空のset # from指定文字とto指定文字を数に変換し、その間の数を2バイト文字へ変換し # setに加える。 every i := (ord(s1[1])*256 +ord(s1[2])) to (ord(s2[1])*256 +ord(s2[2])) by step do { insert(S,char(i/256) || char(i%256)) } return S end #テストデータ procedure main() local L L := sort(jc_ft("0","4")) # "0","1","2","3","4" while writes(get(L)) # リストデータの書き出し write() L := sort(jc_ft("あ","お",2)) # "あ","い","う","え","お" while writes(get(L)) write() end -----$ JC_FT.ICN ( lines:30 words:95 ) ---------------------jc_ft.txt とした結果です。 -----^ JC_FT.TXT ( date:97-02-28 time:22:42 ) -------------- BGM: vivien/篠原美也子 (icon_117.txt 1997/02/28 PCVAN PIG) ■ Icon > Icon日記(21) シフトJIS処理(2)風つかい 昨日も風が強かったのですが、TVのお天気コーナでは春一番だと言っていました。 今の季節で吹くと何回吹いても春一番なのかな〜。 確かにいちいち数えていられな いとは思いますし、春二番、春三番とは言いませんものね。 AWKや Iconには、便利な機能や表現がありますね。 でも、知らない人には、何が なんだか分からりませんね。 しかし、用語の点で英語圏の人は有利だな〜。 Iconの関数でも、write,tab,upto,many,every,while,repeat,until,... 皆、英語圏 の人にはすぐ意味が理解できるんでしょうね。 every write(1 to 100) なんて、英語圏の人は、読んだまま理解できますもんね。 さて、今回もシフトJIS関係です。 uptoと manyをシフトJIS対応にしてみました。 cset(1バイト文字セット)の 代わりに set(集合)に、1〜2バイト文字を入れて、csetの代わりとしています。 -----^ SJIS2.ICN ( date:97-03-02 time:14:58 ) -------------- BGM: そのままの君でいて/岡本真夜 (icon_118.txt 1997/03/02 PCVAN PIG) ■ Icon > Icon日記(22) シフトJIS処理(3)風つかい 話し言葉の言語というのはいくつ位あるんでしょうね。 日本の言葉でもおおざっぱに九州弁、関西弁、名古屋弁、東北弁、...とか分け ますが、実際は市か郡の単位で微妙にアクセントやイントネーションが異なっていて、 その地方の方には聞き分けられます。 また世代によっても違います。 業界でも違いますし。 数えれば、人類数十億人で 数千人単位では、言葉が微妙に違う訳ですので、10万位はあるわけですね。 プログラム言語も言語の仲間ですから沢山あります。 リストを作らっれている方がいらっしゃいまして、以前数えましたら1000は越し ていたと思います。 OSも沢山あると思いますが、こちらの数はよくは知りません。 コンピュータを使うにあたって、OSは空気、プログラム言語は言葉のようなもの です。 空気や言葉は、無料で誰でも使えるようにすべきだ。 という主張をして、実践し れているのが、Richard Stallmanさんが率いるFSF(Free Software Foundation) です。 GNUというのは、そういうOS・基本ソフトウェアを作るプロジェクトです。 GNUソフトウェアは、GPL(General Public License)という規定によって配布さ れて、また再配布についても規定されています。(詳細はGPLを参照して下さい。 英文です。ハイ。和訳もあったと思いますが。) GPLはよくできた規定ですので、フリーソフトウェアの作成者の方が、そのまま 自分の作成したソフトウェアのライセンス規定として使われていることもあります。 Icon入門講座や Icon日記は、【公共物のように自由に使って!】ということで、 in the Public Domainとしています。 これは、Icon自体が in the Public Domainですのと、自由に引用や編集をしてよい ようにしておけば、そのうちどなたかが、もっと良いドキュメント書いていただくのに 便利だろうと思ったためです。 さて、今回もシフトJIS関係ですが、やっとシフトJIS関係も終わりです。 findと moveをシフトJIS対応にしてみます。 jposにミスがありましたので修正 しています。 -----^ SJIS3.ICN ( date:97-03-02 time:20:56 ) -------------- BGM: そのままの君でいて/岡本真夜 (icon_119.txt 1997/03/02 PCVAN PIG) ■ Icon > Icon日記(23) Backtracking 風つかい 前にプログラム言語のリストがあると書きましたが、次のところにあります。 The Language List http://cuiwww.unige.ch/cgi-bin/langlist Free Compilers and Interpreters http://cuiwww.unige.ch/cgi-bin/freecomp 2つ目の Free Compilers and Interpreters のリストは、comp.lang.misc 他 の ニュースグループに定期的にポストされています。今は月に1回、月はじめに ポストされているようです。 データのメンテが追い付いていないようで、情報は最新ではないようです。でも、 サポートサイトやニュースグループが載っていますので、更に調べてみようと言う方 には捜す手だてがあるわけで、何かプログラム言語について調べてみようと言う方に は役に立つのではないかと思います。 私は、生まれが福岡ですので母国語は博多弁です。現在は横浜に移民して来ていま すので、第一外国語の横浜弁を使っています。 パソコンを触っていますので、パソコン弁とかMS−DOS弁とか98弁とか DOS/V弁とかも使っているかもしれません。 Unix弁は分からないことが 多いですしC弁とかPascal弁は殆どわかりません。AWK弁は大体わかります が、Perl弁は殆ど分かりません。Icon弁を、今、勉強中というところです。 プログラム言語と言っても、要するに言葉の一種ですので、日頃しゃべらないと使 えるようにはなりません。Icon日記は、私のIcon弁の練習も兼ねています。 ということで、Icon弁の練習としまして、バックトラッキングをやってみよう と思います。 ところが、バックトラッキングというものが、何故必要になるのか? 私はよく分かっていません。そこで、Icon教典(The Icon programming Language) の例にあげてある 【8クイーン】 の例を眺めてみて、 こういうことかな? と、おぼろげながら理解した範囲で、説明しようと思います。 眺めて見ると要するに ・問題を【手抜き】して解くやり方 あるいは、 ・問題を【分割】 して解くやり方 ではないかと思います。 8クイーン問題とは、8x8のチェス盤に、クイーンをお互いに取られない位置 列 に置くものです。例えば左の図は1つ 12345678 の解です。 行1Q・・・・・・・ こういう解が72通りあるそうです。 2・・・・・・Q・ クイーンは垂直・水平・対角線方向 3・・・・Q・・・ の駒を取れます。 よって1つの行に 4・・・・・・・Q はクイーンは1個だけ、1つの列にも 5・Q・・・・・・ クイーンは1個だけ。 また対角線に 6・・・Q・・・・ も1個だけということになります。 7・・・・・Q・・ 8・・Q・・・・・ で、この後どうするかというと実際に クイーンを盤面に置いていってみよう うといういうのです。 ・・・この辺が、あっ、手抜きだ〜と私が思うところな んですが。 後はCPUパワーに任せて、しらみつぶしにやって試してみよう と いう訳です。 8個のクイーンを ・1行に1個づつ、順に、置いていきます。 ・既に置いたクイーンに取られる位置しか置くところが無くなったら、1つ前 のクイーンを置くところに戻って、別の置きかたを試してみよう という訳です。 この、【置けなくなったら、1つ前へ戻って、別のやり方】というところが、 バックトラッキングということになります。 【1個づつ、順に】というところは、generatorを使うということになります。 別の言い方をすると、 ・クイーンを順に置いてみる。 水平・垂直・対角線上に、別のクイーンがいれば、1つ戻って別の位置を 試す。 ・8個のクイーンが全部置ける。 という 2つの問題に分割して、解く と言うやり方です。 実際のプログラム例では、 ・1行目にクイーンを置く。 (左端から順に試します。) ・2行目にクイーンを置く。 (1行目の下・対角線になると失敗。) ・3行目にクイーンを置く。 (1・2行目の下・対角線になると失敗。) ・以下同様に8行目迄 ですから、 ・問題の条件を2つ(以上)に分割して、 ・1つ目の条件にあうデータを実際に作って、 ・2つ目(以降)の条件に実際に合うものを選びだす。 ということかな? そういうことなら、Iconで ・ generatorでデータを作って、 ・そのデータを別の条件でチェックしてOKのものだけ出力する。 というやり方をしているものは、全部、バックトラッキングの例ということになりま すね。 なんだ、そういう単純なことなのか! 早とちりかも知れませんが。(汗) すると、前回のシフトJIS用の文字列検索 procedureの jfindで、文字列を順に 左端から、指定文字と一致するかどうか試して、一致しなければ次の位置にいくやり 方もバックトラッキングですね。 別のサンプルプログラムです。かなり、強引なサンプルですが... -----^ NAME.ICN ( date:97-03-03 time:22:57 ) --------------- BGM: 熱くなれ/大黒摩季 (icon_120.txt 1997/03/03 PCVAN PIG) ■ Icon > Icon日記(24) Generator 風つかい 窓の外で、小鳥のさえずりが聞こえます。ホ〜ホケキョ。あっ、うぐいすだ。 春ですね〜。 聞いていると、少しづつ鳴きかたを変えていますね。 まるで 練習しているみたいに聞こえます。 ジェネレータって、綴りは語尾が erではなくて、orなんですね。今まで間違 いに気づきませんでした。(汗) erと orをつける規則みたいなものがあった かしら? (このテキストでは直っています。) さて今回は、generator関係の補足です。 【選択式】 前回のサンプルプログラムで、姓名の組み合わせで6文字以上のものを、出力 しました。 6文字以上という条件をつけるために、write関数では複数の出力 指定があるときに、それらの式がすべて成功した場合にだけ write動作が行われ る。 ということを利用しています。 every write(s := perm(L1,L2)," ", 6 <= *s/2) の部分です。 姓名組み合わせ↑ ↑6文字以上の条件 これだと、姓名の組み合わせの後ろに文字数が出力されます。 これは余計な ので、文字数を出さずに済む方法はないか? と調べてみました。 複数の式が全部成功したら成功して、かつ結果の値を複数の式の中から選らぶ という表現がサポートされていました。 選択式(式1,式2,式3,...) という形式で、選択式は結果として数 字でないといけません。 全体の値は、選択式の結果が 1なら式1、 2なら式2 3なら式3となります。 そこで、6文字以上の姓名の組み合わせは、次のように指定できます。 every write(1(s := perm(L1,L2), 6 <= *s/2)) # ↑結果に2つの式 ↑6文字未満だとこの項が failし # のうち1番目を 1(...,...)式も failする。 # 使う。 すると writeも failする。 【組み込み generator】 Iconでは、組み込みの Generatorがあります。 数字を1から順に生成でき るものです。 任意数から始まる、任意数飛びの、数字列を指定できます。 seq(i1,i2) : i3,i4,... # generate sequence of integers| Generates an endless sequence of integers starting at i1 with increments of i2. 【くり返し generator】 ある generatorの出力を繰り返す指定ができます。 例えば、(1 to 3)とか (1 | 2 | 3) は、1から 3迄の数を発生する generatorですが、そのパターンを 更に何回も繰り返す場合です。 |(1 to 3) という表記で、 1 2 3 1 2 3 1 2 3 ... というような generatorの指定ができます。 |1 としますと、 1 1 1 1 1 1 1 1 1 ... ということになります。 【generator の生成数限定】 seq()関数やくり返し generatorが、延々出力を続けたら、いつプログラムが 終わるんだろう? と思われるかも知れませんが、 ・その generatorを呼んでいる procedureが failまたは、終了すると終わ ります。 再度呼びますと続きから生成していきます。 ・生成数の限定ができます。 seq() \10 としますと、10個だけ生成されます。すなわち1から 10迄の数字が生成されます。 every write(|(0 to 7) \16) としますと、0から7の数字を2回 生成します。 PCVANの書込みタイトルリストのサンプルデータを生成するプログラムを を次に示します。 こんなデータを生成するものです。 -----^ TL9612.TXT ( date:97-03-20 time:23:11 ) -------------月別書き込み数集計 風つかい # 初期メッセージNo :n_init # 初期メッセージ年月 :YYMM (日付は、YY年MM月01日) # メッセージタイトル :s (皆同じ) # 月当たりメッセージ数:num_msg static msg_no initial { # 最初に呼ばれた時、1回だけ実行 msg_no := n_init -1 } if num_msg = 0 then return # 書込み数 0 every 1 to num_msg do { # タイトル出力 write(right(msg_no +:=1,4)," ",YYMM[1:3],"/",YYMM[3:5],"/01 ",s_title) } return end procedure sin_data(n_max,n_div) # データ数生成部 # 初期値:n_max/2 、最大値:n_max、最小値:0 のサインカーブを n_div個に # 分けた位置のデータを作成する generator # n_max : 最大値 # n_div : サインカーブの360度分を何分割するか suspend integer(n_max * (1.0 +sin( 2.0*&pi * (seq() -1)/ n_div))/2) #↑順列作成 1〜 end procedure inc_month(YYMM) # 年月データ +1月 yy := numeric(YYMM[1:3]) ; mm := numeric(YYMM[3:0]) # 年月を数字に変換 if mm = 12 then { yy +:= 1 ; mm := 1 } # 計算 else { mm +:= 1 } return right(string(yy),2,"0") || right(string(mm),2,"0") end -----$ TITLE.ICN ( lines:57 words:216 ) -------------------- BGM: 瞳水晶/遊佐未森 (icon_121.txt 1997/03/08 PCVAN PIG) ■ Icon > Icon日記(25) 5クイーン(1) 風つかい 今日の日食は20世紀では最後だそうです。 今朝、久しぶりに眺めてみま した。 小学校の授業で眺めて以来かな。 その時は、ガラスの破片にろうそく のすすをつけて眺めました。 そう思って家中見渡しても、ガラスの破片なんかありませんので、透明な食品 ケースにろうそくですすをつけました。ケースは熱でべこべこになりましたが、 太陽を透かして見るのにはあまり問題はありませんでした。 透かして見ると太陽って小さいんですね〜。でも、下弦の形に月で影ができて いる太陽がハッキリ見えました。 次は、2002年だそうです。 では、今日はバックトラッキングで使う Reversible assignment(戻し可能な 代入)を取り上げます。 Iconではバックトラッキングのしかけがありますが、プログラム制御だけでな くデータの代入もバックが可能です。 8クイーンを例にとります。 8個のクイーンを、1個目から順に置いてくの ですが、あるクイーンを置こうとして置けなくなったら、1つ前のクイーンを置 く場面へ戻って、置き直します。 置けるか置けないかを判定するためには、それ迄に置いたクイーンの位置を覚 えておく必要があります。 すると、置き直しをする場合は、覚えていたそれ迄に置いたクイーンの位置を、 戻った場面で置く前の状態に戻す必要があります。 Iconでは代入の記号は、:= ですが、この戻し可能は代入を行いたいときは <- を使います。 交換 :=: も戻し可能な交換 <->が用意されています。 クイーンの数が多いと例題のコメントが面倒になりますので、5つに減らして 5クイーンでやります。 まず、<-を使わない5クイーンプログラムです。 5クイーンの解を書き出し ます。 大まかな考え方は前のお話ししていますので、コメントで動作はご理解 いただけるのではないかと思います。 クイーンの置き直しは、suspend ... do ...の構文を使っています。 suspend の後に do をつけると、上位 procedure呼ばれてあるデータを返して、再びその 上位 procedureから呼ばれて動作を行う前に、 do 以降の処理を行います。 この例では、do のところで、直前に置いたクイーンを戻して(置かない状態) います。 -----^ 5QUEEN1A.ICN ( date:97-03-09 time:15:15 ) ----------- BGM: そのままの君でいて/岡本真夜 (icon_122.txt 1997/03/09 PCVAN PIG) ■ Icon > Icon日記(26) 5クイーン(2) 風つかい Iconでは、upto,findの関数や generatorのように、条件に合ったデータを探 し出すしかけが設けられています。 条件に合わないデータは無視して、必要なデータだけを取り出すしかけが用意 されています。 Icon教典ではこのしかけを、"Goal-Directed Evaluation" と呼んでいます。 日本語に直訳すると、「ゴールを目指した評価」となるのでしょうが、長いので ここは短く、 「イケイケ評価」 と呼びたいところです。 では、5クーンのつづきです。 Reversible assignment <-を使った5クイーンプログラムです。 -----^ 5QUEEN1B.ICN ( date:97-03-09 time:15:17 ) ----------- BGM: そのままの君でいて/岡本真夜 (icon_123.txt 1997/03/09 PCVAN PIG) ■ Icon > Icon日記(27) Wicon ベータ8 風つかい TVで日食とヘール・ボップ彗星の解説をしていました。乗りやすいたちですの で本屋で天文雑誌を買ってきまして、ヘール・ボップ彗星の記事を読んでみました。 今の時期(3月上・中旬)ですと、早朝4時〜5時頃に東の空に見えるとありま す。 下旬になると夕方の6時〜7時頃に見えるとあります。 という記事を読んだせいか、何故か今朝4時に目がさめました。 外へ出て見ると街あかりで星は殆ど見えないのですが、東の空にそれらしき星が 見えました。 他の星はくっきりしているのに、その星は縦長にぼやけて見えましたので、多分 ヘール・ボップ彗星だろうと思います。 そうだとしますと相当明るいですね〜。 記事では、推定サイズ 10〜20kmの氷とちりのかたまり 推定質量 5兆トン となっていました。 ひぇ〜。 莫大な大きさですね〜。 ふと、地球のサイズが気になりましたので調べましたら、 直径 12756km 質量 60億・兆トン(6x10^24kg) でしたので、約10億分の1の質量ですね。 少し安心しましたが、シューメーカ・レビ彗星が木星に激突した例もあります。 2年後にこんなものが地球にぶつかると、ノストラダムスの大予言が当たってし まうんですね。 さて、アリゾナ大にアクセスしてみましたら、Windows対応 Iconがβ8にバージ ョンアップされていました。 そのうちに getしてまた試してみたいと思います。 次のところにあります。 ご興味のある方はアクセスしてみて下さい。 ftp://ftp.cs.arizona.edu/icon/beta/windows/ READ.ME 3 Kb Thu Mar 06 20:21:00 1997 docs.zip 38 Kb Thu Mar 06 20:12:00 1997 Zip Compressed Data gprocs.zip 500 Kb Thu Mar 06 20:12:00 1997 Zip Compressed Data iconhelp.zip 144 Kb Thu Mar 06 20:13:00 1997 Zip Compressed Data keysyms.icn 3 Kb Thu Mar 06 20:23:00 1997 procs.zip 338 Kb Thu Mar 06 20:16:00 1997 Zip Compressed Data vib.zip 122 Kb Thu Mar 06 20:18:00 1997 Zip Compressed Data vibsrc.zip 260 Kb Thu Mar 06 20:18:00 1997 Zip Compressed Data wi.icn 14 Kb Thu Mar 06 20:23:00 1997 wi.zip 53 Kb Thu Mar 06 20:19:00 1997 Zip Compressed Data wicon.zip 338 Kb Thu Mar 06 20:20:00 1997 Zip Compressed Data 風つかい (TRA11936@biglobe.ne.jp/PFF01531@niftyserve.or.jp) < IconのWWWは、http://www.cs.arizona.edu/icon/index.html > BGM: 愛の言霊/サザン・オールスターズ (icon_124.txt 1997/03/11 PCVAN PIG) ■ Icon > Icon日記(28) idump2.icn 風つかい ヘール・ボップ彗星の情報で、書き落としがありました。 風つかい>今の時期(3月上・中旬)ですと、早朝4時〜5時頃に東の空に見え 風つかい>るとあります。下旬になると夕方の6時〜7時頃に見えるとあります。 中旬は、早朝は東の空に、夕方には西の空に、見えるのですが、みづらいそう です。 下旬は夕方に西の空に見えるそうです。 下旬になると見易いみたいですね。 ところで、以前、地球の重量は60億・兆トンと書きました。 理科年表に載っ ていたのですが、どうやって計るんでしょうね。 何をはかりにするんだろう。 さて、今回は、前に作ったヘキサダンプのプログラムに、印字可能なコードは 印字する機能を追加してみました。16バイト目で、2バイト文字が泣き別れに なるのはいやらしいので、その場合はもう1バイト出力するようにしました。 -----^ IDUMP2.ICN ( date:97-03-17 time:02:08 ) -------------1 then f_name := args[1] else stop(Usage) # ファイルオープン dir := open(f_name,"ru") | stop("cannot open ",f_name) # ↑読込・改行非変換モード #ファイル読み込み(ファイルはメモリーへ一気読み。) while s ||:= reads(dir,256) # ↑バイナリー読み込み関数。256byte単位指定。←いい加減な値 # ダンプ処理 write(title) # タイトル印字 every L := jcpos(s) do { # 文字列から取り出し if byte_count % 16 = 0 then { # 16バイト毎手当 if byte_count > 0 then { # 最初の文字でなければ if L[3] == "M" then { # 2バイト文字の2バイト目 s2 ||:= L[2] # 前の行へくっつける write(s1,title2,s2) # 出力 s2 := c2 # 印字文字バッファセット } else { # 2バイト文字の2バイト目以外 write(s1,title2,s2) # 出力 s2 := "" || # 印字文字バッファセット if L[3] == ("C" | "U") # 印字不可文字手当 then c1 else L[2] } } else { # 最初の文字なら s2 := "" || # 印字文字バッファセット if L[3] == ("C" | "U") # 印字不可文字手当(Rev.02) then c1 else L[2] # (Rev.02) } s1 := hexstring(byte_count,7,"") || " " # アドレス・ヘキサバッファ #↑バイト番号を7桁の16進数表記に変換。 writes(&errout,c2) # 動作モニター } else { # 16バイト区切り以外 s2 ||:= if L[3] == ("C" | "U") # 印字不可文字手当 then c1 else L[2] } s1 ||:= " " || hexstring(ord(L[2]),2,"") # ヘキサ変換→足し込み #↑文字を文字番号に変換し、2桁の16進数表記に変換。 byte_count +:= 1 } # 文字列の最後が16バイト区切りに不足の時の処理 if *s1 > 0 then write(left(s1,*title1),title2,s2) write(&errout) # CRTカーサを左端へ end # hexstring(i,n,lowercase) は、ライブラリーBIPLの hexcvt.icn に含まれる関数。 # 10進数 iを16進数表記に変換する。nは桁数。3番目のパラメータに何か入れる # と a-fは小文字(デフォルトは A-Fは大文字)。 -----$ IDUMP2.ICN ( lines:68 words:292 ) ------------------- idump2.txt とした時の結果です。 -----^ IDUMP2.TXT ( date:97-03-21 time:00:23 ) -------------字(デフォルトは 0000c20 cd 20 41 2d 46 82 cd 91 e5 95 b6 8e 9a 81 6a 81 : > A-Fは大文字)。 0000c30 42 0d 0a 1a : >... -----$ IDUMP2.TXT ( lines:197 words:3937 ) ----------------- BGM: 海になりたい青/篠原美也子 (icon_125.txt 1997/03/16 PCVAN PIG) ■ Icon > Icon日記(29) Record 風つかい そろそろ、天気予報で桜前線の話がでる頃ですね。 前線と言えば、前線は暖かい空気と冷たい空気の境目で、目には見えないと 思っていたのですが、実際に見えることもありますね。 新幹線で大阪〜東京間を移動中に、ふと景色をみると、空が斜めに2つに分 かれているんですね。 晴れた空に小さな雲が斜めに並んでいるんです。 壁のようになっています。 うまく表わせないのですが、真横から見ますと、下の図みたいになっていま す。 %の所に小さい巻雲みたい雲が一面に発生していて、境目がくっきり分か りました。 % % % % % % なんだろう? と思ったんですが、あっ、これが前線か! と感動しました。 もう20年位前の事ですが、それ以来同じ現象はみたことはありません。 さて、今回は、Icon日記の(たぶん)最後の話題、Recordです。 使い道がよく分かっていないのですが、とりあえずサンプルを。 -----^ PLANET.ICN ( date:97-03-18 time:01:15 ) ------------- planet.txt とした時の結果です。 -----^ PLANET.TXT ( date:97-03-18 time:01:17 ) ------------- BGM: 愛よりも激しく、誰よりも愛しく/Favorite Blue (icon_126.txt 1997/03/18 PCVAN PIG) ■ Icon > Icon日記(30) むすび 風つかい Iconのプログラム解説と雑記帳が混ざった Icon日記でしたが、generatorの解説が 一応できたところで、Icon日記を終わります。 generatorを使ってみると、Iconは確かにテキスト(文章)処理言語だという気が します。 Iconはテキストファイルを、1文字(=1バイト)づつ処理していきます。 その次に、1文字の集まりの 単語やデータ の処理という構成を取ります。 ですから、日本語のような複数バイトで1文字を構成する言語に対しても、ユーザ が、日本語対応の procedureを容易に構成できます。 この時 generatorが活躍しま す。 一方、AWKですと、行が基本処理単位で、行をFS(Field Separator)で分割して、 単語やデータを取り出して処理します。 そのため、行をデータのかたまりとして処理するときは非常に便利です。 表の 形式のデータ処理なんかは得意ですよね。 しかし、テキストデータを ・1文字づつ処理 しようとしたり、 ・文章を頭からなめて文字や単語の出現順に何かの処理 を加える というような処理では、逆に不便になります。 勿論、AWKでもやればできる訳で、 ・1文字づつの切り出しも substr関数で、 ・単語の出現順の処理も 単語をキーとして出現位置を連想配列に格納すれば、 できます。 でも結構、無理をしているという気がしていました。 こういう場合は Iconが向い ていると思います。 AWKでは、まず行ありき。 Iconでは、まず文字ありき。 と感じます。 ところで、Iconの道はまだまだ続いています。テキスト解析言語と紹介しておきな がら、テキスト解析という程のプログラムを未だ書いていないんですね〜。 コンパイラを書こうと迄は言いませんが、せめてアセンブラ位は書いてみたいです。 グラフィック機能もまだ手がついていません。 その辺は、次のシリーズで研究してみたいと思います。 というところで、ひとまず Icon日記を終わります。長文にお付き合い頂きまして、 ありがとうございました。 気がつけば、もう春。 風つかい (TRA11936@biglobe.ne.jp/PFF01531@niftyserve.or.jp) < IconのWWWは、http://www.cs.arizona.edu/icon/index.html > BGM: エロティカ・セブン/サザン・オールスターズ (icon_128.txt 1997/03/20 PCVAN PIG)