親子丼(3)

17日に新酒のワインが解禁された。いわゆるボジョレーヌーボーってやつだ。これワイン業界の 悪巧み。円高だと言うのにお高いぞ。人の足元見てる。

TPPも始動した事だし、もうフランスは見切って、カロフォーニアとかチリとかオーストリアの ワインに期待ですかね。頑張れドジョウ。

時々造り酒屋の前を通るんだけど、新酒ができたぞーの看板、杉玉はまだ架け替えられていない。 もう少し寒くなってからかな。

おいらは新○○に弱いんだなあ。今なら新蕎麦って事で、2週続けて新蕎麦を食べに行ってきた。 最初に行った店では、とろろ、大根、きのこの3種混合版を頼んだ。上品な店だったので量は 少なめ。蕎麦も上品に色白の細麺だった。

二回目の店では天ざるを頼んだ。地元の野菜と大降りな海老2本の天麩羅。蕎麦は色黒の太めで 大地にどっしりと言った感がしたよ。この店の蕎麦湯が独特だった。非常に濃いのだ。濃いと 言うよりトロミがかってた。こんな蕎麦湯は初めてですよ。病み付きになりそう。

土産を売っていた。蕎麦パスタ、蕎麦のクッキー、蕎麦かりんとう、そして蕎麦粉とつなぎに 使う綿穂って言う綿のような繊維。ひょっとしたらススキの仲間かな? この地では土壁を作る時、土のつなぎとしてわらを混ぜる けど、それと一緒だな。

おいらの甥っ子が村の蕎麦打ち大会で中学校の頃、優勝したとか。なんでも祖母の手伝いを してるうちに覚えたらしい。今度、蕎麦打ちやってね。材料は用意しておくから。

色白蕎麦と色黒蕎麦、違いは蕎麦の花で見分けられるそうな。白い花を付けるのが色白になり、 赤い花を付けるのが色黒になるとか。種類が違うのね、そんな事初めて知りましたよ。

寒くなる前に、3軒目の蕎麦屋を目指してみるかな。今度はどんな蕎麦に巡り合えるのだろうか。 楽しみだな。

numbers

もう暫く前だけど、Jobsの伝記が出たみたいだ。近くの本屋へ行ったら、田舎には珍しくJobsの コーナーもどきが出来ていた。でも、Jobsはおろか林檎マークは、いつの頃からか嫌いになった んだな。

んでもって、XX嫌いなんてのを面白半分で調べていたら(XXの部分には好きな(嫌いな)語句を 入れる)、面白いのに出合ったよ。

Excelの馬鹿さ加減と言うか重箱の隅を 集めた人だ。そこからリンクされてた EXCELで階乗が面白かったですだ。 ganmaを使えとな。

親子丼のCHICKENで普通にやると、

#;2> (fact 20)
2.43290200817664e+18
#;3> (fact 300)
+inf

こんな具合に(あろう事か)浮動小数点で答えが返ってきてしまいます。これじゃSchemeらしく ないですなあ。おまけにオーバーフローまでしてしまって、正にEXCEL並みです。気を取り直して FAQを見たら、普通の人にはそれで十分でしょ、ですって。変な人はnumbersってのを卵から 孵せとな。

#;6> (use numbers)
; loading /usr/local/lib/chicken/6/numbers.import.so ...
Note: re-importing already imported identifier: +
Note: re-importing already imported identifier: -
  :
Note: re-importing already imported identifier: finite?
; loading /usr/local/lib/chicken/6/numbers.so ...
#;10> (fact 50)
30414093201713378043612608166064768844377641568960512000000000000
#;11> (make-rectangular 3 4)
3+4i

これで普通のSchemeに成りました。なお、普通になって複素数も普通に使えます。でも、eとかpiが 入っていないなあ。ちょっと不親切。(まあ、計算出来ますけどね)

#;13> (exp 1)
2.71828182845905
#;14> (* (acos 0.0) 2)
3.14159265358979

PIと言えば、10兆桁まで計算しちゃった人が居ますね。(ギネス認定で、ギネスビール1年分とかの 賞品は貰えないのかな)その方の 奮闘の記録(去年度版) が、EXCELアルバムで公開されてます。

compile-file

CHICKENをemacsから使っているんだけど、C-c C-k (compile-file) しようとすると、

#;1>
Error: unbound variable: compile-file

        Call history:

        <syntax>          (compile-file "/home/sakae/chi/fact.scm")
        <eval>    (compile-file "/home/sakae/chi/fact.scm")     <--

こんな風にエラーになっちまう。そんな関数無いとな。ほんとーか? 目を皿のようにして、 マニュアルを流し読みしてたら、(use utils) しろとな。

#;1> (use utils)
; loading library utils ...
#;2> ; compiling /home/sakae/chi/fact.scm ...
; loading /tmp/temp3af8.so ...
; loading /usr/local/lib/chicken/6/numbers.so ...
"/tmp/temp3af8.so"

コンパイラ(chicken and gcc)が裏で走るので、一瞬息が詰まります。soファイルが一時的に 作られて、それがロードされてパワー10倍になります。正しく、セッションを終了すると、終了時に 一時ファイルは削除されるけど、強制終了しちゃった場合は、残骸が残っちゃうから、自分でGC しましょ。

apropos

追加で玉子を孵しておくと、何かと便利。

#;1> (use apropos)
; loading /usr/local/lib/chicken/6/apropos.import.so ...
; loading /usr/local/lib/chicken/6/scheme.import.so ...
    :
#;2> (apropos 'car)
car                                 procedure (p)
car+cdr                             procedure (pair223)
set-car!                            procedure (x262 y263)
type-checks#check-cardinal-fixnum   procedure (loc67 obj68 . args69)
type-checks#check-cardinal-integer  procedure (loc89 obj90 . args91)
type-checks#check-cardinal-number   procedure (loc111 obj112 . args113)
type-errors#error-cardinal-fixnum   procedure (loc339 obj340 . tmp338341)
type-errors#error-cardinal-integer  procedure (loc373 obj374 . tmp372375)
type-errors#error-cardinal-number   procedure (loc305 obj306 . tmp304307)
#;3> ,a cons
alist-cons  procedure (key817 datum818 alist819)
cons        procedure (x255 y256)
cons*       procedure (first87 . rest88)
constantly  procedure xs88
xcons       procedure (d62 a63)

これらの玉子をcsi起動直後から使いたかったら、.csircに書いておけばよい。

[sakae@cdr ~]$ cat .csirc
(use apropos)
(use readline)
(current-input-port (make-gnu-readline-port))

compile and debug

はて、chickenはその大部分がSchemeで書かれていて、そいつをCに変換して、アプリケーションを 作っている。そのあたりがどうなっているか、見てみたい。

と言っても、いきなりでは討ち死にするに決まっているので、 東京大学院通信講座 を取ってみる事にした。(本当はハワイ大学の方がいいんだけど。。。)

手を動かせ(写経)ってのが流行っているみたいなので、取りあえず手を動かしてみる。 ああ、違った、gdb動かして追ってみよう。

普通にやろうとすると、DEBUGBUILD=1 としてchickenをコンパイルし直さないと、深い所まで 潜っていけないので、ちょっと別の手を考えてみた。(偉そうに書いたけど、配布パッケージを 作る時のやり方をパクッただけです)

簡単なSchemeスクリプトをCにしてgdbにかけられるように、Makefileを書いた。

.SUFFIXES:      .scm .c

SRC  = t.c

OBJS = runtime.o library.o eval.o expand.o $(SRC)

CFLGS = -g
#CFLGS = -static -Os -fomit-frame-pointer

me:     $(OBJS)
        gcc $(CFLGS) -o $@ $(OBJS) -lm
#       strip $@

.c.o:
        gcc $(CFLGS) -c $<

.scm.c:
        chicken -to-stdout $< | indent > $@

t.scmをt.cに(chickenで)変換して、それと最低限必要なファイルを、デバッグオプション付きで コンパイルするやつだ。コメントを外してあげると、可搬のバイナリーファイルが出来るよ。

[sakae@cdr ~/t]$ echo '(print "Ans = " (+ 123456 654321))' > t.scm
[sakae@cdr ~/t]$ make
gcc -g -c runtime.c
gcc -g -c library.c
gcc -g -c eval.c
gcc -g -c expand.c
chicken -to-stdout t.scm | indent > t.c
gcc -g -o me runtime.o library.o eval.o expand.o t.c -lm
[sakae@cdr ~/t]$ ./me
Ans = 777777

debug情報が付いているとは言え、たかが足し算の結果を表示するだけで、3Mのファイルに なりました。可搬のために、chickenライブラリを内蔵してますからねぇ。

[sakae@cdr ~/t]$ gdb me
GNU gdb 6.1.1 [FreeBSD]
(gdb) b main
Breakpoint 1 at 0x81b8ec0: file t.c, line 48.
(gdb) run
Starting program: /usr/home/sakae/t/me

Breakpoint 1, main (argc=Error accessing memory address 0x2: Bad address.
) at t.c:48
48      C_main_entry_point
(gdb) n
main (argc=1, argv=0xbfbfe758) at t.c:48
48      C_main_entry_point
(gdb) n
CHICKEN_run (toplevel=0x0) at runtime.c:1323
1323      if(!return_to_host)
(gdb) n
1324        (C_restart_trampoline)(C_restart_address);
(gdb) n
1323      if(!return_to_host)
(gdb) n
1324        (C_restart_trampoline)(C_restart_address);
(gdb) n
1323      if(!return_to_host)
(gdb) n
1324        (C_restart_trampoline)(C_restart_address);
(gdb) n
1323      if(!return_to_host)
(gdb) n
1324        (C_restart_trampoline)(C_restart_address);
(gdb) n
Ans = 777777
1323      if(!return_to_host)
(gdb) n
1324        (C_restart_trampoline)(C_restart_address);
(gdb) n

Program exited normally.

Uum ....

windowsとか

ChickenもWindowsで動く。ソースを見れば、cygwin用とかのレシピが載ってたりする。そして おいらも昔やった(そして疲れた)こちらにも、 Windowsで頑張っておられる方が 居た。頑張ってくらはい。

Windowsは一般の代名詞、Schemeはまあ、ニッチな業界の代名詞、Javascriptは一般名詞っつう事で、 SchemeとJavascriptの対応表 をまとめておられる方がいた。こちらも、貴重なお人だ。