これは fukamachi products advent calendar 2016の18日目の記事です。
今日はtrivial-signalについて話します。土日に細かいライブラリ紹介が並んでいるのはただの手抜きです。
Common LIspとスクリプト
継続的なCommon Lispの課題として、スクリプトを書きづらいというものがありました*1。
開発時はREPLなので問題にならないのですが、アプリケーションの起動などを考えればコマンドラインで起動できなければいけません。他のUNIXコマンドとの連携を考えてもCLIから離れられるわけではありません。
これは8日目に紹介したShellyで解決しようとした課題でもありますが、それでもまだその他の軽量プログラム言語ほどの手軽さはありませんでした。
その理由の一つがシグナルハンドリングでした。
POSIXシグナルハンドリング
シグナルハンドリングはUNIXでのプロセス間通信の方法の一つです。プロセスが特定のシグナルを受け取ったときにどうするかを指定しておけば他プロセスから制御することができます。
たとえば、スクリプトをターミナルで起動して、C-cを押すとINT
が送られます。コマンドラインだとkill -INT <pid>
のように送ることができます。
Common LispではPOSIXAPIが仕様に含まれておらず *2、当然シグナルハンドリングもできません。C-cをするとSBCLではSB-SYS:INTERACTIVE-INTERRUPT
というコンディションが発生できSIGINT
のハンドリング自体はできますが、これでは2つ問題があります。
- 処理系依存である
- 他のシグナルはハンドリングできない
処理系可搬で、SIGINT
以外のシグナルもハンドリングしたい。
それを解決するために生まれたのが「trivial-signal」です。
誰か作ってくれ
trivial-signalに関しては、他に誰か得意な人がやってくれたほうがいい、と当初から考えていました。あまり自分自身が使う機会も多くありません。とはいえ誰かが都合よく書いてくれるわけでもないので今必要な自分がとりあえず書く、けれどいつか誰かに引き継げるなら引き継ぎたいと思っていました。
名前に"trivial"と含まれるライブラリはAPIが自明の小さなライブラリがほとんどで、言ってしまえば標準ライブラリのような立ち位置の名前です。"Woo"や"Envy"のようなユニークな名前でなく、公共性の高い名前を敢えてつけたのは、やっぱりあまり思い入れがなくメンテナンスも頑張るつもりがなかったからでしょうかね。
ライセンスも珍しく"public domain"にしており、誰でも自由に使ってもらうようにしました。
浅井さん登場
そしてGitHubに置いてQuicklispに申請してほんの2ヶ月ほど。浅井さん(@guicho271828)からPull Requestを2つもらいました。
浅井さんと言えばCommon Lispやclfreaks界隈をウォッチしている人はご存知かもしれません。eazy-processなどGitHubでいくつかCommon Lispライブラリを公開しています。
Pull Requestをもらったとき、もはや早くもtrivial-signalの存在さえ忘れていました。この機会だから浅井さんにメンテナお願いしよーっとと思って声をかけます *3。
深町: 実はこのライブラリあんまり使わないし、質を高く保てる自信ないんだよね。よかったらメンテしてくれない?
浅井: わかった
というような二つ返事であっさりメンテナを引き受けてくれました。ありがたし。
そういった経緯で、trivial-signalはこのアドベントカレンダーで紹介するライブラリで唯一僕がメンテナではありません。作者にあまり愛されずにドナドナされた不遇なライブラリだと思うとかわいそうなのでここで紹介して罪滅ぼしとします。
おわりに
trivial-signalはGitHubで公開されています。
明日のアドベントカレンダーは19日目のclfreaksについてです。お楽しみに。