先日の RHG 読書会で、牧さんがやっているという http://sourceforge.net/projects/jsthread/ の紹介があった。 JavaScript でプリエンプティブなスレッドをライブラリレベルで実装した、という話。
JavaScript というのは、ユーザレベルからはスレッドが一本しかなくて、処理の切り替えというのができない。だから、タイムアウト呼出や処理の終了のイベントを待って終了処理をする、ってなことを書かないとまともなプログラムを書けない。でもこれは大変だ。
この Concurrent.Thread を使って関数を渡すと、そのプログラムが呼び出し元と並列に走る。ように見える。なのであまり気にせずループみたいなものを回す関数を使ってもブラウザが停止したりしない。
まだドキュメントとかはないのだけれど、昨日ちらっと見たサンプルコードから、いいかげんにデッチ上げてみたら、それっぽく動くようだ→http://www.city5.org/fib.html これはフィボナッチ数を順番に表示するというプログラムだけど、メイン部分は while(true) で回している。 Concurrent.Thread を使わないと、 JavaScript が暴走してエライことになる。
ついでに arton さんのライフゲームのやつも同じ調子で書き直してみた→http://www.city5.org/life.html
なんとなーくわかったけど、まだよくわからんところもあっていいかげんです。ドキュメント欲しい(笑)。
ところで、これはいったいどうやっているのか、というと、関数が Thread.create に渡されると、それを文字列化してパースし、かたまって動くものを細切れに動くようにコード変換するらしい。オーバヘッドが気になるのだけど、正直なところそれほどの問題はなさそうに見える。ちなみにコード変換はまだ完璧ではないらしく、一部の構文がまだ動かないと昨日は言っていたのだけど、このフィボナッチ数でもちょっとハマった。 n1 や n2 はスレッドのスコープにあるのが見てわかると思うけれど、これを main のスコープにすると動かなくなるのだ。って書くと、そういえばそんなことを言っていたような記憶も……。ふうーむ。
いやでも、これは面白いなあ。
そういえばこっちには感想を書いていなかった気がする(笑)。
あの浦沢義雄が帰ってきた! しかもなぜか平日6時台に!
というだけでわかる人はわかるアレな番組、それがパンシャーヌ。わからない人に、ちょっと簡単な解説をしましょう。
浦沢義雄というのは脚本家の名前。東映が日曜の朝にやっていた「不思議コメディー」という一連の作品群を書いてきたのだった。ロボット八ちゃんとかが源流だったんだけれども、だんだんと浦沢の「怪作」ぶりが発揮されるようになっていき、おそらくもっとも有名なのが「美少女仮面ポワトリン」は一世を風靡しました。……いや、わたしは見てないんですが。当時はナマイキなガキだったから、ああいうのは駄作だと思っていたし許せなかったんだなぁ、きっと……(遠い目)。
この「パンシャーヌ」はその直接の続編というわけじゃないのだけれど、おおかたの「精神」はあの辺から受け継いでいる。御町内のヒロインとなっていた美少女戦士も、あるときやめてしまい、今は幸せな家庭を築いている。そこに唐突に神様(猫ひろし)がやってきて、美少女戦麗舞(せれぶ)パンシャーヌに任命する!「……まあ美少女って年じゃないけどな」
でまあ、第一話は神様を追いつめる怪人を秘技シロガネーゼ・アタックで退治したのだが、あとで改心した怪人と腹をわって話しあったところ、その怪人は宇宙人の女性で、夫婦で宇宙を旅していたところ「最近太ったんじゃない?」と言われてショックを受けて地球でダイエットをしようとしたところ、神様がやってたインチキダイエット商法にひっかかって宇宙に帰るすべも失なって神様からお金を取り戻そうとしていたことが発覚し、後半ではパンシャーヌと怪人がふたりして神様をやっつけたところに、ダンナと子供が宇宙船で迎えに来て、帰りましたとさ、おしまい、みたいな。えーとついてきてますか?
ちなみに、パンシャーヌは「アンシャンレジーム・トリコロール!」のキーワードで変身し、「花も嵐も踏み越えて、戦う愛のエレガント、美少女戦麗舞パンシャーヌ」が決め台詞で、なぜかそれから小倉百人一首から一首を詠む。「教養のあるところをお見せしたくって」 それと、わざとやってるんだろうけど特撮がしょぼい。ちょっと21世紀にこれはないんじゃないかっていうか同人映画?みたいなレベルのヤバさ。コスチュームもしょぼいのだが、なにせ第一話で「じゃあコスパで作ろう」といって作ったものだからしょぼくても仕方ない。通りがかりの警官に「怪しいやつめ!」と言われるしまつである。
ほかにもいかにも浦沢なところがいっぱいあって、いちいちオレは大喜びなのだが、こんなものを夕方六時にやっていいのか? っていうか誰が喜ぶんだ? というのが目下の疑問。たぶん子供じゃなくて、当時のポワトリンとかの視聴者層の女性(20-30代くらい?)がメインターゲットなんじゃないかと推測するのだけど。
いやあ、すごいですよ。心に余裕のある皆様におかれましては、いちど見てみるとよいのではないかと思います。
理由はスパムが多すぎるから。とにかく死んでいる(更新のない)ユーザが多く、更新を検出してもスパム書き込みであることが多すぎる。
そこで、グループ全体の更新履歴を外し、「これは生きている」とオレが判断したところを個別にチェックするという方向に転換したいと思います。その判断はオレの独断ということになりますが「ここは生きてるから」というアドヴァイスがあれば、あらかじめコメントをしていただけると助かります(いちおう一通りチェックする手間が省けるので)。
独断といっても、最後の日付を見てそれほど古すぎないもの、っていう基準だと思いますけれど。
ふと LispUser.net のむかしの記事を見ていたところ、S式の限界と題して、 let と cond の記法拡張の話があった。端的に言うと、矢印が使えるようになるというもの。
で、最初に見たときは「あーまあそうだよね」という感じであり、まあサンプルとしては良いな、と思っていたわけだ。でまあそれだけだったんだけど、なんというか、わりと最近になってようやく自分でも define-syntax / syntax-rules で書くのに抵抗がなくなったというか、「こうすればできるじゃん」のイメージが掴めるようになったので、例題がてらにちょっとやってみた。
いい機会なので、 pyvnc2swf で撮影したムービーも公開します。というか、ムービー作成をちょっとやってみたかった、というのもある(笑)。
>
矢印let
>
矢印cond
裏をあかすと矢印letの方はやってみたらすぐ出来てしまい、それは撮影していませんでした。でもまあそれはそれとして、ということで lets を作ろうとしてから、ああ lets-sub にした方がいいね……とやっているのは、当初の行動を最初はちょっとトレースするためにわざとしたこと。でもそれ以外は素であり、脇に正解があるのを見ながらとか、そういうことはしていません。矢印 cond にいたってはぶっつけ本番であり、おかげさまで途中にどう考えてもしょーもないミスがあるのにオレがなかなか気付かないという、本物のハッカーな人にとってはある意味ハラハラドキドキの作品に仕上がってしまいました。ま、興味がありましたらどうぞということで。
さて、なんとなくやってみたのですが、このように並べると Common Lisp の伝統的なマクロと Scheme の健全なマクロでは、同じことをするのにどのように書くか、という違いがわかりやすくなる……のかもしれませんね。伝統的なマクロというのは、まさに Lisp の構文木を S 式として受け取り、 S 式を返す関数を書いてやるようなものなわけです。したがって、ふつうのリスト操作関数やシンボル系の関数を駆使して、ふつうの Lisp のプログラムのように書く。ところが健全なマクロではそういうことは実はできないために、いわばパターンマッチを繰り返して木の構造を少しずつ変化させていくという書き方をする。今回のような、任意長のボディを少しずつ見ながらその結果を溜めていくなケースでは、下請けのマクロを定義してやって、少しずつ変換させながら溜めていくというアプローチを取るのが一般的なようです(わたしは cut の定義をみてこれを学んだ、と思う)。まあ、できることはいっしょ(らしい)のだけれどやりかたは少し違いますね、という感じで、比べるのも申し訳ない気がするけれど Common Lisp の書き方と比べてもらえると幸い。ただまあ、「マクロも通常のプログラムもまったく同じように書ける」という Common Lisp と比べて、なんだかわけのわからない Scheme のマクロの書き方ってどうなの?という話はありますが。パターンマッチはオレには自然なので、これはこれでいいといえばいいんですが(とはいえ … のマジックっぷりには頭が下がる。超メンドくさそう)。