helmをインストールすると、もれなくasync.elがついてくる。
Emacsの非同期ライブラリである。
バックグラウンドでEmacsをもうひとつ、立ち上げてそちらで処理させる、というもの。
( setq wrk (async-start ( lambda () 222))) -- 割愛 -- (async-get wrk) 222
システムモニタを立ち上げておくと、Emacsがもうひとつ、起動されるのがわかる。
100個とか、無理だろうけど 1。
( setq wrk ( loop for x from 1 to 10 collect (async-start `( lambda () ,x)))) -- 割愛 -- ( loop for x in wrk collect (async-get x)) (1 2 3 4 5 6 7 8 9 10)
カンマを使えば、変数の中身を展開できるけど、さすがにクロージャーでデータを渡すのは無理だろうなぁ。別プロセスだもんなぁ。スレッドならできるのだろうけど。
——と思ったけれど、やってみたらできた。
驚いた。
( setq lexical-binding t) t ( defun wrk (x) ( lambda() x)) wrk ( setq wrk ( loop for x from 1 to 10 collect (async-start (wrk x)))) -- 割愛 -- ( loop for x in wrk collect (async-get x)) (1 2 3 4 5 6 7 8 9 10)
なんで?
(wrk 1) (closure ((x . 1) t) nil x)
ああ、クロージャーはリストに展開されるんだ。
なるほど。それならpipe渡しでも可能だ。あれ? ということはelispだからできるってこと?
ほえぇ。elispはあなどれない。
Footnotes:
1
Emacs for Windowsでは10個でエラーになった。