読者です 読者をやめる 読者になる 読者になる

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

私に教えられることなら

Common LispでScheme処理系作成に挑戦

CommonLisp

phaendal/a-piece-of-lisp · GitHub

C-c C-cやC-c C-k連発しながら作ったので、まだ普通には(sbcl --loadじゃ)動かない。定義を並べ替えたりテストを移したりしなければ。

とりあえずテストでレキシカルスコープ・クロージャ再帰まで確認した。

Lisp学習者の数だけLisp処理系ありそうだし、中身は置いといて制作の流れと感想を記しておく。

昨日

  • 初めての人のためのLISPに書いてあった、LISPLISP処理系を書く章を試してみる
  • 読んでいってもよくわからなかったので、コメントで流れを書いたり、(caddr expr)みたいなところを(lambda-body expr)みたいに一つずつ一時変数や関数に切り出して理解した
  • ある程度進んだところでシンボル・アトム・組み込み関数が動くことを確認し、興奮する
  • が、Common Lispのものを使っていたapplyなども自分で書くことに後から気付き、構造を大幅に変えなければいけないことに気づいて混乱し断念
  • ツイッターで教えてもらったwikibooksを読むと、よくわからないけどevalでenvを引き回していることに気付く
  • これがレキシカルスコープの秘密か?と思って調べてみると、昔見た時によくわからなかったM.Hiroi's Home Page / Common Lisp 入門:番外編のコードが今はわかることに気付く
  • ベッドで読んで一行ずつ追ってイメージして、ついにレキシカルスコープの動きがわかる。飛び起きて書きたい気分になったけど、今からやると絶対泥沼にハマると思い我慢して寝る

今日

  • 自分の時間が取れたとこから、上のページを読みながらゼロから書き始める。
  • 前に作ったexpectを使って、テスト駆動で開発。進む。
  • ポモドーロテクニックを使って25分で強制的にハマってる状態を断ち切る。助けられる。
  • 動く。感動する。今年はLISPを触り続けようと決意する。

気付きや感想など

  • caddrとかcddarとか、頭の中で展開できる人もいるんだろうけど、自分は途中で見失って完全に意味不明になる。全部長い名前の一時変数や関数で説明した方が時間の節約になった。
  • リストで柔軟に書けるけど、どういう構造に決めたのかはどこかに見やすくまとめておかないと辛い。
  • テスト駆動に切り替えた途端に進み方が倍以上になった。駆動、の部分が大事だった。
  • ポモドーロテクニックで無理矢理休憩したおかげで、ハマりから脱出したり、おかしい部分に気づいたりと助けられた。これからもやっていきたい。
  • 制作時間は、昨日4、今日8ポモドーロ、6時間ぐらい。こうやって単位になるのも面白いな。
  • 大昔にプログラミングを始めたとき、いつか言語処理系を作ってみたいと思ってた。それからずっと(まともな)プログラミングから離れてて、ようやく真剣に取り組んで、ちゃんと動くものができた。とても嬉しい。
  • 一定の知識が揃うと今までわからなかった概念やコード、本がわかるようになるカンジ、ゲームっぽくて面白く感じてきた。となれば、前提となる知識をすいすい身につけられるような、わかりやすい本と、楽しい練習に優先して取り組んだほうが良さそう。
  • テストコードはテスト対象の近くにあったほうがわかりやすい、かと思ったけどそんなことは無かった。長くて読みにくくなった。分けよう。
広告を非表示にする