社内で久しぶりに LT 大会が開かれたので、私も発表しました。

ちなみにお題をこれに決めたきっかけは、[2017-10-21-1]async.el
を調べた時に promise.elasync-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 の感想

付箋紙で感想を頂きました。ありがたいことです。

FFLT masutaka へのコメント