📝REPLとは

REPLとは以下の略.

  • read
  • evaluate
  • print
  • loop

REPLの説明は以下がわかりやすかった. 少し抜粋.

ref: 🔗REPL Driven Programming - tyano’s Techlog

REPLでnamespaceを読み込むということは簡易実行環境ではなく あなたが書いたプログラム内部に潜り込んでコンソールを開いた状態 そのもの. Clojureにインタープリタは存在しない. 関数をバイトコードにして実行するのみ.


Road to Common Lispの中で Lisp as a System という章も,例題がCommon Lispではあるものの実体はRDD.

  1. Lispプロセスを起動。
  2. プロジェクトを読み込む。
  3. コードをエディタで編集。
  4. 動作中のプロセスに、編集したコードだけをコンパイルさせる。
  5. プロセス中の変更したコードと対話。 REPL や HTTP request などを通して行う。
  6. 出力を調査 (コンソール、ブラウザなどで)。3に戻る。

Common Lispを書くことは、生物や呼吸する組織とやりとりすること、もしくは 熱心な助手に物事を教えることのように感じることができます。

ref: 💻A Road to Common Lisp - Steve Losh(2018)

📝REPL駆動開発とは

REPL-Oriented Programmingとも. RDDと略されたりもする.

ソースコードを即時にエディタで評価してインライン表示などすることで,素早くフィードバックをえることができる.

正確にはREPLにエディタからソースコードを評価した結果をもらったものを表示だが,操作的にはソースコードと対話するように開発ができる.

TDDは細かくテストを書くことで素早くフィードバックを得ることで先の不安を事前に取り除き前に進むための確信を得ることが目的のひとつだった. 継続的インテグレーション,継続的デリバリーなども. それらのサイクルの単位よりもRDDは圧倒的にフィードバックが早い! もはや最小単位.

Index

🖊Design Journal

RDDでコードを書くと,まずごにょごにょとアイデアを文で書いたりそれを小さな関数で実装して評価してみたりを繰り返しながら,つまりエディタと対話しながら小さな部品を組み立てていき,それらを組み合わせて大きな機能をつくる.

そのごにょごにょの部分はソースコードの下のほうにコメントアウトしつつ残しておくことで,どういう設計意図があってこのコードを実装したのかの履歴を,コードとともに残しておこうという考え.

こういうことができるのは,REPLで関数をかんたんに評価できるということもあるが,別の側面としてはClojureが関数型言語なので簡潔に副作用もなく部品としてコードを残しやすいという側面がある(と個人的には思っている).

実際の Design Journal実施例 はこちら.

ref: REPL Driven Development - DEV Community

⚖テスト駆動開発(TDD)とREPL(RDD)駆動開発の比較

🔖TDD

✨事前条件の準備の自動化にはTDDのSetup的なものがほしい

ある状況を再現したいときに, いわゆるTDDにおけるSetup的なものをRDDでやろうとすると, 少し大変. カッコを評価評価評価…(or doマクロで囲む).

そういうのを自動化したい場合はTDDのほうがいいかもしれない. TDDとは確認作業のコードによる自動化であったはず.

また, ✨REST APIのHTTP GET Requestは関数コールに過ぎないで気軽にデータ取得ができるとはいえ, それでもいちいち取得スクよりも, ローカルに取得しておいたデータを使ったほうが楽なので, そのへんのセットアップもTDDがいいかもしれない.

というよりもここでいうキモはTDDにおけるテストというよりも, 準備の自動化をコードで行うというSetupの部分.

✨副作用のある世界はRDDで行い純粋な世界はTDDで行う

RDDはとくに📝APIクライアント開発のような外部との境界を開発するのに役に立つ. 実験しながら手探りで開発ができる. そして, このような外部との境界はTDDは苦手だ.

逆に, 外部サーバから取得したJSONデータを一旦保存してしまえばあとはTDDのほうがやりやすい. TDDのよいところはSetUpによる事前準備の自動化だ. ここはRDDよりも優れている.

よって, 副作用のある世界はRDDで行い純粋な世界はTDDで行うといえる.

💡I/O部分にしか副作用させないように書けるファンクショナルなClojureは超良かったよというNubank高速開発の秘密もここかもしれない.

Topics

breakloop が差別化ポイント

ref REPL駆動プログラミングについて - Mikel Evins(邦訳)

breakloopにおいて中断されたコールスタックを上下に移動し、各スタックフレームからレキシカルに見えるすべての変数を調べることができます。実際、実行中のプログラムのすべてのデータを調べられます

Insights

✨チャットAIの生成したコードをREPLで素早く検証する

もはや, 🔖ChatAIが登場して人間が難しいコードを書く時代が終わるのかもしれない. 現在はコードのパーツを言葉から生成できるようになった. この吐き出されたコードが正しいのかどうかは人間か判断する必要がある. AIはテストをしてくれない.

すると, 吐き出されたスニペットを即座にコードに検証して部品として取り込むことはREPL駆動開発はとても優れている点と言える.

📍チャットAIをプログラミングに活かすには?

✨LispにおけるREPL駆動開発の民主化がIPython から派生したJupyter駆動開発

プログラミングにおけるREPL駆動開発をするときの心理的構えは, PythonのコードをJupyter Notebookで開発していくようなものだ. いろいろ実験することで, 楽しくなる.

REPL駆動開発における📝Design Journalとは, Jupyter NotebookのようなPlaygroundにとても似ている.

そもそも, Jupyter Notebookとは, IPythonの拡張としてアイデアが膨らんだものだった. そう考えると, REPL駆動開発の民主化がJupyter Notebookかもしれない.

📝Jupyter Notebook