祝 、、、
前回の枕で、ごきぶり発見ー>抹殺した事を書いた。女房の話をまとめると、「ごきぶりに おける、ハインリッヒの法則」が成り立つな。
曰く、ごきを一匹見つけると、そのファミリィが30匹は居る。そして、次世代ごきが300匹 は存在すると。
BUGにも成り立つかな? 一つBUGを見つけると、その周辺には30のBUGが存在する。そしてBUG の萌芽が300は有ると。これ、ちと誇張しすぎ?
まあ、コピペでプログラムを増殖させてたりしたら、あながち誇張とも言い切れないか。おお 怖。
先のごきのハインリッヒが、成り立つなら、今頃は、地球上がごきで埋め尽くされているはず だが、そうなっていないのは何故? 秋の夜長に考えてみるのにうってつけ!
祝 Haskell本出版
Real World Haskellが10/24 Programming in Haskellが11月初旬の出版予定とか。
いずれもこの業界では、有名な本である。翻訳を担当された方から、出版記念パーティの 回覧板が回ってきたり、広告が 出ていたりする。ひょっとして、この頃には、GHC 6.12.1が正式リリースしているのだろうか?
祝 Lispの神様ご光臨
先週の土曜日は、Shibuya.lispの席・争奪戦で大変だったよ。 あっと言う間に埋まっちゃったものなあ。それだけ、怖い物見たさな人が多いって事?
席が埋まったけど、LTの枠がまだあるので、5分喋るという事で、潜り込む方法を画作されて る人がいたりして、ほほえましい。Lisp業界の有名な本、On Lisp とか PCL とか LOL とかが たて続きに出版されたけど、誰が裏で糸を引いているか暴露しちゃうぞというネタ。 2冊はあの人の差し金。もう一冊は、個人企画。
あれれ、最近出た関数プログラミング教科書 も、あの人の差し金間違い無しだな。だって、CDROMに名入の体験版が付いているんだもの。
ああ、ちと横道に反れてしまったわい。話を元に戻して、、何が怖いって、普通の人には()なんですかねぇ。「括弧、ああ、そんなものがあったのう」と 言う、神様が光臨されます。
utilispの近山先生、 TAOの竹内先生。いきなり秋葉原に "ぬえ"が出現して、ちとびっくり。 先週、行ってきたばかりではないですか。
記念に、utilispを入れてみようかと思い、先生の所のリンクを辿ってみたが見つからず。しょうがないので あの方のページへ行ってみる。 最新のものは無いけど、古目の資料がばっちり揃っている。
また、祝になりそうなのに、gaucheも上げておこう。そろそろの予感がするぞ。
AM-scheme
上のリンクを辿って、AM-Schemeを やってみる。Windows上のMinGWで動くのかなあ?
c:\sakae\v110\src>ls ChangeLog amscm.c eval.c memory.c print.c DESCRIP.MMS amscm.h generic_os.c mk.c read.c Makefile.bsd amscm.scm init.c numop.c test.scm Makefile.mpw ansi_con.h int.c op.h Makefile.msc config.h listobjs prim.c Makefile.sysv error.c mac_da_os.c prim.h
いろいろなMakefileが用意されてる。mpwって昔のMacのコンパイラ用だったような。懐かしい。 さて、どれを選ぼうか?
c:\sakae\v110\src>gmake -f Makefile.bsd cc -g -O -DBSD -DDOUBLEALIGN -c -o amscm.o amscm.c gmake: cc: Command not found gmake: *** [amscm.o] Error 127
しょうがないので、Makefile.bsdを見て、CC = gcc に変更。ついでに、-g も付けて、debug 出来るようにしておく。
gcc -g -O -DBSD -DDOUBLEALIGN -c -o amscm.o amscm.c gcc -g -O -DBSD -DDOUBLEALIGN -c -o error.o error.c gcc -g -O -DBSD -DDOUBLEALIGN -c -o eval.o eval.c gcc -g -O -DBSD -DDOUBLEALIGN -c -o generic_os.o generic_os.c gcc -g -O -DBSD -DDOUBLEALIGN -c -o int.o int.c gcc -g -O -DBSD -DDOUBLEALIGN -c -o init.o init.c gcc -g -O -DBSD -DDOUBLEALIGN -c -o memory.o memory.c gcc -g -O -DBSD -DDOUBLEALIGN -c -o mk.o mk.c gcc -g -O -DBSD -DDOUBLEALIGN -c -o numop.o numop.c gcc -g -O -DBSD -DDOUBLEALIGN -c -o prim.o prim.c gcc -g -O -DBSD -DDOUBLEALIGN -c -o print.o print.c gcc -g -O -DBSD -DDOUBLEALIGN -c -o read.o read.c gcc -o amscm -g -O -DBSD -DDOUBLEALIGN amscm.o error.o eval.o generic_os.o int.o init.o memory.o mk.o numop.o prim.o print.o read.o -lm int.o: In function `copy_integer': c:/sakae/v110/src/int.c:67: undefined reference to `bcopy' int.o: In function `int_to_string': c:/sakae/v110/src/int.c:588: undefined reference to `bcopy' c:/sakae/v110/src/int.c:599: undefined reference to `bcopy' memory.o: In function `re_allocation': c:/sakae/v110/src/memory.c:140: undefined reference to `bcopy' c:/sakae/v110/src/memory.c:148: undefined reference to `bcopy' memory.o:c:/sakae/v110/src/memory.c:165: more undefined references to `bcopy' follow collect2: ld returned 1 exit status gmake: *** [amscm] Error 1
あらら、MinGWってbcopy無いのか。つうか、BSD系じゃないのか。と言う事は、sysvで試してみる鹿。
c:\sakae\v110\src>gmake -f Makefile.bsd clean rm -f core *.o amscm tmp? *~ c:\sakae\v110\src>gmake -f Makefile.sysv gcc -g -O -DSYSV -DDOUBLEALIGN -c -o amscm.o amscm.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o error.o error.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o eval.o eval.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o generic_os.o generic_os.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o int.o int.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o init.o init.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o memory.o memory.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o mk.o mk.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o numop.o numop.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o prim.o prim.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o print.o print.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o read.o read.c gcc -o amscm -g -O -DSYSV -DDOUBLEALIGN amscm.o error.o eval.o generic_os.o int.o init.o memory.o mk.o numop.o prim.o print.o read.o -lm
c:\sakae\v110\src>amscm.exe Hello, This is AM-Scheme Interpreter Version 1.10 allocated 2*300000 bytes main memory areas allocated 4*10000 bytes stack areas Warnning: Unable to open /usr/local/lib/amscm.scm > (+ 123 456) 579 > (exit) Good Luck!!
一応動いてるっぽい。でも、初期化ファイルが見つからんのエラーが出てるな。config.hを いじって、exeと同じ所から探すようにしたよ。config.hを見てたら、bcopyの変わりは memcpyが務めているんだな。あっ、逆だよ。間違いやすいなあ。
#ifdef BSD #define memcpy(dst, src, len) bcopy((src), (dst), (len)) #endif
c:\sakae\v110\src>amscm.exe Hello, This is AM-Scheme Interpreter Version 1.10 allocated 2*300000 bytes main memory areas allocated 4*10000 bytes stack areas ;loading ./amscm.scm > (define (f n) (* n n)) f > (f 111111111111111) 12345679012345654320987654321
今度は、ちゃんと動いてるな。さすが、Scheme R4RS と言えども、ちゃんと多倍長演算を サポートしてるよ。さて、この演算は何処でやっているんだろう?
ソースを読もうとしたら、#ifdef XXX #else YYY #endif の山で、読む気が失せた。何とか 関係無い部分を消すソフトがないかと探してみたよ。そしたらCソース中の大量のifdefを読みやすくしたい(ツール探索編)CommentsAdd Star というページを発見。悩みはみな同じですねぇ。
unifdef
MinGWでもUnixでも使えそうと言う事で、unifdef を試してみる。変換した結果が画面に出てくる ようなので、簡単なスクリプトを書いた。
c:\sakae\v110\src>cat DELIF.sh #!/bin/sh for f in *.c do unifdef -DTHINK_C_DA $f >$$ mv $f ORG/$f mv $$ $f done
早速、実行してみる。
c:\sakae\v110\src>sh DELIF.sh c:\sakae\v110\src>grep THINK_C *.c File generic_os.c: #ifdef THINK_C #ifdef THINK_C c:\sakae\v110\src>gmake -f Makefile.sysv clean rm -f core *.o amscm tmp? *~ c:\sakae\v110\src>gmake -f Makefile.sysv gcc -g -O -DSYSV -DDOUBLEALIGN -c -o amscm.o amscm.c gcc -g -O -DSYSV -DDOUBLEALIGN -c -o error.o error.c error.c: In function `reset': error.c:58: error: `eval_operator' undeclared (first use in this function) error.c:58: error: (Each undeclared identifier is reported only once error.c:58: error: for each function it appears in.) gmake: *** [error.o] Error 1
消し切れなくて、そのままになっている所もあるようだが、取り合えず再コンパイルした。 どうやらまずい所を消しちゃったみたい。ちゃんとmanを見たら、#defnif に対応する スイッチは、-U っぽい。スクリプトを修正してもう一度やり直し。
今度はうまくいった。残っていたgeneric_os.c の方は、手動で削除したよ。それにしても、#ifdef XXX と #ifndef XXX が混在してると、やっかいだなあ。でも、有用なツールだから FreeBSDにも入れておくか。
で、FreeBSDで調べてみたら、最初から入っていた。manによると
歴史 unifdef は 4.3BSD から登場しました。 ANSI C サポートは FreeBSD 4.7 で追加 されました。
ソースを見ると
#ifdef __IDSTRING __IDSTRING(Berkeley, "@(#)unifdef.c 8.1 (Berkeley) 6/6/93"); __IDSTRING(NetBSD, "$NetBSD: unifdef.c,v 1.8 2000/07/03 02:51:36 matt Exp $"); __IDSTRING(dotat, "$dotat: things/unifdef.c,v 1.171 2005/03/08 12:38:48 fanf2 Exp $"); #endif
昔の事なんですねぇ。さすが、必要は発明の母! 今日はちと疲れたので、これにて打ち止め。