cut-sea:log2

cut-sea:log2

過去ログ(2005/01/01-2005/12/31)


NetBSD 3.0

あ、出たらしい。 さて、どのタイミングで入れるかが問題だ。cut-sea:2005/12/25 03:01:08 PST


Scheme入門GET

九州の方で10年程寝かされたものを入手。cut-sea:2005/12/23 05:11:55 PST


Lispセミナーの竹内先生の資料

ようやく公開された。 「タライ回し関数の正体」

メモ取りそこなっててずっと気になってた。

t(x y z) =
  if x <= y then y
            if y <= z then z
                       else x

ってことで、どんな引数だろうがxかyかzしか返ってこない。 確かにそうで、減算があるのは第一引数だけで、返りは常に第二引数なんだもんね。

これも併せてcut-seaの必見はスライド8スライド11スライド13。

car/cdrだけでなく、csr/cpr/cir/cwrなんてのがあった。 竹内先生がcar/cdrだけじゃなく4つのセルをもつLispを作ったってMcCarthyに言ったら 懐かしそうに、「初期Lispは5つのセルから構成してたんだ」って語ってくれたって話。cut-sea:2005/12/08 17:16:20 PST


コンビネータ

目から鱗

そうだったのか。コンビネータってコ難しい理屈のページばっかだから、 敬遠してたけど、なんのことねーじゃん。 すんげー悟りの瞬間だったよ。 いや、別に難しくないし、確かになんで今まで気づかなかったというか 意識しなかったんだか分からんが、これがコンビネータだったわけね。 頭の中でFFのレベルアップ音楽が流れた。cut-sea


SDOM

いつのまにこんなものが… cut-sea:2005/12/04 15:29:47 PST


Franzのセミナー

2日間みっちり行ってきました。 講演後、竹内先生にお願いして「はじめての人のためのLISP」2冊にサインを。 私をS式の世界にいざなった本です。 これで思い残すこと無し。cut-sea:2005/11/18 18:30:51 PST


Gauche-0.8.6

アップした。
pthreadsを使いたいのでさんのパッチを落して来て CVS HEADにパッチあてから格闘することしばし。 makeじゃダメでgmakeを使わにゃならんというのを知らず。。。orz
でもなんとか

cut-sea@nkisi> gosh -V
Gauche scheme interpreter, version 0.8.6 [euc-jp,pthreads]
cut-sea@nkisi> gauche-config  --reconfigure
./configure '--with-slib=/usr/pkg/share/slib'
            '--with-local=/usr/pkg'
            '--with-prefix=/usr/local'
            '--enable-ipv6'
            '--with-rpath=/usr/local/lib:/usr/pkg/lib:/usr/lib'
            '--with-iconv=/usr/pkg'
            '--enable-multibyte=euc-jp'
            '--enable-threads=pthreads'

さらにshibataくんの書いたマルチスレッド版echoサーバも動いたよ〜。
さんサンクス!!!cut-sea:2005/11/05 05:34:41 PST


OnLispのCLOS入門

意外に基本的なところからやってくれてる?
分かりやすいのかもしれない。cut-sea:2005/11/01 07:38:35 PST


The Reasoned Schemer

来た。Olegさんも著者の一人らしい。


format

そうか。改めてformatって文字列のformatなんだと思う。

gosh> (format "~a : ~a -> ~a~%" 1 2 3)
"1 : 2 -> 3\n"
gosh> (format #t "~a : ~a -> ~a~%" 1 2 3)
1 : 2 -> 3
#<undef>
gosh> (begin (format "~a : ~a -> ~a~%" 1 2 3) 123)
123
gosh> (begin (format #t "~a : ~a -> ~a~%" 1 2 3) 123)
1 : 2 -> 3
123

まさに文字列になっている。#t/#fでもって副作用目的になる感じか。cut-sea:2005/10/22 19:57:54 PDT


AMOP Chapter4読了

ふう。かなりてこずった上に正直言って分かりませんでした。
なんつーか読後の感想ってのが出て来ないくらいさっぱり。

でも一応これで2部構成の1部が終った。 で、第2部はどっちかってーとマニュアルっぽい感じみたいなので読まない。 読むなら再度Chapter1からだけど、まぁ他を巡回して知識蓄えてから再チャレンジ。(予定)

で、再認識した。
S式が多い内は大丈夫。比率が下がると理解がついて行かない。
ってことは原書を読んでいるんだけど、S式を読んでたわけだ。 確かに自覚はある。cut-sea:2005/10/13 07:06:44 PDT


いつものことだが

どうも設計力が無いというか構成力が無いというか見通しの甘さが悔しいくらい。

簡単な様でいて、いじっている内に劇的に変えたくなってくる。 どうもその時に、ちょっとした変更で済むように構成できてないことが多すぎる。cut-sea:2005/09/28 21:44:04 PDT


AMOP Chapter3読了

どうも想像してた程、「あっすっげー新鮮〜」て感触はなかった。
もともとChapter1,2でCLOSの小さな実装を解説してて、 どんな風にクラスやインスタンスが初期化されるか、どんな風にメソッドが適用されるのか みたいなのを済ませているので、そういったいくつかのgeneric functionを class specificなもので置き換えるってのは、単にちょっとしたHackっぽいものに見える。

Chapter3では、

などなど、具体的な事例が出てて、MOPを使う(この表現怪しいけど)って 「そんなに特別なことじゃない」んだねって感じ。
でも、やっぱり目的に対してMOPを必要とするかどうかの判断は未だ掴めない。orz
つまり、(本の表現を借用すると)どこまでがon stageでどこからがback stageなのかが 自分の中できちんと明確になってない。 だって、back stageまで全部書かれてるんだもん。(^^;;

あ、そうそう。他の言語のcpl計算をエミュするところで思った。
CLOSの継承の順序が一番意味分からん。orzcut-sea:2005/09/15 18:11:00 PDT


ヒモツキじゃない環境ってすばら〜すぃ

CG-WLCB54GLってデバイスを入手。(Coergaのカード)
ralなpatch(ral-current-netbsd-2.0.tar.gz)を当てないと NetBSD2.0.2ではダメなんだとさ。
しかもそれ若干抜けがあるらしくカーネルの構築でへぼる。
http://damien.bergamini.free.fr/ral/forum/read.php?f=1&i=49&t=44 にしたがって、以下な修正をちまちま。

/* BUG: PCI_VENDOR_RALINK seems to be undefined. */
#ifndef PCI_VENDOR_RALINK
#define PCI_VENDOR_RALINK 0x1814 /* Reasonable default. */
#endif

でもってnetbsd.ralなカーネルを作ってbootしてみる。

ral0 at cardbus0 dev 0 function 0
ral0: 802.11 address 00:0a:79:7c:08:4c
ral0: MAC/BBP RT2560 (rev 0x04), RF RT2525
ral0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
ral0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps

ふう。早く3.0系出てくれorz.

# wiconfig ral0       ;; 確認
# ifconfig ral0       ;; 確認
# ifconfig ral0 ssid "TheSSID" nwkey "TheWEPKEY" up
# wiconfig ral0 -oD   ;; 確認
# dhclient

うーむ。 wiconfigって-Dのためにしか使わないのですな。 色々回り道したけど、ようやく無線な環境に堕ちついた。cut-sea:2005/09/08 19:27:32 PDT


pretty print

欲しいと思ってた。 マクロの展開形チェックだけじゃなく、最近はkahua?で書いたコードを (rev-nodes (exec () node))でSXMLにした時の形式も見る機会が増えて来たから。

とりあえずテキトーにpp.scmとかってググったら、存在してるし。一発引き当て(^^;

http://ftp.cs.indiana.edu/pub/scheme-repository/code/string/pp.scm

しかも全然手を加えなくても

gosh> (load "pp.scm")
#t
gosh>

しばらく使ってみて自分の美意識へとカスタマイズするくらいならなんとか。 こうしてますます他力本願に磨きがかかっていくと。

しかし、このFeeleyってどっかで聞いた名前だな〜と思ったら。

うわ。記念すべき 0 getterでしたか。

いや、よくわかんないけどスゴそうですね。 実際srfi-*って結構手を加えなくてもGaucheで動く。 標準を創っているってこういうことかと妙に感心したり。 cut-sea:2005/09/07 03:13:54 PDT


Skype

周りがSkypeを使っているので自分の端末でも。
NetBSDの場合にはLinuxエミュを使う。
とりあえず、make;make installしてskype実行して叱られたら対策。 って言っても、LD_LIBRARY_PATHに/emul/linux/libとか/emul/linux/usr/libとか /emul/linux/usr/X11R6/libとかをツッこんでやるくらい。
基本的にはホゲシンボルがないって言ってくるのでLinuxエミュなやつを参照させるようにした。 libm.so.0だけは無かったのでlnでlibm.so.6を指す。ってことで無事動作。
で、思った。もしかしてGaucheのmakeも全部そっち向かせてやった方が楽なのかしらん。cut-sea:2005/09/01 17:50:34 PDT


LLDNあとがき

だいぶトラックバックも落ち着いたようなので。

まぁ私のプレゼンに関しては賛否両方あるわけだけど、とりあえずほっとした。

まず悪印象の方。
私の目に入って来た範囲では「おもしろくない」といった意見になるんだけど、 GaucheKahuaがおもしろくないと言われているわけではないようで、 私や私のプレゼンがツマンネーってけなされているだけだからノープロブレム。 ただ、「GaucheSchemeの一実装だ」という紹介は、 まだあーいう集まりでは必要な模様。反省(でも、ちと悔しい)。

一方中立ないし好印象について。
ごくごく少数のおもしろかったと書いてくれている方と元から GaucheScheme寄りと思われる方々のおあいそは別として、 基本的にはGaucheってこの一年で色々変わって来ているのね、あるいは進化しているのね 的印象を与えられているようなので、まぁ方向としては間違ってないし安心した。

だが、そうはいってもプレゼンてのは面白い…というよりは飽きさせない、そして引き付ける 工夫というのが必要なのは間違い無い。
聞いてもらえなきゃプレゼン自体が意味をなさないもんね。 だから悪印象もそれはそれで意味があるわけで、全く言及されないのが一番マズイ。 その意味では言及の一切無いのが結構あったのがちょっと残念。

ともあれ好悪いずれの意見も今後の私の糧とさせていただきましょう。

で、純粋に観客として楽しんだ範囲で感想を。
最も印象に残ったのがNightの方で沢田さんが発表した webにぺたぺたはっつける付箋(Webアノテーションツールalog)であった。 うまく言えないけど見た瞬間に大きな可能性を感じた。 例えば本や地図ってのは購入する時点では皆同じものを見るわけだけど、 自分だけのためにアンダーラインやマーキング、誤字訂正や英文の下に訳文つけたり、 ポンチ絵を追加したり、付箋をペタペタってのは実際にやるわけだし。 多分見せ方と、あとはUIをうまく導けば(これが一番難物だけど)ビジネスになりそうと思ったら 案の定観客の一人からその声が。 で、しかもあの先にもっと広がりがある様な気がしたからすごく印象に残っている。
あと、昼間に小飼さんの本を購入してサインを書いてもらっている時に、 「Perlにも継続が入るから!」と話を振られたので、自分なりに前から思ってた事があったから、 「でも、Schemeと違って、あれほど複雑な構文を持つ言語でユーザが正確に制御できますかぁ?」 ってつい口をついて出たんだけど、 あとで小飼さんがblog に書いておられるのを見て、うーんって感じ。
CPSって今もPerlで書こうと思ったら書けるんだろう(知らないけど)から、 CPSと継続を区別はしているハズだとは思うんだけど、いっしょくたな気がしないでもない。 この文章からでは私にはイマイチ継続が使えるようになるって感じはしない。 ただ、一般のプログラマにあらわに使わせるって感じではないらしいのは分かったけど。
ま、私はSchemeを使ってるんだし、Perlについてはどーでもいっか〜、 …なーんて言いつつ今回くじ引きも含めて入手した本3冊全部Perl本だったのはナイショ。:-)

さて、LLDNから帰った翌日に夢を見ました。
なぜか去年のLLの会場(恐らくは客席からの視点で見ているからだろうけど)で Shiroさんがプレゼンをしているのだが、 背中にらむ太くんをしょってて少し前かがみになって説明している。 らむ太君は首が座ってないためか真上を向いてしまっててShiroさんが動くたびに ガクンガクンなってる。 でもって注目すべきことに右手に風車を持っている。
うーむ。この赤ちゃんの右手に風車ってのは かなり強固な私の赤ちゃんに対するイメージの様で、昔からラクガキしてても、 なぜか付け足してしまうので目覚めてからしばらく笑いが止まらなかった。 そんなん今時見ない見ない。(^^;;cut-sea:2005/08/31 00:45:06 PDT


AMOP Chapter2読了

ふむ。まだまだ読める。イキオイがついてきた。 ここ数日はなかなか心の余裕がなくてテレテレやってたけど、集中すればこんなもんだ。えっへん。 次はChapter3のExtending the Languageだよ。いよいよか?cut-sea:2005/08/28 18:43:40 PDT


LLDN

LLDNに参加してきた。
まぁ、Gaucheのコミュニティにはハワイ在住のShiroさんは別にしても、 他に大勢適任者はいるはずなんだが、そういう方々をさしおいてLanguage Updateの プレゼンをやらせてもらった。
やってみなきゃ分からんこともあるものだなぁってことで、 こういう機会を与えて下さったえんどうさんに感謝。
他言語の方々はやっぱりプレゼンしなれているのかウマーって感じ。
でもそれはそれとして昼の柴田さん、夜のとおる。さんのプレゼンはおぉって思えるもので、 Gauche&Kahuaの存在感がアピールできた2005年LLDNだったんじゃなかろうか。cut-sea:2005/08/28 03:36:36 PDT


WiLiKi->tekiliだと?

ここってschemeの総本山でもある schemers.orgからimplementationの情報を見に行こうとしたらWiKiだったんだけど、 Powerd by Gauche 0.7.4.2でWiKiもWiLiKiの改造版tekiliというものらしい。 スバラスイcut-sea:2005/08/24 01:52:19 PDT


Scheme:call/ccパズル

今ふと思い付いて試したら正しい動作をするようになっておる。
コレどのバージョンからだろ。 やっぱ0.8.4かな。 cut-sea:2005/08/21 08:34:02 PDT


AMOP

序文から読むからダメだったのね。

本文から読み出したら結構面白い。最初のセクション読み終わった。 文章で少々分からないところがあっても直後に(簡略化した)実装コードがあるから十分読める。 この手法っていかにもLisp的。SICPもそうだしね。

実に説明もうまいね。最初に何をやるかのポイントを書いてて、 時には具体的な例も明示してくれてる。 (もしcolor-rectangleに適用したら展開形はこんな感じになるよみたいな。) さらに全体の中でどのステップまで進んでて、 あと何がインプリメントできればいいか、とか示してくれるので、 暗闇を進んでる感じじゃなくて、地図を見ながら突き進んでいける感じ。
やはり名著とされるだけあるか。ってかこの本しかないんだっけか。(^^;;;

もともと「必要に迫られてる?俺?」みたいな気がしてきて、 積んでたのを読み始めたんだけど、先が楽しみ。cut-sea:2005/08/18 20:09:29 PDT


入出力

どうも入出力っていっぱいあってしかも使い方がイマイチ理解できてない。

文字列から入力ポートをつくったり出力先を文字列にしたり、 仮想ポートなんてのもあってかなりイロイロできるようだ。

でもマニュアルには基本的なものは解説があるものの それ以外のものはそれを使った実装が示されているだけなので 使い方がすぐに分かるって感じじゃないのでなかなかすぐにコレってのが分かんない。

メモ的にでも使い方のページがほしいので作ってみる

こっちね -> Gauche:入出力ポートの使い方


カレンダー

カレンダーとかそういう時間軸の情報を扱うのって結構真面目にやると面倒だ。 もっと手軽に使える高水準のライブラリってあってもいいように思う。 というわけで雛型をさらしてみよう。

こっちへ追加ね -> Gauche:カレンダー計算


kahua

kahuaではタグを書くのに2種類の方法がドキュメントに記載されてて、 単純関数タグか高階関数タグかを使うことになっている。 もうひとつ、単純関数タグと一緒に使えて、最終的にはこれになるっていう形式もある。 自分としてはわかりやすさから、ついつい`(a/cont (@@ ... な感じの シンボル形式を使ってた。

これはHTMLに式を埋め込む感覚で難しさは一切ない。 が、どーも少し前からリファクタリングをしてて限界を感じ始めている。 (というかリファクタリングするまで感じなかった) 一方で高階版は正直難しいのだが、最終的には全体構造がきれいにまとまる気がする。 とにかくコードのいじくり甲斐という点で可能性を感じるわけよ。

やっぱり高階関数タグを駆使できるようになっておかないとと思って挙動を確認してる。

実装的にはStateモナドが使われてて、最初は真面目に読んでたんだが、 こいつを今追うのはほどほどでヤメにした。 自分の頭の悪さに泣けそうになるから。

使う分には掴めてきた感じなので無理してでもごっそり記述スタイルを変えてみよう。cut-sea:2005/06/27 18:30:06 PDT

ようやくバッチリ。 多分もう迷うことはないだろう。 高階タグについては(Stateモナドによる)実装の詳細は理解できてないが、 使う分にはもう万全。も少し色々試してみよう。cut-sea:2005/06/28 09:19:12 PDT


plugin for kahua

kahua-webがエラーを吐いて一切アクセス不可。 あれれ?どうしたんだろうとuninstallやらinstallやら繰り返す。 なんか他に設定あったっけ?とかしばし思いをめぐらす。
結局自分で突っ込んでみたpluginが悪いようだ。 入れるとダメになるみたい。 実験コードで触ってる分には使えてたんでまるで気付かなかった。
気分を変えてNotePCの環境構築に取り組む。

NotePC(続)

ちゃくちゃくと環境改善(のつもり)。

マウスキーボードは共に突き刺したら問題なく使える。 ホイールマウスはxorg.confに設定。

       Option      "ZAxisMapping" "4 5"
       Option      "Buttons" "5"

これでXの再起動でOK。 ホイールマウスに慣れるともう元には戻れない体になる。

無線LANはっていうと、近々に必要になるのでとりあえず購入。 キーボードやらマウスやら色々買物してたからか すでに正常な判断能力を喪失してた。(判断はおかしいが行動は正しい)

とりあえず突き刺したら、

Atheros Communications, Inc., AR5001-0000-0000, Wireless LAN Reference Card, 00 
(manufacturer 0x0, product 0x0) Atheros Communications, Inc. AR5212 Wireless LAN
 (ethernet network, revision 0x01) at cardbus0 dev 0 function 0 not configured

って感じだったんで、次の行をenableにしてカーネルの再構築。

ath*  at cardbus? dev ? function ?    # Atheros 5210/5211/5212 802.11

さてさて。

ath0 at cardbus0 dev 0 function 0ath0: waking up from power state D-973062144
ath0: unable to attach hardware; HAL status 13

こんな感じ。sys/dev/ic/ath.cの該当箇所見るとどうもjump先がダメそうな雰囲気。 googleで引っかけたら。。。

This means that the card isn"t supported

もう遅いんで(早いんで?)フテ寝。cut-sea:2005/06/18 11:46:25 PDT

ugen0 at uhub3 port 1
ugen0: Buffalo WLI-U2-KG54, rev 2.00/0.01, addr 2

で、軟弱に逃げた。cut-sea:2005/06/19 04:11:37 PDT


top level以外でのdefine

あー、これまで気にせず結構使ってたんだなぁ。

gosh> (begin (define x 1) (define y 2) (expt x y))
1
gosh> (if #t (begin (define x 2) (define y 10) (expt x y)))
1024
gosh> (receive (p q) (values #f 10) (if (or p q) (begin (define x 2) (define y 10) (expt x y))))
*** ERROR: Compile Error: syntax-error: the form can appear only in the toplevel: (define x 2)
"(stdin)":95:(receive (p q) (values #f 10) (if (o ...

Stack Trace:
_______________________________________

今後はletを使うことになるわけか。cut-sea:2005/06/15 06:24:42 PDT


NotePC

先月初めてSICP読書会に参加したが、NotePCを保有していなかった。 これでは本当につまらない。死ぬ程つまらない。 で、少し前から目を付けてたNotePCを購入。 10万程度でそれなりのスペックで メモリだけは512Mにしてもらった。

DOSPARAの製品は初めてだが、これは結構イケルんじゃないか?と思ったんだよね。 現物を店頭で見たときもデザインが変に華美じゃなくて気にいったし。

ところがだ。
あー、長いこと新マシンにOSインストールしてなかったから、 すっかり不注意になってたよ。 グラフィックスカードなどのH/Wの構成の詳細をちゃんと把握せずに買ってしまってた。 チップセット内蔵のVIAらしいんだが。型番調べたものの謎が残った。

苦労したけど、とりあえず今日ようやくXが、解像度も含めてうまく動いてくれた。 NetBSD+X.orgな環境です。

まずネットワークに繋いだら、 pkgsrcの最新をsup -s -vしてきて、X.orgをインストール。
Xorg -confugureからxorg.confを作っておいて、 スクリーンの解像度だけ合わせ込んでやったらキレイに表示してくれた。

一応最初に試してみたFedora Core3がすんなり動いてたので、 何とかなるだろうとタカをくくってたけど、いや本当に苦労しました。 まとめると、

多分Vine以外はどれも頑張れば動かせるんだろうけど、 結局慣れたOS(NetBSD)の方がやりやすかった。 (Vineについては私の場合には見通しが立たなかっただけで 動かせないという情報ではないです。念のため)

インストールそのものに関してはFedora Core3が一番すんなり行けたけど、 OSの起動の際に固まるケースが頻発し(っちゅーか素直に起動する方が稀だっ) たんで嫌になった。 初めて知ったけどDebianって結構インストーラがストイックですな。

さて、これでようやく、GaucheやらKahuaやらの 開発環境構築に取り掛かれるよ。cut-sea:2005/06/11 01:51:21 PDT


kahua

なるほど。 define-entryやらinitialize-main-procで定義する エントリポイントになる関数は最終的には

;; さらにnode-set不要論
;; 最終的に外の仕組みが欲しいのはこれだけ
;;
(define-entry (list)
  '((html (head (title "Hello"))
          (body (h1 "htmlでこんちわ世界")
                (h2 "ぼでー")))))

これだけで良いわけか。 特にnode-set:を書く必要もない。

dbaccess(6y3:tj42)> ((h1/ "hoge") ((h2/ "fuga") (h3/ "moo")))
((h1 "hoge") (h2 "fuga") . #<closure (>>= >>=)>)
dbaccess(6y3:tj42)> ((h1/ "hoge") (h2/ "fuga"))
((h1 "hoge") . #<closure (>>= >>=)>)
dbaccess(6y3:tj42)> ((h1/ "hoge") '())
((h1 "hoge"))
dbaccess(6y3:tj42)> (html/ "hoge")
#<closure (>>= >>=)>
dbaccess(6y3:tj42)> (html/ (head/ (title/ "hoge")) (body/ (h1/ "fuga")))
#<closure (>>= >>=)>
dbaccess(6y3:tj42)> ((html/ (head/ (title/ "hoge")) (body/ (h1/ "fuga"))) ())
((html (body (h1 "fuga")) (head (title "hoge"))))

ふーむ。cut-sea:2005/06/05 01:48:50 PDT

ちなみに、(tag/ ...)によって生成されるものは基本は(cut cons 1 <>)だ。

gosh> (cut cons 1 <>)
#<closure #f>
gosh> ((cut cons 1 <>) (cut cons 2 <>))
(1 . #<closure #f>)
gosh> ((cut cons 1 <>) ((cut cons 2 <>) (cut cons 3 <>)))
(1 2 . #<closure #f>)

なんだが、正しい使い方は

(tag/ "text" (tag2/ ...) ...)

という感じ。 なんせtag/はHTMLタグに対応はするけど関数なんだ。 リストの先頭に鎮座してなくちゃだわな。

だから、((tag1/ ..) (tag2/ ..) ...)みたいに先頭にtag/が来れないケースでは (node-set (list (tag1/ ..) (tag2/ ..) ..))とすることで、 (dummy/ ...)に相当する何かにしてくれるんだね。 これを(概念として対応するかどうかは別においておいて)、 高階タグ関数における整形式と呼ぶとしようか。 つまりnode-setは関数ノードのリスト形式を整形式にしてくれる。

gosh> (exec () (html/ (html/ "1") (html/ "2") (html/ "3")))
((html (html "3") (html "2") (html "1")))  ←逆順になってるのに注意
gosh> (rev-nodes (exec () (html/ (html/ "1") (html/ "2") (html/ "3"))))
((html (html "1") (html "2") (html "3")))  ←rev-nodesで正常に
gosh> (html/ (node-set (list (html/ "1") (html/ "2") (html/ "3"))))
#<closure (>>= >>=)>    ←正しい関数ノードにできる。
gosh> (exec () (html/ (node-set (list (html/ "1") (html/ "2") (html/ "3")))))
((html (html "3") (html "2") (html "1")))
gosh> (rev-nodes (exec () (html/ (node-set (list (html/ "1") (html/ "2") (html/ "3"))))))
((html (html "1") (html "2") (html "3")))  ← 三つ上と結果は同じだ。注目!

最後のは二つめのと同じ結果を生むね。

高階タグの整形式は(exec () 整形式)ないし、(rev-nodes (exec () 整形式))で ちゃんとした整形式のHTMLにマップされるはずのシンボルリストになる。 (もちろんwebアプリとして最終的に欲しいのはrev-nodesまでやったもの)

だから役割的にはnode-setは,@に相当するようだ。 ,@は`でくくったリストの内部でしか使えないがね。

gosh> ,@(map identity '(1 2 3))
*** ERROR: Compile Error: unquote-splicing appeared outside quasiquote: ,@(map identity '(1 2 3))
"(stdin)":28:,@(map identity '(1 2 3))

Stack Trace:
_______________________________________

node-setはっていうと

gosh> (node-set (map identity '(1 2 3)))
#<closure (>>= >>=)>
gosh>  (node-set (map identity '("1" "2" "3")))
#<closure (>>= >>=)>
gosh> (exec () (node-set (map identity '("1" "2" "3"))))
("3" "2" "1")
gosh> (rev-nodes (exec () (node-set (map identity '("1" "2" "3")))))
("1" "2" "3")

,@はリストの中身を外にスプライシングしたいものの、 トップで呼ばれると包んでくれる外殻がないので困っちゃう。

一方、node-setは関数ノードにして取り出すからできちゃう。 (node-set (list (tag1/ ..) (tag2/ ..) ...))の返すものは、 ,@(list (tag1/ ..) (tag2/ ..) ...)の結果になるはずの(tag1/ ..) (tag2/ ..) .. という関数ノードのばらばらになる予定のものを、 一まとめにして持ち運べる様にしたものだ。

gosh> (exec (html/) (node-set (list (html/ "1") (html/ "2") (html/ "3"))))
((html "3") (html "2") (html "1") . #<closure (>>= >>=)>)
gosh> (rev-nodes (exec (html/) (node-set (list (html/ "1") (html/ "2") (html/ "3")))))
((html "1") (html "2") (html "3"))
gosh> (rev-nodes (exec (td/) (node-set (list (html/ "1") (html/ "2") (html/ "3")))))
((html "1") (html "2") (html "3"))
gosh> (exec (html/) (tr/ (td/ "1") (td/ "2") (td/ "3")))
((tr (td "3") (td "2") (td "1")) . #<closure (>>= >>=)>)
gosh> (rev-nodes (exec (html/) (tr/ (td/ "1") (td/ "2") (td/ "3"))))
((tr (td "1") (td "2") (td "3")))
gosh> (exec (html/ "")  (tr/ (td/ "1") (td/ "2") (td/ "3")))
((tr (td "3") (td "2") (td "1")) . #<closure (>>= >>=)>)
gosh> (rev-nodes  (exec (html/ "")  (tr/ (td/ "1") (td/ "2") (td/ "3"))))
((tr (td "1") (td "2") (td "3")))
gosh>  (exec "" (tr/ (td/ "1") (td/ "2") (td/ "3")))
((tr (td "3") (td "2") (td "1")) . "")
gosh> (exec (tr/ (td/ "1") (td/ "2")) (html/ (ul/ (li/ "1") (li/ "2") (li/ "3"))))
((html (ul (li "3") (li "2") (li "1"))) . #<closure (>>= >>=)>)

ってなわけで、execの第一引数は微妙な扱い。 ドキュメントにはSXMLスタック云々と書いてある。 なんとなく方向性が掴めて来たような。cut-sea:2005/06/27 11:45:27 PDT


引越しの準備のために、一時的に black out な状態に。
今日引っ越ししました。 んで、二時間後、まずは ip reach な状態にしないと不安でいっぱいだったんで、 早速つないでみたら、これこの通り。ほっとした。
しかし何なんでしょうね、この不安感は一体。cut-sea:2005/04/29 01:31:18 PDT


ロングホーン

http://www.nikkei.co.jp/news/main/20050426STXKC007826042005.html

まーーった重くなりそうなことを…。
まぁでも、確かにこのファイルだっけ?あれ?こっちだっけって思うことは多い。 単に整理の仕方が悪いだけかと思ってたんだけどね。(^^;
問題はエクセルにせよワードにせよ結構起動が遅いと感じることでしょう? そっちをもちっとなんとか出来ないのか?と思ったり。


srfi-62

Gaucheってsrfi-62のS-exp commentのサポートしてるんですね。 draft段階だから明記してないのかな。(あるいは私の見落とし?)
今まで知らなかったんだけど、今度からデバッグで使おう。欲しかったし。cut-sea:2005/04/24 20:33:15 PDT


笑えた

Matzにっきの 「あるハッカーの顛末」の超訳が笑えた。
コメントからたどれる 全訳。 まだ笑える。もうダメ。腹筋しびれてきた。cut-sea:2005/04/24 09:34:53 PDT


全然関係ないです。ごめんね。

ご存知だろうか? 将棋の羽生が現在四冠。
かつて七冠を達成して、次々タイトルを取られてしまい、 つい最近は無冠になっちゃうのかといった状態だったんだけど、 さくさくと奪取を繰り返して四冠になってしまってる。 さらに今回名人位への挑戦権も獲得して緒戦を白星で飾った。
何気なく四冠とか言ってるけど七大タイトルの過半数を取っちゃってるワケで、 これってもう感覚が麻痺しそうだけどマンガの世界だよ、ホント。

ここ最近のタイトル戦では当り前みたいに顔を出すし、 きっちり勝ちをとってくるなど、さらに強い感じがする。

今の羽生は七冠に拘る感じはまるで無いみたいだけど、 個人的には同い年ってことでメチャメチャ祈ってるよ。

七冠ともなれば、年中全国を飛び回って最高峰の連中相手に タイトル戦を戦い続けるワケで、 棋士って線が細いように見えるけど相当にタフじゃなきゃつとまらない。 もし七冠を視野に入れた時、今回私が心配なのは体力的な面だけ。
二十代の時の様にいっちょやってくれ!って期待してる、一方的に。


curl

http://www.atmarkit.co.jp/fwcr/interview/005curl_01/005curl_01.html の記事。 昨年のLL Weekendでも updateのセッションでデモがあったけど、 Windowsマシンで結構サクサク動くのに会場でも「おお〜っ」ってなった。 講演者の大谷さんて方は「結構高速なマシンを使ってデモしてる」とおっしゃってたが、 マシンスペックを聞いた時、私も周囲の方々も今ならそんなハイスペックでもないぞ といった感想だった様に思う。
まぁ得手不得手なものがあるはずだけど、全部があの調子で動くならちょっと恐い。 Linuxサポート も開始したみたいだし。


クマムシ

全然関係ないけど、このクマムシって奴 あまりにもカッコよすぎる。 いつか何かでプロジェクトクマムシとかtunプロジェクトとかって名称を使ってみてぇ。 あるいはサーバのhostnameにするとか。 ただそいだけ。cut-sea:2005/04/04 09:31:05 PDT


BSD Hacks

買った。あと、XML Hacksも。
XML関係も結構本がぎっしり出てるんだなぁ。 なんかどれも似たような内容で物色してたら足しびれた。 結局購入予定してなかったモノで食指をそそられるのは無かったんでパス。2005/03/26 02:31:31 PST


TinyCLOS

いかん。自分に負けそうだ。
こんな時は動け動け。 Scheme:TinyCLOS読みましょう。


gensym?

Gauche依存だけど gensym で生成したものと通常のシンボルとを識別できるらしい。 Scheme:OnLispのマッチング参照。 teranishiさんの指摘だが、これはちょっと面白い Tips じゃなかろうか。


アンカーパチンコ

出張の帰りに本屋でCマガジンを購入。 最初はグラフ理論入門の特集記事が目に入ったので購入したのだが、 新幹線の中で読んでたら、そっちより尻の方の記事に目がいった。
「Cマガ電能クラブ」っていう、要は出題がなされてCでそれを組んで投稿してもらい 回答を紹介するという企画があった。 11月の問題はカレンダーで比較的簡単 (休日を出したり、それ以外にも計算により求めることが要求されてたようだが?) だったらしく、17人が回答を寄せたとか。(これは多いみたいだ) 今回の問題が結構面白そうだったのでSchemeで着手してみたが…。 (ちなみに実際にCで書いた場合の申し込み期限は18日らしいので、 すでに一ヶ月遅かったのですけど)

こっちね ->Scheme:アンカーパチンコ


Gaucheの評価順に関する疑問

gosh> ((begin (display 1) list)
       (begin (display 2) 2)
       (begin (display 3) 3))
231(2 3)

これを見るとGaucheは引数を左から右へ評価して、 最後にオペレータを評価しているように見える。 (もちろん、オペレータ部がsyntaxかどうかの 確認がさらにその前というか一番最初なのは分かってますけど)

評価順はRnRS的には別に規定されてないからそれはオッケー。 さて、次の処理もわかる。

gosh> (define x 1)
x
gosh> (define y 2)
y
gosh> (list x (call/cc (lambda (c) (set! x c) y)) x)
(1 2 #<subr continuation>)

これはオッケーだ。 list 式の引数が左から順なので、最初の x は 1 になり、 その後で継続が捕捉され、 y の 2 が返り、 続いて最後の x が #<subr continuaion> になり、これがリストになって返る。 うん、問題ないように思う。

私が分からないのがこれ。

gosh> (define x 1)
x
gosh> (define y 2)
y
gosh> (list x (call/cc (lambda (c) (set! list max) y)))
(1 2)

私の事前予想は

  1. listがsubrなので引数の評価を開始。
  2. xが評価されて1
  3. call/cc で list に #<subr max> が代入
  4. call/cc 式自体はyの2が返る
  5. 最後にオペレータ部が評価されて、(list 1 2) => (#<subr max> 1 2) => 2が返る

というものだった。 最後にオペレータ部が評価される順序だと思ってたのに あたかも最初に評価されたかのような振るまいに思える。 なーぜー(?_?)cut-sea2005/02/08 19:34:19 PST

あら?上の処理1 の list が subr だと分かってる時点で #<subr list>だって 評価してるんだよねぇ。とすると最初の評価順の確認方法がおかしいのだろうか。


部分継続

call/cc に取っ掛かりができたあたりから、 ネット上の継続のドキュメントを読むのが楽しくなってきた。

思い起こせば1年前、部分継続なんて言葉が無防備な脳髄に直撃!!

kahua.partcont参照。 なるほど、やりたいことと、そのための制御とが今ようやくリンクした。 上記のkahua.partcontのドキュメントは分かりやすい。 難解な言葉を使うのではなくて、 注目点を明言して(注目を集めるようにリストにしたり)イメージしやすい言葉で書かれておる。 背景としてcall/ccの問題点の説明から入ったりと工夫の跡が見て取れる。うむ。

最初読んでピンと来なかった点といえば、 そうだなぁ、call/pcでprocに渡した部分継続 k を呼び出した時に call/pcの外部エンティティを評価していって、 reset/pcの第一の制御点に到達した時になんで k の呼び出しポイントに戻るのか ってところ位かな。 まぁ、これは継続の良くある例と同じくproc内でkを束縛しておいて、 外で単独でkを呼び出す場合とかをイメージすりゃ当たり前なんだが。

確かにreset/pcでマークしたポイントまでだけの有限な継続処理だけを捕捉できてるのが分かった時、なんで部分継続なんていうのかがようやく分かった。 (最初口をついて出たのは有限継続だったけど、これも誤解を生むんだよなぁ、 なんていうの?あーだこーだ(中略)もっとこう部分的な…って、 だから部分継続かぁって自己ツッコミしました) これ使えばcall/ccの問題回避できるのも。

帰宅したら早速いじってみたいぞ。うずうず。2005/02/01 19:39:50 PST


多値

少々 call/cc が見えてきたせいで今度は多値が気になってきた。 半年位前にScheme:多値から大きな話題になってて、 今ごろになってようやく話の流れが追える気がする。全部じゃないけど。

でも、今も納得より、なんだかすっきりしない気持ちの方が大きい。 私は多値を導入して全体の意味を統合(整理?)するなら lambda を替えないとダメなんじゃないかなって思った次第。

;; 多値に対応した lambda はどう書くか
;;
((lambda ??? ..) (values 1 2 ..) ...)

この lambda が素直に書けるように今の lambda からシームレスに(って表現がいいのかな) 拡張できればいいのかな、とか。 つまり、多値のない Scheme ってのは所詮上の特殊例なだけっていう観点。

;; 多値に対応した lambda では今の lambda は所詮これ
;; ただし、 (values 1) ... の後ろの部分はすべて (values hoge) みたいに 1値のみ返す
;;
((lambda (a) ...) (values 1)) == ((lambda (a) ...) 1)
((lambda (a . b) ...) (values 1) ...)  == ((lambda (a . b) ...) 1 ...)
((lambda arg ...)  ...) == ((lambda arg ...) ...)
;; == は構文的にも意味的にも同じものにシームレスにイコールにいきつくべき

決して

((lambda args ...) 1 2 3...)

とは違うんでしょうな。args じゃないんだ。 これとは区別できないといかんだろうと思う。根拠無いけど。

いや、もしかして別に表記をかえなくてもいいのかも。 単純にシンボルに多値が束縛できりゃいいのか?

gosh> (define a (values 1 2))
a
gosh> a
1
2
gosh> ((lambda (a) a) (values 1 2))
1
2

って感じかな。 そうすると、多値ってなんかリストやベクタみたく一種のデータ構造に思えて来るな。 #<multiple-values 0x8119de0> とかそんな風な存在。 そうすると他のプロシージャに適用した時には

gosh> (list (values 1 2) (values 3 4))
(#<multiple-values 0x8119de0> #<multiple-values 0x8119dc0>)

とかね。 …しかし、これって多値になってんのかどうだかよう分からんな。 単に scheme の基本機能で多値をエミュレートした実装をしたら、 こんな風になりそうって感じのもんだわ。

あ、guileがまさにこれやってる。しかも

guile> (values 1)
1
guile> (eq? (values 1) 1)
#t
guile> (list (values 1 2) (values 3 4))
(#<values (1 2)> #<values (3 4)>)
guile> (list (values 1) (values 2))
(1 2)
guile> (equal? (list (values 1) (values 2)) (list 1 2))
#t

なのでまさに私の思ってたシームレスな実装だわ。 まぁ同じようなことを考える人って必ずいるんだねぇということで。cut-sea:2005/02/09 20:05:16 PST


comp.lang.schemeから寄ったら…

R6RSの進捗かな? (私が発見したのが遅いので 2004/10 頃のもの、別にニュースってワケではない)
色々議題として上がっているものがつらつら、ほにゃららの点で議論が分かれるもの とかって感じで項目がいっぱい。
ところで deletions from R5RS の中に force/delay や multiple values が見えるんだけど、こんな感じでいつも一応は議論になるとか? いまいちこの辺のノリが分からないので過剰反応してますけど、 あんなものがなくなったりとかするんでしょうか。


call/cc

うぉっ!!なんか第一次(?)継続悟りの瞬間!
もしかしてと思って考えたら call/cc パズル分かったよ。(^^;
っていうか、継続について少し切っ掛けが掴めた感があって、ふんふん、なるほど! っていじってたら call/cc パズルのコア部分を作成してた。 動作確認の途中で、あーこれ、もしかして、とか思った時は感動したよ。 そうか。この部分を分かってなかったのか、なるほどね。
深夜一時半だけど祝杯あげよう!生搾り(^-^)cut-sea:2005/01/27 08:38:38 PST


scheme hacks

最近はやりの ほげほげ Hacks モノ。 BSD Hacks(仮) だと? うーむ、とりあえず欲しいじゃないか。
ところで scheme Hacks とか出ないか? いや、scheme(やLisp)はプログラムを組んでいること自体全てが scheme Hacks だね。:-p


SICP

先週くらいから再びSICP勉強熱。
今回の興味は 4-5 章にのみ注がれている。 自分で評価器のロジックを設計したいとなると難しい。 レジスタの使い方や制御の飛び方が分かったような分からないような。 まぁ理解出来てないのは自覚できてるが。2005/01/25 05:10:01 PST


Gauche:refj-gauche

マニュアルをブラウザ使って探すのが徐々に面倒になってきた。
というわけで作ってみました。 -> Gauche:refj-gauche


` & , & ,@ の展開について

やっぱり、誤解してたよ。

gosh> (define a 1)
a
gosh> (define b 2)
b
gosh> `(a b)
(a b)
gosh> `(,a ,b)
(1 2)
gosh> ``(,a ,b)
`(,a ,b)           <= これが `(1 2) になると思ってた
gosh> ``(,,a ,,b)
`(,1 ,2)
gosh> ``(,,a ,b)
`(,1 ,b)           <= これも `(,1 2) になると思ってた
gosh> (define x '(list 1 2 3))
x
gosh> (define y '(list 9 8 7))
y
gosh> ``(,@x ,@y)
`(,@x ,@y)         <= これも先に展開されると思ってた
gosh> ``(,@,x ,@,y)
`(,@(list 1 2 3) ,@(list 9 8 7))
gosh> ``(list ,@,x ,@,y)
`(list ,@(list 1 2 3) ,@(list 9 8 7))
gosh> `(list ,@(list 1 2 3) ,@(list 9 8 7))
(list 1 2 3 9 8 7)
gosh> ``(,,@x ,,@y) <= これも,@から取り合えず展開できると思ってた
*** ERROR: unquote-splicing appeared in invalid context: ,@x
Stack Trace:
_______________________________________
gosh> 

"," とか ",@" って常に内から内から展開されると思ってたけど、 "`"; との対応レベルがあったのか。
こりゃ、だいぶ以前から勘違いして、ずっとそのまま来てたぞ。(-_-;


apropos

なるほど、こんな感じか。cut-sea:2004/12/31 05:27:29 PST

(define (with-current-apropos proc)
  (use srfi-1)
  (append-map (lambda (m)
                (hash-table-map (module-table m) proc))
              (all-modules)))

(define (current-apropos) (with-current-apropos (lambda (k v) k)))

(for-each (lambda (k) (format #t "~a~%" k))
          (map string->symbol
               (sort (map symbol->string
                          (with-current-apropos (lambda (k v) k)))
                     string<?)))

ネットワーク関係

ネットワークプロラグミングがやってみたい。
というわけで、Kahuaのコードを読んで、 「UNIXネットワークプログラミング入門」(ISBN4-7741-1754-4)を片手にお勉強。 以前カッコつけてW.リチャード・スティーブンス著(篠田先生訳)の 「UNIXネットワークプログラミング」を購入したけど、やっぱり自分には こういうやさしい本からの方がいいや。
コードを読むのもいいけど、やっぱり書いてみないとねぇ。 でも読まなきゃなかなか自分の知らないテクとか身に付かないし。 やっぱ読むのより書くのが好きな人間にはなかなか難しい選択だわ。

ってわけで書いてみた。 -> Gauche:NetWork:goban

More ...