レガシーコード生産ガイド

私に教えられることなら

ブラウザ上で完結する動的Lisp環境を作っている

最近やってることで書いた、ブラウザ上で完結する動的Lisp環境の制作記録。

とりあえずできた。

f:id:phaendal:20170624233133p:plain

方言の名前はDenLisp。

作ってるうちに名前空間の量が大変なことになったので、先に気合入れてIDEを整備した。便利になった。

今のところ

  • 自作Lisp方言(Clojure/wisp風)→JavaScriptへのコンパイラ(トランスレータ)
  • ブラウザ上で全てのソースを閲覧・変更できて、全体をビルドしてJavaScriptに書き出せる。自己増殖するイメージ。
  • ある程度LateBindingできている。例えばコンパイラのある関数にバグがあったとき、その関数だけを修正・コンパイルして動作を変更できる。修正はそのまま保存できる。
  • node.jsとExpressを使って簡単に保存できるサーバを書いた。
  • Vue.jsを使って、単一ファイルコンポーネント的なやつを書ける(上の画面はそれで作った)
  • main関数が定義されているモジュールを指定すれば、それに必要なモジュールと併せて最小限のコードを書き出せる。
  • LispLisp環境を操作できる。モジュールやコードを動いているオブジェクトとして自動生成したり。マクロとは別方向のメタプログラミング

などなど達成した。もう完全にブラウザ上のみで開発してます。

で、できたできた言うだけじゃ悲しいので公開したいんだけど、現状では内部構造を知ってないと殆ど使えないので躊躇している。例えば上で環境を操作できると書いたけど、逆に言えばモジュールを作るのにもコードを実行する必要がある。IDEを整備しなければ。

それとace editorの挙動がいまいち気に食わないのと、ライセンス周りがよくわからない。面倒なので調べる気もない。まあエディタも自分で作ります。

さらに全てのソースコードが閲覧・変更できてその場で試せることは絶対に貫きたいこと、LateBindingとイマイチ相性が悪いこと、などからVue.jsも置き換えたい。JSのエコシステムと混ぜる気は一切ない。

よって今後は 仕事で使いまくっていろいろ良くする→vdomと簡単なデータバインディングライブラリ作る→エディタ作る→IDE整備する→ローグライクを作って自分で遊びまくる→ドキュメント書きまくる→公開 となるでしょう。10年後ぐらいかな?物好きな人のためにpreview版をちょくちょく公開しようとは思う、暇があれば……。あとは友人知人に無理やり使わせたい。

最近やってること

近況です。

yahoさんがきた

前々から会って話してみたかったyahoさん(id:lhcpr)が遠路はるばるお越しくださった……!

で、様々に言葉を交わし、とても刺激になった。

あまりに刺激を受け、主にナシーム・ニコラス・タレブの著書などの影響で変わりつつあった人生観が、変化が加速して別人になった。

端的に言うと、悩まずに手を動かせるようになった。

ビジュアルプログラミング

10年前ぐらいにPureDataを触って以来ずっと作ってみたかった、ノードをパイプでつなぐ式(?)のやつを作り始めた。6/1〜6/8ぐらい。

Glyphiteといいます。

ちょっと前の動画

黒い画面

一番最初に自由に扱えるようになったプログラミング環境がemcas lisp & awkだったのもあって、いわゆる黒い画面が大好きだったんだけど、動いているコードの中で開発することの快感をSmalltalkで味わってしまい、だんだんファイルベース環境に嫌気が差していた。

とは言いつつやはり黒い画面は便利で、上のGlyphiteや仕事などもVue・Babel・Webpackあたり中心にゴリゴリ書いていた。

しかしGlyphiteを開発していたある日、ちょっとしたスタイルシートの変更で10秒程度の変換処理が走り、ついに ええかげんにせい!!! とプチッといった。

実行時開発

ブラウザで動くソフトはブラウザで作りたい。その場でロジックやデザインを変更して、それが残るようにしたい。

というわけでSmalltalkを触って以来ずっと作ってみたかった、コードを書きながら動かすやつを作り始めた。6/11ぐらいから今まで。

前の近況報告ではSmalltalk風にしようとか言ってたんだけど、結局JSでのDNU問題が面倒で、かつモジュール単位でのLate Bindingでもどうにかなるかな〜、と思ったのでClojurewispっぽいLisp->JSのコンパイラ(トランスレータ)を作ることにした。

本気でもう戻る気は無くて、これがダメだったらプログラマもうやめたるわ!!ぐらいのつもりで、会社の仲間に相談して2週間の猶予をもらい、フルタイムで書いている。

あと4日で実用にならなかったらとりあえず夜な夜な作るようにする、という約束だったんだけど、だいぶん気合入れたので間に合いそう。

VueでのインターフェイスももちろんLispで書いていて、あとは既にほぼ同じコードで動いているパーサコンビネータコンパイラを移植すればいい。多分いける、多分……

書いたコードをその場で試せて、関数単位でコンパイル・反映できて、そのまま保存できて、という目標は達成できている。想像していたより遥かに楽しい。無意味にリビングにサーバを立てて、タブレットChromeで編集して悦に入ったりしている。

開発が上手くいくと、即次のプロジェクトの開発が始まるので、公開はだいぶん後になると思う。がんばるぞ〜〜〜

生活

朝起きてキャッチボールしてプログラミングして野球中継見てプログラミングしてヘロヘロになって寝る、というカンジです。充実している。

最近やってること

近況です。

プログラミングについて

今まで体験した中で、お気に入りは

  • Smalltalkでの、デバッガ・インスペクタを用いたオブジェクトを直に触って環境を変えていくスタイル
  • Clojureでの、immutableでextensibleなマップやシーケンス等に関数を適用していくスタイル
  • Elmでの、型検査の安心感と、ML系の記法とカリー化による関数合成のやりやすさ

の3つです。

特にSmalltalkの、全てがオブジェクトという環境は衝撃的で、味わって以来、とにかくファイルベースの環境から逃げ出したいという思いが強くなるばかりです。

というわけでClojureみたいなimmutableなデータ構造をベースにした、Smalltalkっぽい環境作れたらな〜とコードを書いていました

Scheme(Gauche)でClojureのPersistent Vectorの解説記事を参考にデータ構造を実装して、いつも通りパーサコンビネータとパーサを作って、プロトタイプ用のSECDマシンを書き始めました。

そこでふと気づいたのは、デバッガやインスペクタでオブジェクトを覗きこみながらプログラミングするスタイルだと、目の前の値を書き換えられないというのは、とてもストレスが溜まるということです。何かがおかしいと思ったら、動いている最中のコードを書き換えてそのまま動作を見たいし、その変更をできるだけそのまま使いたいのです。そのためにはLate Bindingと、やはりオブジェクトの破壊的な変更が必要になります。

不変な値で上手くやる方法もあるかもしれませんが、遠回りにならない方法は思いつきそうにありません。また、そこまでこだわりもないので、諦めることにします。cloxpとか他の人に期待します。

ちなみに何故SqueakやPharoなどのSmalltalkをそのまま使わないのかというと、継承の存在です。継承は、Rich HickeySimple Made Easyで示したようなcomplect、複数の独立した概念を絡みあわせてしまったものだと思います。絡み合ったコードに、さらに別のコードを絡ませて上手く扱おうとしても、最終的に人智を超えると思います。少なくとも私の知能では簡単に手に負えなくなります。

というわけで、次はメッセージのディスパッチ方法を変えたSmalltalk風環境、のプロトタイプを作っていきます。今のところ、委譲ベースかな、とぼんやり考えています。

150人程度フォローしているTwitterアカウントを見ていると、変に時間を費やしてしまう上に何故か精神状態が非常に悪くなる事に気づき、更にそれに気づいたことで見たくなくなってしまったので殆ど見ていません……。理由はわかりませんが、ツイートや人の好き嫌いに関わらず、大量のメッセージが次々に流れてくる事自体がまずいのかなと推測しています。それと、今年1月ぐらいから、たま〜に絵を描くようになったのもあって、絵を貼ったりくだらないこと呟くようのアカウントを作りました。因果関係はわかりませんが、今のところ心身の状態は良いです。

音楽は打ち込みを完全にやめてしまって、Korg Kross-61というキーボードを買って毎日弾いています。ワイがやりたかったのはこれや!!という感触です。普通に弾いてるだけで楽しいので特に録音・発表などをするつもりは今のところないです。誰かとセッションはしてみたい。

運動あんまりしてないのまずいな〜〜と思っていたので、WBCの影響で再びプロ野球を見るようになった(昔野球少年でした)のもあって、彼女と毎朝キャッチボールしています。肩を回す+ボールを見るために視点を動かすせいか、肩こりや眼精疲労から来る頭痛やだるさが完全に消えて最高です。今のところ1時間程度で500kcalぐらいの運動になっています。それとゴルフ好きの親からいらないゴルフクラブを譲ってもらって、ゴルフの打ちっぱなしを始めてみました。今のところあまり面白さはわからない……。

それからMake: Electronics ―作ってわかる電気と電子回路の基礎という本に従って、LEDを焼き切ったりして楽しんでいます。いろいろアイディアがあるので、取り組むまでの道のりを早く埋めたいところです。

最近影響を受けた本

失敗の科学Antifragileです。

今までの自分が、根拠の無い予想と机上の空論、それによる恐怖によって動いていた(又は動けてなかった)のだな、と痛感しました。完全に人生観が変わって、そのおかげで最近は精神の調子がよろしいです。(そしてその影響であまりブログ記事を書いていませんでした、多分)

いろいろ語りたいんですが、中途半端に文章に残したくないことなので、誰かオフラインで会ったら聞いてください。