Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
REPL-Oriented
Search
ayato
October 09, 2015
Programming
3
6.3k
REPL-Oriented
ayato
October 09, 2015
Tweet
Share
More Decks by ayato
See All by ayato
マイクロサービス内で動くAPIをF#で書いている
ayato0211
1
1.2k
Clojureという言語が私逹にもたらしたもの
ayato0211
6
3.1k
3年間考え続けてきたWebアプリケーションにおけるテストの話
ayato0211
3
290
Re:REPL-Driven Development
ayato0211
3
1.3k
Meta Template Engine
ayato0211
2
1.2k
超変換! Hiccup data structure!!
ayato0211
2
640
About Integrant
ayato0211
0
580
Muscle Assert
ayato0211
0
290
Clojureを用いたWebアプリケーション開発
ayato0211
2
3.2k
Other Decks in Programming
See All in Programming
高速開発のためのコード整理術
sutetotanuki
1
400
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
300
ThorVG Viewer In VS Code
nors
0
770
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
610
CSC307 Lecture 03
javiergs
PRO
1
490
AI巻き込み型コードレビューのススメ
nealle
1
180
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
690
Oxlint JS plugins
kazupon
1
890
CSC307 Lecture 06
javiergs
PRO
0
680
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
1.8k
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
Apache Iceberg V3 and migration to V3
tomtanaka
0
160
Featured
See All Featured
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.1k
A better future with KSS
kneath
240
18k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
910
Git: the NoSQL Database
bkeepers
PRO
432
66k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
150
Test your architecture with Archunit
thirion
1
2.1k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
99
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
56
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
430
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
430
Music & Morning Musume
bryan
47
7.1k
Transcript
REPL 指向 第 13 回 #渋谷java @_ayat_p / Cybozu Startups,
Inc.
REPL 指向至高 第 13 回 #渋谷java @_ayat_p / Cybozu Startups,
Inc.
(def _ayato_p {:name "あやぴー" :lang [:clojure] :company "Cybozu Startups, Inc."})
(def _ayato_p {:name "あやぴー" :lang [:clojure] :company "Cybozu Startups, Inc."})
最近 Clojure しか 書けなくなりました
はじめに
"REPL の話をします"
None
とは言ったけど
"Java の"とは一言も 言ってない :P
"Java の"とは一言も 言ってない :P "Clojure の" REPL の話をします
今日話すこと
•改めて REPL とは •Clojure における REPL とは •REPL 駆動開発
改めて REPL とは
•最近の言語はだいたい備えている •Ruby -> irb, Python -> ipython •Kotlin, Scala など
JVM 言語でも! (そろそろ Java でも !?)
•Read-Eval-Print Loop •読んで、評価して、出力する繰り返し
•Read-Eval-Print Loop •読んで、評価して、出力する繰り返し #とは
# e.g.) Ruby REPL irb(main):001:0> def hello irb(main):002:1> "Hello,
world" irb(main):003:1> end => nil irb(main):004:0> hello => "Hello, world"
# e.g.) Ruby REPL irb(main):001:0> def hello irb(main):002:1> "Hello,
world" irb(main):003:1> end => nil irb(main):004:0> hello => "Hello, world" READ & EVAL READ & EVAL
# e.g.) Ruby REPL irb(main):001:0> def hello irb(main):002:1> "Hello,
world" irb(main):003:1> end => nil irb(main):004:0> hello => "Hello, world" PRINT PRINT
# e.g.) Ruby REPL irb(main):001:0> def hello irb(main):002:1> "Hello,
world" irb(main):003:1> end => nil irb(main):004:0> hello => "Hello, world" LOOP
•対話的に開発するためのツール •考えた機能を確認しながら実装できる •(閉じた) REPL 環境に蓄積される •たぶん便利(?)
•対話的に開発するためのツール •考えた機能を確認しながら実装できる •(閉じた) REPL 環境に蓄積される •たぶん便利(?) その REPL 本当に便利ですか?
Clojure における REPL とは
たぶんあなたはこう思っている? 「 "Clojure における REPL" ? 他の言語と同じだろ? 」
たぶんあなたはこう思っている? 「 "Clojure における REPL" ? 他の言語と同じだろ? 」 違うんです
Clojure の REPL • Clojure は実行時に Clojure コンパイラの機 能をフルで使える •
REPL 上での実行はファイルのロードと同じよ うに動く • テキストエディタ等と協調動作しやすいよう になっている
違い • ファイルベースのワークフロー ( e.g. save -> auto-compile -> reload
) が必要ない • 実行中のプログラム環境を直接触れる • ライブラリですら REPL 上で再定義可能 • 環境を触る機能が充実している ( clojure.repl, tools.namespace とか ) • 本番環境ですら REPL を接続出来る
;; file (ns example.core) (defn inner-fn []) (defn outer-fn []
(inner-fn)) ;; repl e.c> (outer-fn) => nil e.c> (defn inner-fn [] "This is inner fn") => #'example.core/inner-fn e.c> (outer-fn) => "This is inner fn"
こういう経験ありませんか? • ファイル全体を更新したく ないけど、一部変更を反映 させたい • 開発時に素早くマイグレー ションしたい • SQL
をインクリメンタルに 書きたい • もっと早くトライアンドエ ラーしたい • ブラウザの環境を使いたい (in AltJS) • あの関数の名前が思い出せ ない • ドキュメントだけだと分か らないから試してみたい • etc, etc...
こういう経験ありませんか? • ファイル全体を更新したく ないけど、一部変更を反映 させたい • 素早くマイグレーションし たい • SQL
をインクリメンタルに 書きたい • もっと早くトライアンドエ ラーしたい • ブラウザの環境を使いたい (in AltJS) • あの関数の名前が思い出せ ない • ドキュメントだけだと分か らないから試してみたい • etc, etc... Clojure なら 簡単に解決可能
•REPL は Clojure での開発でなくては ならない存在 •むしろ REPL と適当なエディタで十分 ( Rich
Hickey は実際に Emacs と事実上 REPL だけで開発しているとかなんとか) •逆に REPL ないとつらい
•REPL は Clojure での開発でなくては ならない存在 •むしろ REPL と適当なエディタで十分 ( Rich
Hickey は実際に Emacs と事実上 REPL だけで開発しているとかなんとか) •逆に REPL ないとつらい REPL が開発を 加速させる
REPL 駆動開発
•REPL Driven Development •REPL で素早いフィードバックを得る
ワークフロー 考える/ コードを書く 思った通りに動く? REPL で試す テストを書いて 仕様を固める * ͷৗͰ͢
• Clojure の特徴も相まって REPL 上であら ゆる関数が簡単に実行可 • REPL を使ってボトムアップ開発 •
REPL で関数の定義やドキュメントが読める (悩んだら REPL に聞ける)
副産物的なもの •REPL からあらゆるコマンドを実行可 (サーバーを起動したり、マイグレーションしたり) •JVM の起動オーバーヘッドがない
デメリット(?) •まれに REPL 上の定義が残ってて誤動 作するときがある •テスト書きたくなくなる (だって動いてるし…)
まとめ
•REPL 駆動開発は楽しい •Clojure の REPL は最高 •Clojure 最高
Enjoy Clojure