Delicious Lisp
-
Upload
kent-ohashi -
Category
Software
-
view
426 -
download
0
Transcript of Delicious Lisp
おいしいLisp
lagenorhynque
自己紹介
(defprofile lagenorhynque [Kent OHASHI] :github/twitter @lagenorhynque :company 株式会社オプト :languages [Clojure Haskell Python Scala English français Deutsch русский] :interests [プログラミング 語学 数学])
標準偏差(standard deviation)を計算しよう
標準偏差 - Wikipedia
関数呼び出し: Python
>>> standard_deviation([1, 2, 3, 4, 5]) 1.4142135623730951
関数定義: Python
from math import sqrt
def standard_deviation(xs): n = len(xs) μ = sum(xs) / n return sqrt(sum((x - μ) ** 2 for x in xs) / n)
関数呼び出し: Lisp (Clojure)
(standard-deviation [1 2 3 4 5]) user=> 1.4142135623730951
Python
関数名(引数1, 引数2, 引数3, ...)
Lisp
(関数名 引数1 引数2 引数3 ...)
関数定義: Lisp (Clojure)
(defn standard-deviation [xs] (let [n (count xs) μ (/ (apply + xs) n)] (Math/sqrt (/ (apply + (for [x xs] (Math/pow (- x μ) 2))) n))))
リファクタリング: Lisp (Clojure)
なんとかしたい……
apply + ...
関数を定義しよう!
(defn sum [ns] (apply + ns))
関数の利用: Lisp (Clojure)
apply + ⇒ sum
(defn standard-deviation [xs] (let [n (count xs) μ (/ (sum xs) n)] (Math/sqrt (/ (sum (for [x xs] (Math/pow (- x μ) 2))) n))))
リファクタリング: Lisp (Clojure)
なんとかしたい……
(Math/sqrt (/ (sum (for [x xs] (Math/pow (- x μ) 2))) n))
マクロを定義しよう!
(defmacro -> [x & forms] (loop [x x, forms forms] (if forms (let [form (first forms) threaded (if (seq? form) (with-meta ̀(~(first form) ~x ~@(next form)) (meta form)) (list form x))] (recur threaded (next forms))) x)))
マクロの利用: Lisp (Clojure)
(h (g (f x))) ⇒ (-> x f g h)
(defn standard-deviation [xs] (let [n (count xs) μ (/ (sum xs) n)] (-> (for [x xs] (Math/pow (- x μ) 2)) sum (/ n) Math/sqrt)))
Lisp/S式
homoiconicity (同図像性): code as dataマクロ: 自由自在なメタプログラミングDSL (ドメイン特化言語): 対象領域に合わせたミニ言語の構築
Lispにとってメタプログラミングは黒魔術ではなく言語の基本機能
DSLの例: SQLSELECT u.id, u.name FROM user u WHERE u.age >= 20;
: Tasty SQL for ClojureKorma
(select user (fields :id :name) (where (>= :age 20)))
DSLの例: HTML<head> <title>たのしいLisp</title> </head> <body> <ul> <li>Scheme</li> <li>Common Lisp</li> <li>Clojure</li> </ul> </body>
: Fast library for rendering HTML in ClojureHiccup
(html [:head [:title "たのしいLisp"]] [:body [:ul (for [x ["Scheme" "Common Lisp" "Clojure"]] [:li x])]])
DSLの例: JavaScriptlet colors = ["red", "yellow", "green"];
colors.forEach(color => console.log(color));
: Clojure to JS compilerClojureScript
(def colors ["red" "yellow" "green"])
(doseq [color colors] (println color))
Lispのおいしさ
コードをデータとして、データをコードとしてシームレスに扱えるそのおかげで言語自体を目的に合わせて最適化できる
Further Reading: Clojure公式
: ClojureScript公式: ブラウザで試せるClojure REPLのひとつ
: ブラウザで試せるClojureScript REPLのひとつ: Clojureの入門書(日本語では現在唯一)
: Clojureのレシピ本: Lisp(主にCommon Lisp)でのマクロの活用について
: DSL設計/実装のノウハウとRuby, Scala,Groovy, Clojureのメタプログラミングについて
ClojureClojureScriptClojure instaREPLReplumb REPL『プログラミングClojure』『おいしいClojure入門』『On Lisp』『実践プログラミングDSL』