Delicious Lisp

20
Lisp

Transcript of Delicious Lisp

Page 1: Delicious Lisp

おいしいLisp

Page 2: Delicious Lisp

lagenorhynque

Page 3: Delicious Lisp

自己紹介

(defprofile lagenorhynque [Kent OHASHI] :github/twitter @lagenorhynque :company 株式会社オプト :languages [Clojure Haskell Python Scala English français Deutsch русский] :interests [プログラミング 語学 数学])

Page 4: Delicious Lisp

Lispエイリアン

cf. http://www.lisperati.com/logo.html

alien language

Page 5: Delicious Lisp

標準偏差(standard deviation)を計算しよう

標準偏差 - Wikipedia

Page 6: Delicious Lisp

関数呼び出し: Python

>>> standard_deviation([1, 2, 3, 4, 5]) 1.4142135623730951

Page 7: Delicious Lisp

関数定義: 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)

Page 8: Delicious Lisp

関数呼び出し: Lisp (Clojure)

(standard-deviation [1 2 3 4 5]) user=> 1.4142135623730951

Page 9: Delicious Lisp

Python

関数名(引数1, 引数2, 引数3, ...)

Lisp

(関数名 引数1 引数2 引数3 ...)

Page 10: Delicious Lisp

関数定義: Lisp (Clojure)

(defn standard-deviation [xs] (let [n (count xs) μ (/ (apply + xs) n)] (Math/sqrt (/ (apply + (for [x xs] (Math/pow (- x μ) 2))) n))))

Page 11: Delicious Lisp

リファクタリング: Lisp (Clojure)

なんとかしたい……

apply + ...

関数を定義しよう!

(defn sum [ns] (apply + ns))

Page 12: Delicious Lisp

関数の利用: 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))))

Page 13: Delicious Lisp

リファクタリング: 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)))

Page 14: Delicious Lisp

マクロの利用: 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)))

Page 15: Delicious Lisp

Lisp/S式

homoiconicity (同図像性): code as dataマクロ: 自由自在なメタプログラミングDSL (ドメイン特化言語): 対象領域に合わせたミニ言語の構築

Lispにとってメタプログラミングは黒魔術ではなく言語の基本機能

Page 16: Delicious 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)))

Page 17: Delicious Lisp

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])]])

Page 18: Delicious Lisp

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))

Page 19: Delicious Lisp

Lispのおいしさ

コードをデータとして、データをコードとしてシームレスに扱えるそのおかげで言語自体を目的に合わせて最適化できる

Page 20: Delicious 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』