親子丼(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のソースを読み合わせするといいのかな。先は 長そうだ。