Mais conteúdo relacionado
Semelhante a プログラミング言語Clojureのニャンパスでの活用事例 (20)
プログラミング言語Clojureのニャンパスでの活用事例
- 2. 自己紹介
‣ 太田 正悟 (@athos0220)
‣ Clojureコントリビュータ
‣ 今年2月よりニャンパス所属
‣ 2013年に某アニメ関連で話題になっていたニャン
パスと交流をはじめる
- 8. Clojureの概要: Lisp系言語
user=> (defn f [x] (+ x 1))
#’user/f
user=> (f 10)
11
user=> (defn f [x] (* x x))
#’user/f
user=> (f 10)
100
REPL(Read-Eval-Print Loop)を
使ったインタラクティブな開発
- 11. Clojureの概要: JVM言語
‣ Javaのオブジェクトを簡単に扱える
‣ 無名クラスも簡単に作れる
(String. “foo”)
(.substring “foo” 1)
Math/PI
(Long/parseLong “42”)
new String(“foo”)
“foo”.substring(1)
Math.PI
Long.parseLong(“42”)
Clojure Java
- 17. Clojureを使う理由: アジャイル開発との親和性
‣ イミュータブルなマップ(辞書)でデータの表現を柔軟に
‣ 設計に関する決定を後に遅らせることができる
{:type :rectangle
:width 30
:height 40}
(defmulti area :type)
(defmethod area :rectangle
[shape]
(* (:width shape)
(:height shape)))
public class Rectangle
extends Shape {
int width, height;
…
}
Clojure
Java
ポリモーフィックな振る舞いは
マルチメソッド等で後づけできる!
- 20. Clojureを使う理由: 言語の自由度
マクロ
‣ プログラマが独自の構文を定義できる仕組み
‣ 問題領域に合わせてClojureを拡張可能
(defmacro with-open
[[name file] & body]
`(let [~name ~file]
(try
~@body
(finally
(.close ~name)))))
(with-open [f (reader “foo”)]
(write-to-file f))
(let [f (reader “foo”)]
(try
(write-to-file f)
(finally
(.close f))))
マクロの定義
展開
- 25. baasday
‣ MBaaS (Mobile Backend as a Service)
‣ スマホアプリのバックエンド機能をクラウドサービスとして提供
‣ 運用:2年
‣ 利用者:のべ20万インストール
‣ スループット:150リクエスト/秒
Amazon SES
Amazon SNS
Amazon S3
Amazon ELB
App (EC2)
App (EC2)
App (EC2) DB (EC2)
- 27. Lesson Supporter
CMSモデル
‣ CMSを構成するペー
ジからなるマップ
‣ 着手から3日でCMS
モデルとページ描画
処理のコアが完成
‣ 後にページテンプレ
毎のカスタム描画方
法をマルチメソッド
で定義できるように
{:description “太田のパソコン教室”,
:_id “ohta-pc”,
:name “ohta-pc”,
:title “ようこそ太田のパソコン教室へ”,
:pages [{:display-name “ホーム”,
:name “intro”,
:template “intro”,
:context {:page-name “intro”,
:content “”,
:subtitle “よろしく”,
:page-title “自己紹介”}}
{:name “blog”,
:template “blog”,
:context {:blog-description nil},
:display-name “ブログ”}
……
]}
- 28. Lesson Supporter
user=> (import 'jp.webpay.webpay.WebPay)
jp.webpay.webpay.WebPay
user=> (def wp (WebPay. secret-key))
#'user/wp
user=> (import
'jp.webpay.webpay.data.CardRequest)
jp.webpay.webpay.data.CardRequest
user=> (def req (.. (CardRequest.)
(number number)
(expMonth 3)
(expYear 16)
(cvc "123")
(name "Shogo Ohta")))
#'user/req
user=> (.. wp token createRequest (card req)
execute)
#<TokenResponse …>
インタラクティブな
APIの確認
‣ WebPay APIによる
クレジット決済
‣ 初利用だったため、
REPLからAPIの使い
勝手を確認