社内で久しぶりに LT 大会が開かれたので、私も発表しました。
ちなみにお題をこれに決めたきっかけは、[2017-10-21-1]
で async.el
を調べた時に promise.el
と async-await.el
の存在を知ったからです。
予定通り(?)デモの途中で時間オーバーになったので、それぞれ解説して
いきます。
解説
まずは同期処理から。2 行目で call-process が子プロセスとして sh が、
孫プロセスとして sleep が起動した後、Message Box がポップアップし
ます。同期処理なので call-process の間 Emacs は固まります。
start-process で非同期処理にしました。Emacs は固まらなくなりました
が、コード量は増えてしまいました。let ではなく setq 使っているのは、
発表での説明簡略化のためです。
lambda で関数を減らしました。場合によってはアリです。
make-process を使ってみました。動作は変わりませんが、こちらの方が
分かりやすいかもしれません。
これも lambda で関数を減らすことは出来ます。ただ、同期処理と比べる
と相変わらずコード量が多いです。非同期処理にしたいだけなのに。
ここで promise.el の登場です。ビルトインライブラリではないので、
package.el 等でインストールします。
Promise に馴染みのある人であれば、読みやすいコードなのかもしれません。
8 行目でゼロ除算エラーを発生させました。promise-catch によって無事
catch されます。エラーの有無に関わらずその後 done は通ります。
次は async-await.el の登場です。これもビルトインライブラリではあり
ません。
同期処理のコードとほぼ同じように書くことが出来ました。これはすごい。
defun を async-defun にして、call-process を (await
(promise:make-process… に変えただけです。関数定義さえも自分で定
義できる Lisp は、相変わらず柔軟性ありすぎです。
エラー処理は今までの Emacs Lisp と同じように書けます。9 行目でゼロ
除算エラーが発生しますが、11 行目で捕捉することが出来ます。
所感
資料の「所感」からの引用です。
・以前よりも非同期処理の面倒臭さは少なくなったと感じた
・シンタックスを定義できる言語は、表現の自由度が高まる
・Lispはデータも関数も全部S式で表現できる。美しい
おまけ
資料の「Special Thanks」への補足です。
今回コードのシンタックスハイライトに使った highlight が超便利でした。
“$ highlight -O rtf hoge.rb | pbcopy” して Keynote にコピペするだ
けで、ハイライトされたコードをコピペ出来ます。"$ brew install
highlight" でインストール可能です。
あと、今回もフォントはデフォルトから変更しました。
こちらの記事の実践になります。ありがとうございます。
個人的な Keynote ベストプラクティス 2017 - kakakakakku blog
LT の感想
付箋紙で感想を頂きました。ありがたいことです。