Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Delicious Lisp

711 views

Published on

Lisp/S式とClojureの基本を簡単に紹介。
Clojureおーいしい!

Published in: Software
  • Be the first to comment

Delicious Lisp

  1. 1. おいしいLisp
  2. 2. lagenorhynque
  3. 3. 自己紹介 (defprofile lagenorhynque [Kent OHASHI] :github/twitter @lagenorhynque :company 株式会社オプト :languages [Clojure Haskell Python Scala English français Deutsch русский] :interests [プログラミング 語学 数学])
  4. 4. Lispエイリアン cf. http://www.lisperati.com/logo.html alien language
  5. 5. 標準偏差(standard deviation)を計算しよう 標準偏差- Wikipedia
  6. 6. 関数呼び出し: Python >>> standard_deviation([1, 2, 3, 4, 5]) 1.4142135623730951
  7. 7. 関数定義: 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)
  8. 8. 関数呼び出し: Lisp (Clojure) (standard-deviation [1 2 3 4 5]) user=> 1.4142135623730951
  9. 9. Python 関数名(引数1, 引数2, 引数3, ...) Lisp (関数名引数1 引数2 引数3 ...)
  10. 10. 関数定義: Lisp (Clojure) (defn standard-deviation [xs] (let [n (count xs) μ (/ (apply + xs) n)] (Math/sqrt (/ (apply + (for [x xs] (Math/pow (- x μ) 2))) n))))
  11. 11. リファクタリング: Lisp (Clojure) なんとかしたい…… apply + ... 関数を定義しよう! (defn sum [ns] (apply + ns))
  12. 12. 関数の利用: 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))))
  13. 13. リファクタリング: 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)))
  14. 14. マクロの利用: 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)))
  15. 15. Lisp/S式 homoiconicity (同図像性): code as data マクロ: 自由自在なメタプログラミング DSL (ドメイン特化言語): 対象領域に合わせたミニ言語の構築 Lispにとってメタプログラミングは黒魔術ではなく言語の基本機能
  16. 16. DSLの例: SQL SELECT u.id, u.name FROM user u WHERE u.age >= 20; : Tasty SQL for ClojureKorma (select user (fields :id :name) (where (>= :age 20)))
  17. 17. 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])]])
  18. 18. DSLの例: JavaScript let colors = ["red", "yellow", "green"]; colors.forEach(color => console.log(color)); : Clojure to JS compilerClojureScript (def colors ["red" "yellow" "green"]) (doseq [color colors] (println color))
  19. 19. Lispのおいしさ コードをデータとして、データをコードとしてシームレスに扱える そのおかげで言語自体を目的に合わせて最適化できる
  20. 20. Further Reading : Clojure公式 : ClojureScript公式 : ブラウザで試せるClojure REPLのひとつ : ブラウザで試せるClojureScript REPLのひとつ : Clojureの入門書(日本語では現在唯一) : Clojureのレシピ本 : Lisp(主にCommon Lisp)でのマクロの活用について : DSL設計/実装のノウハウとRuby, Scala, Groovy, Clojureのメタプログラミングについて Clojure ClojureScript Clojure instaREPL Replumb REPL 『プログラミングClojure』 『おいしいClojure入門』 『On Lisp』 『実践プログラミングDSL』

×