親子丼(5)
実家の庭に生えている柿を採取した。久しぶりに登る脚立が怖かった。だって、上の方に ばかり生っているんだもん。取っても取っても取りきれなかった。ばけつ3杯分は有った かなあ。残りは鳥さんのデザートって事にしてあげた。
炬燵に入ってぬくぬくしながら食べたんだけど、柿の種って幾つあるのが正解なんだろう? 3つ食べてみたけど、種が7つのやつが2個、8つのやつが1っ個あった。今年の研究課題は 柿には幾つ種が入っているかだな。食べる度に数をメモしておくか。
地区の神社で、今年最後の収穫祭が催されていた。落花生、胡桃、干し柿、アップルパイ、 焼きリンゴ、大根、白菜等が 売られていた。出かけるのが遅かったので、きのこ汁や柿のケーキは既に売り切れだった。 残念でした。
おいらは、100円で銀杏と、1本50円の大根をお買い上げ。そしたらおばちゃんがおまけで 大根葉をサービスしてくれた。食べる大根じゃなくて、食べ用の葉っぱだ。どうやって食べよう? 小女子あたりと炒めればいいのかな。食材豊富で嬉しいな。
ちょいと浮気でrhizome
つらつらとIEしてたら、 Scheme FAQなんてのに出合った。 見てくと、いろいろなSchemeが列挙されてて面白い。我が日本発のはないかと思ったら、URLから rhizome/piが日本製と判明した。
能書きを見ると、Windowsでも動くよと。嬉しい事にbccでもコンパイル出来るみたい。 これは、やってみる鹿。
C:\homes\rhizome-0.57\pi>make MAKE Version 5.2 Copyright (c) 1987, 2000 Borland cd ..\kappa make MAKE Version 5.2 Copyright (c) 1987, 2000 Borland bcc32 -q -k- -O2 -w- -4 -DWIN32 -DRK_BIND_EXPORT -I..\include -c cellhdlr.c : number.c: bcc32 -q -B -k- -O2 -w- -4 -DWIN32 -DRK_BIND_EXPORT -I..\include -c ldso.c ldso.c: エラー E2133: コマンド 'tasm32.exe' を実行できない ** error 1 ** deleting ldso.obj ** error 1 ** deleting all
何とまあ、bccと言いつつ、アセンブラーが必要みたい。調べてみたらボーランドから無償提供 されてたみたいなんだけど、2009年に配布が打ち切られてる。後継のソフトに同梱されてるって 噂が有ったけど、後継ソフトをDLするにはユーザー登録が必要なので諦めた。
更に調べると、怪しいダウンロード サイトにtasm32が陳列して有った。 DLするにはユーザー登録しろとな、そして金払えですって。思わず中古品を売ってる尼ゾンを 連想しちゃったよ。潔く名誉ある撤退。
でも、たかがアセンブラだろ。nsamとか代替品は使えないかなあ? 吐き出されたldso.asmをちょい見してみたけど、方言が強そうで始末に終えないと思い諦めた。 bccを諦めてlcc-win32に倉替えしようかなあ。
まあ待て待てその前に、ArchLinuxに舞台を移してみるか。
[sakae@arch ~]$ pi pi: (* 1111111111111111111111111 111111111111111111111111111111) 123456790123456790123456777777654320987654320987654321 pi: *invocation-arg* ("pi") pi: (exit)
次はコンパイルしてみます。
[sakae@arch ~]$ cat a.scm (define (fact n) (if (= n 1) 1 (* n (fact (- n 1))))) (display (fact 20)) [sakae@arch ~]$ pisc a.scm [sakae@arch ~]$ wc a.c 319 920 9129 a.c
次はリンクだな。
[sakae@arch ~]$ pisl a gcc -O2 -mtune=i686 -falign-functions -c a.c a.c:2:21: fatal error: rhiz_pi.h: No such file or directory compilation terminated. [sakae@arch ~]$ pisl -h $Id: pisl.scm,v 1.11 2004/08/06 05:48:06 qfwfq Exp $ usage: pisl [-cc <cc command>] [-ld <ld command>|-nold] [-nolib] [-loadable|-static|-modlib] [-windows] [-o <output>] [-s <startup>] [-base <address>] {-xm stdmacro|expand|debugger|stdproc|extcall|saccess}... {-aux <file>}... module[:file] ... default is <cc command> = "gcc -O2 -mtune=i686 -falign-functions -c" (for -loadable) "gcc -fpic -O2 -mtune=i686 -falign-functions -c" <ld command> = "gcc" (for -loadable) "ld -Bshareable" (for -windows) "gcc" link library is "-lrhzpisys -lpthread -lm -ldl" (for -static) "-lrhzscm -lrhzpi -lrhizome -lpthread -lm -ldl" (for -loadable) <none>
はて? 何処で間違ったのだろう?
[sakae@arch ~]$ gcc -O2 -mtune=i686 -falign-functions -I/usr/local/lib/rhizome -L/usr/local/lib/rhizome a.c /usr/lib/gcc/i686-pc-linux-gnu/4.6.2/../../../crt1.o: In function `_start': (.text+0x18): undefined reference to `main' /tmp/ccHdZkqz.o:(.rodata+0x20): undefined reference to `RpCrp_fasrRun' : /tmp/ccHdZkqz.o:(.rodata+0x88): undefined reference to `RpCrp_toplInit' collect2: ld returned 1 exit status
もう少し頑張ってみるか。
lcc32
思い余って、lcc32を入れちゃったよ。資料は、 フリーコンパイラたち LCC-Win32 とか Cプログラムの作成 とか lcc-win32用統合開発環境 とか LCC-Win32でHSPの拡張プラグインを作ろう を見ればよい。(って、暇を持て余してるな)
準備が整ったのでコンパイルしてみた。インタプリタのpiは普通に動くけど、その他のソフトは やはり、Archのそれと同じような問題を抱えている。旨くアプリケーションをコンパイル 出来ないんだ。余り深入りするのも何なので、このあたりで撤退。
かくして、lcc32の開発環境が残りました。ちょいとWindowsでCするにはいいかも知れません。 ちゃんとdebggerも付いてるしね。
リベンジ
再びrhizomeのインストール辺を見てたら、使うに当たって環境設定しろとな、すっかり見落として いたよ。(スマソ) ちゃんと整えて再チャレンジすべ。
[sakae@arch ~]$ export RHIZOME_LIB=/usr/local/lib/rhizome [sakae@arch ~]$ pisc a.scm [sakae@arch ~]$ pisl a gcc -O2 -mtune=i686 -falign-functions -I/usr/local/lib/rhizome -c a.c gcc -O2 -mtune=i686 -falign-functions -I/usr/local/lib/rhizome -c a.c gcc -L/usr/local/lib/rhizome -Wl,-R/usr/local/lib/rhizome a.o a.o -lrhzpisys -lpthread -lm -ldl a.o: In function `RpProgramDesc': a.c:(.text+0x0): multiple definition of `RpProgramDesc' a.o:a.c:(.text+0x0): first defined here a.o:(.rodata+0x0): multiple definition of `rp_in_windows_subsystem' a.o:(.rodata+0x0): first defined here a.o:(.rodata+0x44): undefined reference to `RpCaRun' a.o:(.rodata+0x84): undefined reference to `RpCaInit' a.o:(.rodata+0x44): undefined reference to `RpCaRun' a.o:(.rodata+0x84): undefined reference to `RpCaInit' collect2: ld returned 1 exit status
でも、エラーしてる。何で? a.cを2回もコンパイルしてるの。使い方辺を見てると、ターゲットが arg.scmなのに、どこからともなくa.cが湧き出てるように見える。と言う事は、a.scmの名前が 被っているって事かな。
ターゲットの名前を変えてやってみよう。
[sakae@arch ~]$ mv a.scm x.scm [sakae@arch ~]$ rm a* [sakae@arch ~]$ pisc x.scm [sakae@arch ~]$ pisl x gcc -O2 -mtune=i686 -falign-functions -I/usr/local/lib/rhizome -c x.c gcc -O2 -mtune=i686 -falign-functions -I/usr/local/lib/rhizome -c a.c gcc -L/usr/local/lib/rhizome -Wl,-R/usr/local/lib/rhizome a.o x.o -lrhzpisys -lpthread -lm -ldl [sakae@arch ~]$ ./a.out 2432902008176640000./a.out: (+ 1 2 3 4 5) 15 ./a.out: (exit) [sakae@arch ~]$
出来たバイナリーを動かしたら、replが回り始めちゃったけど、ちゃんと動いてるっぽい。 で、replが回らないように、exitさせちゃえばいいのか。
[sakae@arch ~]$ cat x.scm (define (fact n) (if (= n 1) 1 (* n (fact (- n 1))))) (define (main) (display (fact 20)) (newline) ) (main) (exit)
[sakae@arch ~]$ pisc x.scm [sakae@arch ~]$ pisl x gcc -O2 -mtune=i686 -falign-functions -I/usr/local/lib/rhizome -c x.c gcc -O2 -mtune=i686 -falign-functions -I/usr/local/lib/rhizome -c a.c gcc -L/usr/local/lib/rhizome -Wl,-R/usr/local/lib/rhizome a.o x.o -lrhzpisys -lpthread -lm -ldl [sakae@arch ~]$ ./a.out 2432902008176640000
やっと思い通りになったわい。
slime
遊びは止めて、本流のchickenへ戻ります。玉子のカタログを見ていたら、slimeなんてのを発見。 これって、schemeでも使えるアレですかい。孵化させてみる鹿。
古いNotePCに入れてるFreeBSD6.4ではちゃんと動いたけど、VMWare上のFreeBSDでは途中で 止まってしまう。ちゃんと動いた方の記録、*inferior-lisp* 上には
; loading /usr/local/lib/chicken/6/sxml-transforms.so ... ; loading /usr/local/lib/chicken/6/matchable.so ... READ 00002d(:emacs-rex (swank:connection-info) nil t 1) WRITE "00007D(:return (:ok (:pid 9333 :package (:name CSI :prompt CSI) :lisp-implementation (:type \"Chicken Scheme\" :version \"4.7.0\"))) 1)" READ 00002d(:emacs-rex (swank:create-repl nil) nil t 2) WRITE "00001F(:return (:ok (\"CSI\" \"CSI\")) 2)"
こんな表示が出てた。これって、サーバーとのやり取りの記録かな。そして、*slime-events*には
(:emacs-rex (swank:connection-info) nil t 1) (:return (:ok (:pid 9333 :package (:name CSI :prompt CSI) :lisp-implementation (:type "Chicken Scheme" :version "4.7.0"))) 1) (:emacs-rex (swank:create-repl nil) nil t 2) (:return (:ok ("CSI" "CSI")) 2)
これと、swank-chicken.scm、chicken-slime.elのソースを読み合わせするといいのかな。先は 長そうだ。