祝 、、、

前回の枕で、ごきぶり発見ー>抹殺した事を書いた。女房の話をまとめると、「ごきぶりに おける、ハインリッヒの法則」が成り立つな。

曰く、ごきを一匹見つけると、そのファミリィが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

昔の事なんですねぇ。さすが、必要は発明の母! 今日はちと疲れたので、これにて打ち止め。