205 Views
August 06, 16
スライド概要
Lisp/S式とClojureの基本を簡単に紹介。
Clojureおーいしい!
「楽しく楽にcoolにsmartに」を理想とするprogrammer/philosopher/liberalist/realist。 好きな言語はClojure, Haskell, Python, English, français, русский。 読書、プログラミング、語学、法学、数学が大好き! イルカと海も大好き🐬
おいしいLisp
lagenorhynque
自己紹介 (defprofile lagenorhynque [Kent OHASHI] :github/twitter @lagenorhynque :company :languages [Clojure Haskell Python Scala English français Deutsch русский] :interests [ ]) 株式会社オプト プログラミング 語学 数学
エイリアン Lisp cf. http://www.lisperati.com/logo.html alien language
標準偏差(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))) (defn standard-deviation [xs] (let [n (count xs) μ (/ (sum xs) n)] (-> (for [x xs] (Math/pow (- x μ) 2)) sum (/ n) Math/sqrt))) ⇒ (-> x f g h)
式 Lisp/S 同図像性): code as data マクロ 自由自在なメタプログラミング ドメイン特化言語): 対象領域に合わせたミニ言語の構築 Lispにとってメタプログラミングは黒魔術ではなく言語の基本機能 homoiconicity ( : DSL (
の例: SQL DSL SELECT u.id, u.name FROM user u WHERE u.age >= 20; Korma: Tasty SQL for Clojure (select user (fields :id :name) (where (>= :age 20)))
の例: HTML DSL <head> <title> Lisp</title> </head> <body> <ul> <li>Scheme</li> <li>Common Lisp</li> <li>Clojure</li> </ul> </body> たのしい Hiccup: Fast library for rendering HTML in Clojure (html [:head [:title " Lisp"]] [:body [:ul (for [x ["Scheme" "Common Lisp" "Clojure"]] [:li x])]]) たのしい
の例: JavaScript DSL let colors = ["red", "yellow", "green"]; colors.forEach(color => console.log(color)); ClojureScript: Clojure to JS compiler (def colors ["red" "yellow" "green"]) (doseq [color colors] (println color))
のおいしさ Lisp コードをデータとして、データをコードとしてシームレスに扱える そのおかげで言語自体を目的に合わせて最適化できる
Further Reading 公式 公式 ブラウザで試せる のひとつ ブラウザで試せる のひとつ プログラミング の入門書 日本語では現在唯一) おいしい 入門 のレシピ本 主に でのマクロの活用について 実践プログラミング 設計 実装のノウハウとRuby, Scala, のメタプログラミングについて Clojure: Clojure ClojureScript: ClojureScript Clojure instaREPL: Clojure REPL Replumb REPL: ClojureScript REPL 『 Clojure』: Clojure ( 『 Clojure 』: Clojure 『On Lisp』: Lisp( Common Lisp) 『 DSL』: DSL / Groovy, Clojure