Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

ClojureでREPL駆動開発を始めよう

先日、Opt Technologiesの社内勉強会で Practical REPL-driven Development with Clojure と題してClojureとREPL駆動開発の入門的な発表をしたので、その内容を簡単にご紹介します。

slide

1. Clojure Quick Intro

スライド pp. 4-8

極めて簡潔なClojure入門

Clojureとは

slide

Clojureのリテラル(+α)

slide

slide

Clojureのシンタックス

slide

2. Leiningen

ビルドツールLeiningenの使い方

スライド pp. 9-17

基本的な lein タスク

lein repl: REPLを起動

slide

lein new <template name> <project name>: テンプレートを指定してプロジェクト生成

例えば

$ lein new app clj-demo

slide

lein run: -main 関数を実行

slide

lein test: テストを実行

slide

lein uberjar: jarファイルを作成

slide

3. Clojure REPL

Clojure REPLの使い方

スライド pp. 18-24

REPLで利用可能な主なユーティリティ

doc: ドキュメントを出力

slide

source: ソースコードを出力

slide

*1, *2, *3: 直前の評価結果を保持する変数

slide

*e: 直前の例外を保持する変数 (cf. pst)

slide

検索系

4. Lisp Editing

Lisp編集のためのエディタプラグインの使い方

スライド pp. 25-60

Parinfer

Indent mode ではインデント編集時に括弧を、 Paren modeでは括弧編集時にインデントを自動調整するプラグイン

AtomParinferを設定した環境での操作例(抜粋)

slide

slide

↑では、改行後に書き始めるインデント位置によって自動的に閉じ括弧の位置が調整されている(Indent mode)。

ParEdit

特殊なキーバインドを利用して括弧とインデントを半自動的に調整するプラグイン

SpacemacsParEditを設定した環境での操作例(抜粋)

slide

slide

↑では、 M-( (メタキーと ( の同時入力)という特殊なキーバインドで直後の式を丸括弧で囲んでいる。

5. REPL-driven Development in practice

Clojure Koansと4ClojureというClojureチュートリアルを題材に、REPL駆動開発してみる

スライド pp. 61-96

コースA: Clojure Koans

禅の公案問答のごとく(?)ひたすら穴埋め問題に取り組みながらClojureの基礎が学べるチュートリアル

1. リポジトリをcloneする

$ git clone git://github.com/functional-koans/clojure-koans.git

slide

2. koan(公案)プログラムを実行する

$ cd clojure-koans/
$ lein koan run

実行すると、アサーションに失敗する。

slide

3. ソースファイルをエディタで開く

例えば

$ emacs src/koans/01_equalities.clj

slide

4. Clojure REPLを起動する

Spacemacs/Emacs + CIDERプラグインなら cider-jack-in コマンド(, ', M-RET ' or C-c M-j)

slide

5. ソース上の式を評価しながら穴埋め問題を解いてアサーションを通るようにする

ソースバッファ上でインライン評価

Spacemacs/Emacsなら cider-eval-last-sexp コマンド(, e e, M-RET e e, C-x C-e or C-c C-e)など

slide

ソースバッファからREPLバッファに送って評価

Spacemacsなら cider-send-last-sexp-to-repl コマンド(, s e, M-RET s e)など

slide

slide

6. 変更を保存してmeditation(瞑想/坐禅)の結果を確認する

slide

コースB: 4Clojure

Clojureの基礎は習得済みのプログラマ向けの問題集

1. エディタでClojureのバッファを開く

例えば

$ emacs clj-demo/src/clj_demo/4clojure/problem22.clj

slide

2. Clojure REPLを起動する

Spacemacs/Emacs + CIDERプラグインなら cider-jack-in コマンド(, ', M-RET ' or C-c M-j)

slide

3. 例としてProblem #22に取り組んでみる

シーケンスの要素数を返す関数を書く問題(標準関数 count は使わない)。

slide

4. 関数を書いてみる

slide

5. 書いた関数の動作確認をする

ソースバッファ上でインライン評価

Spacemacs/Emacsなら cider-eval-last-sexp コマンド(, e e, M-RET e e, C-x C-e or C-c C-e)など

slide

slide

ソースバッファからREPLバッファに送って評価

Spacemacsなら cider-send-last-sexp-to-repl コマンド(, s e, M-RET s e)など

slide

slide

slide

6. 問題ページに解答を貼り付けて実行してみる

問題ページで実行可能な形式にするには、以下のように元の関数定義の defnfn に置き換えると良い。

(fn my-count [coll]
  (reduce (fn [n _] (inc n))
          0
          coll))

Further Reading

  • スライド pp. 98-104

エディタプラグイン/設定

Lisp編集プラグイン

REPL駆動開発

lagenorhynque
「楽しく楽にcoolにsmartに」を理想とするprogrammer/philosopher。好きな言語はClojure, Haskell, Elixir, Python, English, français。読書、プログラミング、語学、法学、数学が大好き! イルカと海も大好き(*> ᴗ •*)ゞ
https://scrapbox.io/lagenorhynque/
opt
"INNOVATION AGENCY" を標榜するインターネット広告代理店。エンジニア組織 "Opt Techonologies" を中心にアドテクetc...に取り組んでいます。
https://opt-technologies.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away