talking lisps

ウェアラブルREPLの探求 — LISPとの直結を目指して

お久しぶりです。山下@パイロットプロトラボ in 神山です。

春が大急ぎでやってきた神山では、梅が満開を迎え、もはや桜が咲き始めています。フキノトウを取って怒られるわ、子供がダニに噛まれるわ、大忙しです。

長いこと無線沈黙(radio silence)していましたが、なんとか綱渡りを続けています。春が来て、物事が動き出す今、冬の間山では一体何をしていたのか紹介しようと思います。

LISP

2019年は個人的に節目の年です。高校一年生の時に留学先に渡航する道すがら、成田空港のベンチでScheme (Dr. Racket)を初めて喋ってから、今年で10年を数えました。以来紆余曲折を経ながらLISP語族の言語を作ったり使ったりしています。

今朝、7年前に書いたちょっとした作品を掘り出しました。SchemeのマクロでSmalltalk-72を再現する謎かけです。頭の体操にどうぞ。https://gist.github.com/ympbyc/4388105

昨年夏ごろより、Common Lispを使い始めました。Common Lispは今最高にクールなLISPです。クールさを端的に表すプロジェクトとして、以下を紹介します。

  • CEPL : Lispマクロを使ったGLSLシェーダのライブプログラミング環境
  • Opusmodus : 統合作曲環境

他のCommon Lispの事例については、 lisp-lang.org の成功事例や lisp-journey.gitlab.io の2018年のまとめなどを参照のこと。

LISPは今も最高にクールですが、実は61年前に発明されて以来ずっとクールです。伝統的に、(強い)人工知能の研究や、計算理論の研究高級言語マシンの研究CG製作などで活躍してきた言語で、長い冬の時代も耐え抜いて、今にその遺伝子を伝えています。(リンク先はそれぞれのほんの一例です。山のように色んな研究があります。)

Symbolics 3600
Symbolics社のLISPマシン (CGワークステーション)

LISP、特にCommon Lispに連なる系譜のものでは伝統的に、リスナないしREPLと呼ばれるインタプリタ(またはインクリメンタルコンパイラ)を使用した、対話的なプログラミングが行われます。

理想的にはREPLで作り上げたランタイムの状態をイメージとして保存してしまば良いし、その仕組みも用意されているのですが、マルチスレッドとの相性が悪く、今一歩な面があり、実際にはEmacsのバッファをREPLに繋いで、ファイルとランタイムを同時に作っていくという手法が取られます。

この辺はSmalltalkの方が進んでいるとも言えますが、EmacsをLISPマシンとして捉える広い視野を持てば、同じくらい便利です。

冬の間に何をしていたのか紹介しようと思ったら、LISPを紹介してしまいました。つまりLISPの勉強をしていたというわけですが、その過程で、2つスケッチを描きました。

一つ目は起源を1982年のSymbolics Graphics Divisionに遡るCG製作環境を謎のロシア人に譲ってもらって使ってみたという記事で、勝手ながら2018年Lispアドベントカレンダーのトリを務めさせていただきました。あまりうまく纏まっていませんが、アドベントカレンダーはもともと3行くらいのTipsだったという言葉を信じてサラッと書きました。

LispマシンMirai — 標高+1m

そしてもう一点がこの記事の本題であるところの、ウェアラブルなREPLを目指して四苦八苦した記録です。

ウェアラブルコンピューティング

MIT Wearables
MIT Wearables (image taken from the Boston Globe)

美郷の文化祭でデジタル襖カラクリの公演が終わって、そろそろ冬が立とうかという頃、腰を痛めました。

子育て、サスのイカれた車、沢登り、思い当たる節が多すぎて実際のところはわかりませんが、おそらく慢性的に、デスクワークで体を冷やしていたのが大きな要因と予想しています。

何が原因であれ、冬の間ずっと、机に向かって同じ姿勢を取り続けるということができない状態でした。スタンドデスクですら、上半身が固まるとすぐに痛くなるので、たまに踊ったりしながら騙し騙し仕事をする日が続きました。

腰痛は歩けば治ると聞いて、実際歩いているときは楽だったので、散歩をしながらプログラミングをする方法を模索し始めました。最初は音声入力を試しましたが、ローカルで走らせれば無限に電池がいるし、サーバを建ててWiMaxで繋ぐのは山では接続が細いしで、どうも上手くいきませんでした。

そんな時に見つけたのがこの人。大学のコンピュータサイエンス学部のシステム管理者の Greg Priest-Dorman 氏は子供の頃の自転車事故が原因で腰に問題があり、歩いたり寝そべったりしながら仕事ができるようにウェアラブルコンピュータを使っていました。

さらに調べていくと、彼の使っている、モノキュラー(単眼)ディスプレイ、コーデッドキーヤ、テキスト読み上げというリグは、Reflection TechnologiesのPrivate Eye(1989年)の頃から使われている、枯れた(=良い)セットアップだということがわかってきました。

そこで、Vufineという単眼ディスプレイを購入し、コーデッドキーヤを自作しました。と言っても設計はフランスに住む TristanTrim 氏で、彼がオープンソースハードウェアとして公開しているasetniop-keyboardを製造しただけですが。

単眼ディスプレイにEmacs上のCommon Lisp REPL (SLIME)を表示して、コーデッドキーヤの空いたコンビネーションにLisp用のショートカット: (defun (や、(lambda (や、(apropos ‘などを詰め込んで、公園に行ってみました。

目が疲れます。わかってたことですが。

これはちょっとやってられないので、次にテキスト読み上げ(Text to Speech: TTS)を試し始めました。REPLへの入力と、出力を読み上げて理解できれば、目の負担を耳にデリゲートできるはずです。

TTSには、良く枯れたUniversity of EdinburghのFestivalを使用します。Festivalはスクリプティング言語にScheme(R4RS?)が採用されているというのもポイントです。

SLIME REPLが発行するイベントをEmacs Lispで傍受して、Common Lispの式を得ます。それをFestivalのSchemeに渡し、S式として読ませ、コードウォークをしながら、カッコや、記号を英単語に変換して読み上げさせます。

つまり、3つのLISPがS式という共通言語(多少の違いは容易に吸収できる)で会話する図式が出来上がります。

gist: https://gist.github.com/ympbyc/5ce1a14ee6402561a53c81b5c416bb15

一応読み上げの実験は成功というところで、春が来て、腰がだいぶ良くなりました。今年の冬までの間に進化させたいと思います。

LISPing at the end of time.