nREPLに入門してみた話
自称 シンデレラガールズ スターライトステージ係
/uochan/uochan.icon uochan (飯塚将志)
発表を通した目標
nREPL の機能と目的がわかること
nREPL の拡張方法がわかること
将来的にnREPLをたくさんの人に拡張してもらい、 vim-iced vim-iced.iconを楽してより高機能にできること nREPLとは
https://gyazo.com/85c27f1a266f3c29b53166c93e2d69d9
Clojure network REPL
lein repl した時に一緒に起動するやーつ
nREPLとは
https://gyazo.com/142684e33fc273bc4291a05d8bc253c3
REPLサーバー/クライアントに加えて、Clojureの開発ツール類で必要とされる共通APIを提供するもの
CIDER も nREPL とやりとりしてリッチな開発環境を提供している
大きく Handler, Transport, Middleware の3つの要素で構成
nREPL Handler
https://gyazo.com/94cd35e01f46ba829fedd3ebf86249f2
クライアントからのリクエスト(メッセージ)を受け付ける関数
受け付けるだけで Handler 自体はレスポンスは返さない
大量のメッセージを非同期に処理するため
必ずしも1つの結果だけを返すとは限らないため
ex) "(+ 1 2) (def a 6)" の評価結果は2つ
nREPL Transport
https://gyazo.com/745d3c5dbdb47028e5626274f99107f7
nREPLクライアントとサーバー間でメッセージをやりとりする際の共通プロトコルを実装したもの
Handler が受け取ったメッセージと共に Middleware に渡し、引き回される
現状、公式に用意されているのは TTY と Bencode(デフォルトはこちら)
Bencode は BitTorrent で使われているエンコーディング nREPL Middleware
https://gyazo.com/9c9acc17351abd9a839553fab860c3d8
ring のミドルウェアとほぼ同じ。ハンドラーを受け取り新しいハンドラーを返す関数 前述の通り、ハンドラー自体は受付限定で、ミドルウェア層からレスポンスを返すという違いがある
nREPLで提供している標準機能はすべてミドルウェアとして実装されている
セッション管理やコードの評価など
追加したい機能があれば基本的には新しいミドルウェアを追加する
Hello nREPL
(+ 1 2 3) の評価を nREPL に直接リクエストする
code:console
d2:op4:eval4:code9:(+ 1 2 3)e
d2:ns4:user7:session36セッションキー5:value1:6ed7:session36:セッションキー6:statusl4:doneee デコードすると {"ns" "user", "session" "...", "value" "6"} {"session" "...", "status" ["done"]}
eval operation では評価結果を文字列として返す
Middlewareの拡張
CIDERで提供している機能を実現するための Middleware
リファクタリング機能に特化した Middleware
Middlewareを自作する
情報がかなり少なく、cider-nrepl や refactor-nrepl を参考に試行錯誤するしかない
最小構成のサンプルを用意した!
"hello" operation
code:core.clj
(if (= op "hello")
(transport/send transport (response-for msg {:status :done :hello "world"}))
(handler msg))))
自作Middlewareの登録
code:core.clj
(set-descriptor!
{:doc "Sample nREPL wrapper"
:requires #{} ; descriptors required by this descriptor :handles {"hello" {:doc "Sample nREPL middleware"
:requires {} ; keys required by this operation
:returns {"hello" "world" "status" "done"}}}})
今日からあなたも
nREPL Middleware Developer !
CIDER の機能追加にも貢献可能 !
ちなみに cider-nrepl は CIDER だけのものじゃない ※ 参考 Vimmer が Vim プラグイン向けに書いたコードもマージしてもらえる
最後に
nrepl, cider-nrepl, refactor-nrepl をみんなの力でもっと便利にしよう!
CIDER がもっと便利になります!
vim-iced の開発で楽できます! ウヒョー!!