- 日時 :2006/7/24 (Mon)
- 場所 :名大 理学部1号館(多元数理科学研究科) 307室
- 時刻 :18:00〜19:40
- 参加者:6名
- HaskellでJavascript、面白かったです。Biglooは、Scheme処理系で、CやJavaなどのコードを生成できるらしいです。それを使って、SchemeでAjaxをやっているのが、Hopです。ぜひ"Demos"をクリックしてみてください。ブラウザのなかにデスクトップがあるみたいになってて、マインスイーパで遊べます。(ブラウザによっては、Demosの上にカーソル当てても反応がなくて、リンクだと気づかないかもしれませんが、クリックしてみてください。)
- 継続とWeb開発、そしてJavaプログラミング
SmalltalkのSeasideのようなフレームワークの背景技術である、継続(continuation)を探ります。継続サーバーを利用すると、ステートレスであることに特有なスケーラビリティーを諦めることなくステートフルなプログラミング・モデルを実現できるため、Webアプリケーションの構築がずっと容易になるのです。 -- 源馬?
- どうも〜。Biglooをざっと眺めても見つけられなかったので助かりました。
- Seasideも面白そうですね。Ajaxと継続サーバーで何か面白い例が書けるのか,という点が今のところ興味があります。また,上のdWの記事で,戻るボタンで戻った時はその時の継続を復活させるだけ,とあるけれど,不可逆変化(DBへの書き込み,クレジットへの課金…)が起こった時には,やはり継続を無効化して戻るボタンによる再アクセスを防ぐ必要はあると思う(のだけど,どうなんだろう)。 -- けいご?
- 小笠原さんのConcurrent ML講座がとてもエキサイティングでした。入力も出力も非同期にして,'a event型の値で同期するというのがなるほどという感じ.レベルが違うので比較するのはおかしいかもしれませんが,非同期π計算では出力は非同期なんですが入力は同期的に書かなくてはなりません(非同期入力のエンコーディングもありますが).これはまた後ほど. -- けいご?
- Rhinoでmobility(「継続」 + 「直列化」 ≒ 「移動するプログラム」) k.inabaさんの大昔の記事.おもしろい. -- けいご?
- SXML(XML with Scheme) -- けいご?
- Concurrent ML講座、興味深かったです! k.inabaさんのとこのErlangの紹介も、面白いですね。 -- 源馬?
- Gaucheのライブラリに、まさにそのSXMLが入ってます☆sxml.ssax -- 源馬?
- Purely Functional Data Structures 同名の本が出ています. 日本語の資料! と/.(本家)の記事-- けいご?
- おお。Gaucheに入っている! さすが速い. -- けいご?
- なんでも継続 継続は「戻れるスレッド」だと考えれば良いと思ったのだけどどうでしょう.微妙かな -- けいご?
- なんでも継続の続きが、なぜSchemeにはreturnが無いのかで準備中です。Webアプリへの応用については、Scheme.CPSが分かりやすいです。自分自身、よくわかってないので、「戻れるスレッド」の考え方を今度教えてください。 -- 源馬?
- や,「戻れるスレッド」というのは言葉足らずだったかもしれません.実行を途中でセーブすれば(継続を保存すれば),どこかでゲームオーバーになってもセーブした所からやり直せるスレッド,?? あまり気にしないでください. -- けいご?
- JoCaml 今では Acuteのほうがいいらしい. -- けいご?
- ANNOUNCE: HSP.Clientside 0.01 かぶった…がくり.誰でも思いつく話ではあったけれど,まさか今日になって出てくるとは. -- けいご?
- An embedding of (typed) JavaScript? language in Haskell.
- A small combinator library for generating JavaScript? code.
- High-level interface to Ajax functionality.
- それでも、最先端のところというか、開拓地に立っている、というのだけでも、先輩はすごいと思います。 -- 源馬?
- ありがとう.あと自己レスだけど「誰でも思いつく」というのは作者さんに失礼だなあ…訂正します.誰かやってそうだとは思ってましたが. -- けいご?
おまけ:OCaml による mvar の実装
(方向性を持つチャネルを使うと、より間違いのない実装ができたります。)
open Event
type 'a mvar = { takeCh : 'a channel; putCh : 'a channel; ackCh : bool channel }
let mVar () =
let takeCh = new_channel ()
and putCh = new_channel ()
and ackCh = new_channel ()
in
let rec empty () =
let x = sync (receive putCh) in
sync (send ackCh true);
full x
and full x =
select [
wrap (send takeCh x) empty;
wrap (receive putCh) (fun _ -> sync (send ackCh false); full x)
]
in
ignore(Thread.create empty ());
{ takeCh = takeCh; putCh = putCh; ackCh = ackCh }
let take { takeCh = takeCh } = receive takeCh
exception Put
let put { putCh = putCh; ackCh = ackCh } x =
sync (send putCh x);
if sync (receive ackCh) then ()
else raise Put
(* 以下、使い方の例 *)
let (@@) f x = f x
let calc_new_value v =
v * 2
let _ =
let m = mVar () in
put m 10;
let _ = put m @@ calc_new_value @@ sync @@ take m in
Printf.printf "m=%d?n" (sync (take m))
;;