あ、出たらしい。 さて、どのタイミングで入れるかが問題だ。cut-sea:2005/12/25 03:01:08 PST
九州の方で10年程寝かされたものを入手。cut-sea:2005/12/23 05:11:55 PST
ようやく公開された。 「タライ回し関数の正体」
メモ取りそこなっててずっと気になってた。
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
いつのまにこんなものが… cut-sea:2005/12/04 15:29:47 PST
2日間みっちり行ってきました。 講演後、竹内先生にお願いして「はじめての人のためのLISP」2冊にサインを。 私をS式の世界にいざなった本です。 これで思い残すこと無し。cut-sea:2005/11/18 18:30:51 PST
アップした。
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
意外に基本的なところからやってくれてる?
分かりやすいのかもしれない。cut-sea:2005/11/01 07:38:35 PST
来た。Olegさんも著者の一人らしい。
そうか。改めて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
ふう。かなりてこずった上に正直言って分かりませんでした。
なんつーか読後の感想ってのが出て来ないくらいさっぱり。
でも一応これで2部構成の1部が終った。 で、第2部はどっちかってーとマニュアルっぽい感じみたいなので読まない。 読むなら再度Chapter1からだけど、まぁ他を巡回して知識蓄えてから再チャレンジ。(予定)
で、再認識した。
S式が多い内は大丈夫。比率が下がると理解がついて行かない。
ってことは原書を読んでいるんだけど、S式を読んでたわけだ。
確かに自覚はある。cut-sea:2005/10/13 07:06:44 PDT
どうも設計力が無いというか構成力が無いというか見通しの甘さが悔しいくらい。
簡単な様でいて、いじっている内に劇的に変えたくなってくる。 どうもその時に、ちょっとした変更で済むように構成できてないことが多すぎる。cut-sea:2005/09/28 21:44:04 PDT
どうも想像してた程、「あっすっげー新鮮〜」て感触はなかった。
もともと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
欲しいと思ってた。 マクロの展開形チェックだけじゃなく、最近は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を使っているので自分の端末でも。
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
だいぶトラックバックも落ち着いたようなので。
まぁ私のプレゼンに関しては賛否両方あるわけだけど、とりあえずほっとした。
まず悪印象の方。
私の目に入って来た範囲では「おもしろくない」といった意見になるんだけど、
GaucheやKahuaがおもしろくないと言われているわけではないようで、
私や私のプレゼンがツマンネーってけなされているだけだからノープロブレム。
ただ、「GaucheはSchemeの一実装だ」という紹介は、
まだあーいう集まりでは必要な模様。反省(でも、ちと悔しい)。
一方中立ないし好印象について。
ごくごく少数のおもしろかったと書いてくれている方と元から
GaucheやScheme寄りと思われる方々のおあいそは別として、
基本的には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
Our first objective is to improve the Scheme language. Backward compatibility, while important, is a secondary objective.この表明はちょっと気に入っている。cut-sea:2005/08/31 02:00:29 PDT
ふむ。まだまだ読める。イキオイがついてきた。 ここ数日はなかなか心の余裕がなくてテレテレやってたけど、集中すればこんなもんだ。えっへん。 次はChapter3のExtending the Languageだよ。いよいよか?cut-sea:2005/08/28 18:43:40 PDT
LLDNに参加してきた。
まぁ、Gaucheのコミュニティにはハワイ在住のShiroさんは別にしても、
他に大勢適任者はいるはずなんだが、そういう方々をさしおいてLanguage Updateの
プレゼンをやらせてもらった。
やってみなきゃ分からんこともあるものだなぁってことで、
こういう機会を与えて下さったえんどうさんに感謝。
他言語の方々はやっぱりプレゼンしなれているのかウマーって感じ。
でもそれはそれとして昼の柴田さん、夜のとおる。さんのプレゼンはおぉって思えるもので、
Gauche&Kahuaの存在感がアピールできた2005年LLDNだったんじゃなかろうか。cut-sea:2005/08/28 03:36:36 PDT
ここってschemeの総本山でもある schemers.orgからimplementationの情報を見に行こうとしたらWiKiだったんだけど、 Powerd by Gauche 0.7.4.2でWiKiもWiLiKiの改造版tekiliというものらしい。 スバラスイcut-sea:2005/08/24 01:52:19 PDT
今ふと思い付いて試したら正しい動作をするようになっておる。
コレどのバージョンからだろ。
やっぱ0.8.4かな。
cut-sea:2005/08/21 08:34:02 PDT
(define cont #f) (list 1 2 (call/cc (lambda (k) (set! list max) (set! cont k) 3)))で(1 2 3)が返って来るか3が返って来るか処理系依存ですし、 さらにlistが#<closure max>になっているにもかかわらず、 この後で(k 10)ってやっても前者の処理系では(1 2 3)が返って来る。:-)
序文から読むからダメだったのね。
本文から読み出したら結構面白い。最初のセクション読み終わった。 文章で少々分からないところがあっても直後に(簡略化した)実装コードがあるから十分読める。 この手法っていかにもLisp的。SICPもそうだしね。
実に説明もうまいね。最初に何をやるかのポイントを書いてて、
時には具体的な例も明示してくれてる。
(もしcolor-rectangleに適用したら展開形はこんな感じになるよみたいな。)
さらに全体の中でどのステップまで進んでて、
あと何がインプリメントできればいいか、とか示してくれるので、
暗闇を進んでる感じじゃなくて、地図を見ながら突き進んでいける感じ。
やはり名著とされるだけあるか。ってかこの本しかないんだっけか。(^^;;;
もともと「必要に迫られてる?俺?」みたいな気がしてきて、 積んでたのを読み始めたんだけど、先が楽しみ。cut-sea:2005/08/18 20:09:29 PDT
どうも入出力っていっぱいあってしかも使い方がイマイチ理解できてない。
文字列から入力ポートをつくったり出力先を文字列にしたり、 仮想ポートなんてのもあってかなりイロイロできるようだ。
でもマニュアルには基本的なものは解説があるものの それ以外のものはそれを使った実装が示されているだけなので 使い方がすぐに分かるって感じじゃないのでなかなかすぐにコレってのが分かんない。
メモ的にでも使い方のページがほしいので作ってみる
こっちね -> Gauche:入出力ポートの使い方
カレンダーとかそういう時間軸の情報を扱うのって結構真面目にやると面倒だ。 もっと手軽に使える高水準のライブラリってあってもいいように思う。 というわけで雛型をさらしてみよう。
こっちへ追加ね -> Gauche:カレンダー計算
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
kahua-webがエラーを吐いて一切アクセス不可。
あれれ?どうしたんだろうとuninstallやらinstallやら繰り返す。
なんか他に設定あったっけ?とかしばし思いをめぐらす。
結局自分で突っ込んでみたpluginが悪いようだ。
入れるとダメになるみたい。
実験コードで触ってる分には使えてたんでまるで気付かなかった。
気分を変えて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
あー、これまで気にせず結構使ってたんだなぁ。
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
先月初めて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
なるほど。 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
まーーった重くなりそうなことを…。
まぁでも、確かにこのファイルだっけ?あれ?こっちだっけって思うことは多い。
単に整理の仕方が悪いだけかと思ってたんだけどね。(^^;
問題はエクセルにせよワードにせよ結構起動が遅いと感じることでしょう?
そっちをもちっとなんとか出来ないのか?と思ったり。
Gaucheってsrfi-62のS-exp commentのサポートしてるんですね。
draft段階だから明記してないのかな。(あるいは私の見落とし?)
今まで知らなかったんだけど、今度からデバッグで使おう。欲しかったし。cut-sea:2005/04/24 20:33:15 PDT
cut-sea@mokili> emacs --version GNU Emacs 21.3.1なお、このemacsはNetBSD 2.0時点のpackagesに含まれるものを、 そのままmakeしたやつです。
(define a #;1 #;2 3) (define b #;(+ 1 2 3) (* 1 2 3))こんな感じで、C-xC-eだとか、M-C-b/fとかM-C-tとか、 ちゃんと#;S-exp部分を無視して処理してくれます。
(define a #;1 #;2 3)◇ ■の■のとこで C-x C-e すると READ-ERROR になるです(泣). どうも(Emacs LISP の) backward-sexp (C-M-b)の S 式認識が微妙で, ◇のところでは define 全体を S 式とするのに対し,■では
a #;1 #;2 3)と認識してインタプリタに送ってるようで.
(define a ;1 ;2 3) ■でも
a ;1 ;2 3)と認識するところをみると,単純に従来の接頭辞文字+コメント記号 として処理しているだけかもしれません.しかしそうだとすると, backward-sexp とかのカスタマイズをしなければならないんだろうか….
(define b #;(+ 1 2 3) (* 1 2 3)) ■こいつの場合には、大丈夫みたいです。 全体的には思いのほか使えてるんで便利は便利ですよ、これ。cut-sea:2005/04/26 14:59:50 PDT
Matzにっきの
「あるハッカーの顛末」の超訳が笑えた。
コメントからたどれる
全訳。
まだ笑える。もうダメ。腹筋しびれてきた。cut-sea:2005/04/24 09:34:53 PDT
全然関係ないです。ごめんね。
ご存知だろうか? 将棋の羽生が現在四冠。
かつて七冠を達成して、次々タイトルを取られてしまい、
つい最近は無冠になっちゃうのかといった状態だったんだけど、
さくさくと奪取を繰り返して四冠になってしまってる。
さらに今回名人位への挑戦権も獲得して緒戦を白星で飾った。
何気なく四冠とか言ってるけど七大タイトルの過半数を取っちゃってるワケで、
これってもう感覚が麻痺しそうだけどマンガの世界だよ、ホント。
ここ最近のタイトル戦では当り前みたいに顔を出すし、 きっちり勝ちをとってくるなど、さらに強い感じがする。
今の羽生は七冠に拘る感じはまるで無いみたいだけど、 個人的には同い年ってことでメチャメチャ祈ってるよ。
七冠ともなれば、年中全国を飛び回って最高峰の連中相手に
タイトル戦を戦い続けるワケで、
棋士って線が細いように見えるけど相当にタフじゃなきゃつとまらない。
もし七冠を視野に入れた時、今回私が心配なのは体力的な面だけ。
二十代の時の様にいっちょやってくれ!って期待してる、一方的に。
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
買った。あと、XML Hacksも。
XML関係も結構本がぎっしり出てるんだなぁ。
なんかどれも似たような内容で物色してたら足しびれた。
結局購入予定してなかったモノで食指をそそられるのは無かったんでパス。2005/03/26 02:31:31 PST
いかん。自分に負けそうだ。
こんな時は動け動け。
Scheme:TinyCLOS読みましょう。
Gauche依存だけど gensym で生成したものと通常のシンボルとを識別できるらしい。 Scheme:OnLispのマッチング参照。 teranishiさんの指摘だが、これはちょっと面白い Tips じゃなかろうか。
出張の帰りに本屋でCマガジンを購入。
最初はグラフ理論入門の特集記事が目に入ったので購入したのだが、
新幹線の中で読んでたら、そっちより尻の方の記事に目がいった。
「Cマガ電能クラブ」っていう、要は出題がなされてCでそれを組んで投稿してもらい
回答を紹介するという企画があった。
11月の問題はカレンダーで比較的簡単
(休日を出したり、それ以外にも計算により求めることが要求されてたようだが?)
だったらしく、17人が回答を寄せたとか。(これは多いみたいだ)
今回の問題が結構面白そうだったのでSchemeで着手してみたが…。
(ちなみに実際にCで書いた場合の申し込み期限は18日らしいので、
すでに一ヶ月遅かったのですけど)
こっちね ->Scheme:アンカーパチンコ
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)
私の事前予想は
というものだった。 最後にオペレータ部が評価される順序だと思ってたのに あたかも最初に評価されたかのような振るまいに思える。 なーぜー(?_?)cut-sea2005/02/08 19:34:19 PST
あら?上の処理1 の list が subr だと分かってる時点で #<subr list>だって 評価してるんだよねぇ。とすると最初の評価順の確認方法がおかしいのだろうか。
$ gosh -fno-inline gosh> (define x 1) x gosh> (define y 2) y gosh> (list x (call/cc (lambda (c) (set! list max) y))) 2
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
R6RSの進捗かな?
(私が発見したのが遅いので 2004/10 頃のもの、別にニュースってワケではない)
色々議題として上がっているものがつらつら、ほにゃららの点で議論が分かれるもの
とかって感じで項目がいっぱい。
ところで deletions from R5RS の中に force/delay や multiple values
が見えるんだけど、こんな感じでいつも一応は議論になるとか?
いまいちこの辺のノリが分からないので過剰反応してますけど、
あんなものがなくなったりとかするんでしょうか。
うぉっ!!なんか第一次(?)継続悟りの瞬間!
もしかしてと思って考えたら call/cc パズル分かったよ。(^^;
っていうか、継続について少し切っ掛けが掴めた感があって、ふんふん、なるほど!
っていじってたら call/cc パズルのコア部分を作成してた。
動作確認の途中で、あーこれ、もしかして、とか思った時は感動したよ。
そうか。この部分を分かってなかったのか、なるほどね。
深夜一時半だけど祝杯あげよう!生搾り(^-^)cut-sea:2005/01/27 08:38:38 PST
最近はやりの ほげほげ Hacks モノ。
BSD Hacks(仮) だと?
うーむ、とりあえず欲しいじゃないか。
ところで scheme Hacks とか出ないか?
いや、scheme(やLisp)はプログラムを組んでいること自体全てが scheme Hacks だね。:-p
先週くらいから再びSICP勉強熱。
今回の興味は 4-5 章にのみ注がれている。
自分で評価器のロジックを設計したいとなると難しい。
レジスタの使い方や制御の飛び方が分かったような分からないような。
まぁ理解出来てないのは自覚できてるが。2005/01/25 05:10:01 PST
マニュアルをブラウザ使って探すのが徐々に面倒になってきた。
というわけで作ってみました。 -> 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>
"," とか ",@" って常に内から内から展開されると思ってたけど、
"`"; との対応レベルがあったのか。
こりゃ、だいぶ以前から勘違いして、ずっとそのまま来てたぞ。(-_-;
なるほど、こんな感じか。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