Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
sohta
3,923 views
Macros in Clojure
Technology
◦
Read more
17
Save
Share
Embed
Embed presentation
Download
Downloaded 23 times
1
/ 44
2
/ 44
3
/ 44
4
/ 44
5
/ 44
6
/ 44
7
/ 44
8
/ 44
9
/ 44
10
/ 44
11
/ 44
12
/ 44
13
/ 44
14
/ 44
15
/ 44
16
/ 44
17
/ 44
18
/ 44
19
/ 44
20
/ 44
21
/ 44
22
/ 44
23
/ 44
24
/ 44
25
/ 44
26
/ 44
27
/ 44
28
/ 44
29
/ 44
30
/ 44
31
/ 44
32
/ 44
33
/ 44
34
/ 44
35
/ 44
36
/ 44
37
/ 44
38
/ 44
39
/ 44
40
/ 44
41
/ 44
42
/ 44
43
/ 44
44
/ 44
More Related Content
PDF
Rubyインスタンス変数
by
Masayuki Nishida
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
PDF
Rubyメソッド探索
by
Masayuki Nishida
PDF
Vim入門 20130210
by
marony
PPTX
Xtext&Xtend documents
by
Shintaro Hosoai
PPTX
Javaプログラミング入門【第2回】
by
Yukiko Kato
PDF
値付き Enum 入門、そして伝説へ #yhios #cocoa kansai
by
Tomohiro Kumagai
PDF
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
by
Leonardo Borges
Rubyインスタンス変数
by
Masayuki Nishida
BOF1-Scala02.pdf
by
Hiroshi Ono
Rubyメソッド探索
by
Masayuki Nishida
Vim入門 20130210
by
marony
Xtext&Xtend documents
by
Shintaro Hosoai
Javaプログラミング入門【第2回】
by
Yukiko Kato
値付き Enum 入門、そして伝説へ #yhios #cocoa kansai
by
Tomohiro Kumagai
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
by
Leonardo Borges
Viewers also liked
PPT
A little exercise with clojure macro
by
Zehua Liu
PDF
不自然なcar/ナチュラルにconsして
by
mitsutaka mimura
PDF
Patterns
by
David Nolen
PDF
A Dive Into Clojure
by
Carlo Sciolla
ODP
Clojure: Practical functional approach on JVM
by
sunng87
PDF
Writing Macros
by
RueiCi Wang
PDF
入門ClojureScript
by
sohta
PDF
Continuation Passing Style and Macros in Clojure - Jan 2012
by
Leonardo Borges
PPTX
Clojure的魅力
by
dennis zhuang
PPTX
Clojure概览
by
dennis zhuang
PDF
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
by
AboutYouGmbH
PDF
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
by
sohta
KEY
(map Clojure everyday-tasks)
by
Jacek Laskowski
KEY
Clojure: a LISP for the JVM
by
Knowledge Engineering and Machine Learning Group
PDF
Introduction to clojure
by
Abbas Raza
PDF
DSL in Clojure
by
Misha Kozik
PDF
プログラミング言語Clojureのニャンパスでの活用事例
by
sohta
PDF
Clojure from ground up
by
Di Xu
PDF
アルゴリズムのイメージを擬人化する
by
AtCoder Inc.
A little exercise with clojure macro
by
Zehua Liu
不自然なcar/ナチュラルにconsして
by
mitsutaka mimura
Patterns
by
David Nolen
A Dive Into Clojure
by
Carlo Sciolla
Clojure: Practical functional approach on JVM
by
sunng87
Writing Macros
by
RueiCi Wang
入門ClojureScript
by
sohta
Continuation Passing Style and Macros in Clojure - Jan 2012
by
Leonardo Borges
Clojure的魅力
by
dennis zhuang
Clojure概览
by
dennis zhuang
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
by
AboutYouGmbH
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
by
sohta
(map Clojure everyday-tasks)
by
Jacek Laskowski
Clojure: a LISP for the JVM
by
Knowledge Engineering and Machine Learning Group
Introduction to clojure
by
Abbas Raza
DSL in Clojure
by
Misha Kozik
プログラミング言語Clojureのニャンパスでの活用事例
by
sohta
Clojure from ground up
by
Di Xu
アルゴリズムのイメージを擬人化する
by
AtCoder Inc.
Similar to Macros in Clojure
PPT
言語処理系入門3
by
Kenta Hattori
PPTX
Gaucheでマクロを書こう
by
Hideaki Nagamine
ODP
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
by
m2ym
PPTX
Ocaml lecture slides 01 at axsh
by
Tomofumi Hayashi
PDF
Lisp tutorial for Pythonista : Day 2
by
Ransui Iso
PDF
F#入門 ~関数プログラミングとは何か~
by
Nobuhisa Koizumi
PDF
Lisp講義1
by
stibear (stibear1996)
PDF
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
by
Satoshi imai
PDF
Javaプログラミング入門
by
なおき きしだ
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
by
Hiromi Ishii
PDF
Run-time Code Generation and Modal-ML の紹介@PLDIr#2
by
Masahiro Sakai
PDF
Coq Party 20101127
by
tmiya
PDF
Lisp study
by
Taichi Kimura
PPT
言語処理系入門5
by
Kenta Hattori
PPT
言語処理系入門7
by
Kenta Hattori
KEY
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
by
sn_monochr
PDF
ラボユース 最終成果報告会
by
shiftky
PDF
Lispとは何なのか - 同図像性がもたらす力とその利用法
by
Naoya Yamashita
PDF
Haskell Lecture 1
by
Yusuke Matsushita
PPTX
サンプルで学ぶAlloy
by
NSaitoNmiri
言語処理系入門3
by
Kenta Hattori
Gaucheでマクロを書こう
by
Hideaki Nagamine
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
by
m2ym
Ocaml lecture slides 01 at axsh
by
Tomofumi Hayashi
Lisp tutorial for Pythonista : Day 2
by
Ransui Iso
F#入門 ~関数プログラミングとは何か~
by
Nobuhisa Koizumi
Lisp講義1
by
stibear (stibear1996)
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
by
Satoshi imai
Javaプログラミング入門
by
なおき きしだ
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
by
Hiromi Ishii
Run-time Code Generation and Modal-ML の紹介@PLDIr#2
by
Masahiro Sakai
Coq Party 20101127
by
tmiya
Lisp study
by
Taichi Kimura
言語処理系入門5
by
Kenta Hattori
言語処理系入門7
by
Kenta Hattori
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
by
sn_monochr
ラボユース 最終成果報告会
by
shiftky
Lispとは何なのか - 同図像性がもたらす力とその利用法
by
Naoya Yamashita
Haskell Lecture 1
by
Yusuke Matsushita
サンプルで学ぶAlloy
by
NSaitoNmiri
More from sohta
PDF
入門Transducers
by
sohta
PDF
Clojure Language Update (2015)
by
sohta
PDF
入門core.async
by
sohta
PDF
REPLライフをもっと快適に
by
sohta
PDF
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
by
sohta
PDF
ClojureではじめるSTM入門
by
sohta
PDF
Clojureによるバイトコードプログラミング
by
sohta
入門Transducers
by
sohta
Clojure Language Update (2015)
by
sohta
入門core.async
by
sohta
REPLライフをもっと快適に
by
sohta
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
by
sohta
ClojureではじめるSTM入門
by
sohta
Clojureによるバイトコードプログラミング
by
sohta
Macros in Clojure
1.
Macros in Clojure
@athos0220
2.
Agenda • Lispマクロ入門 • Clojureのマクロとその周辺 •
Clojureマクロの応用例
3.
Lispマクロ入門
4.
マクロとは
when if = print print = do nil mod 0 "Fizz" "Buzz" mod 0 print print x 15 x 15 "Fizz" "Buzz" (if (= (mod x 15) 0) (when (= (mod x 15) 0) (do (print “Fizz”) (print “Fizz”) (print “Buzz”)) (print “Buzz”)) nil) 構文木を組み替えるための仕組み →自由に構文を作ることができる仕組み
5.
マクロの定義 • シンボルやリストで展開形のコードを 作ってやる
(when ⃝⃝ (if ⃝⃝ △△ (do △△ ✕✕) ✕✕) nil)
6.
マクロの定義
• シンボルやリストで展開形のコードを 作ってやる (when ⃝⃝ (if ⃝⃝ △△ (do △△ ✕✕) ✕✕) nil) (defmacro when [test & body] (list ’if test (cons ’do body) nil))
7.
マクロの定義
• シンボルやリストで展開形のコードを 作ってやる (when ⃝⃝ (if ⃝⃝ △△ (do △△ ✕✕) ✕✕) nil) (defmacro when [test & body] (defmacro when [test & body] (list ’if `(if ~test test (do ~@body) (cons ’do body) nil) nil))
8.
名前衝突の問題
9.
名前衝突の問題 束縛変数の衝突
自由変数の衝突
10.
名前衝突の問題 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val ~expr1] (if val val ~expr2)))
11.
名前衝突の問題 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val ~expr1] (if val val ~expr2))) (let [val true] (or false val))
12.
名前衝突の問題 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val ~expr1] (if val val ~expr2))) (let [val true] (or false val)) (let [val true] (let [val false] (if val val val))
13.
名前衝突の問題 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val ~expr1] (if val val ~expr2))) (let [val true] (or false val)) (let [val true] (let [val false] (if val val val))
14.
名前衝突の問題 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val ~expr1] (if val val ~expr2))) (let [val true] (or false val)) (let [val true] (let [val false] (if val val val))
15.
名前衝突の問題 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val ~expr1] (if val val ~expr2))) (let [val true] (let [let nil] (or false val)) (or false true)) (let [val true] (let [val false] (if val val val))
16.
名前衝突の問題 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val ~expr1] (if val val ~expr2))) (let [val true] (let [let nil] (or false val)) (or false true)) (let [val true] (let [let nil] (let [val false] (let [val false] (if val (if val val val val)) true))
17.
名前衝突の問題 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val ~expr1] (if val val ~expr2))) (let [val true] (let [let nil] (or false val)) (or false true)) (let [val true] (let [let nil] (let [val false] (let [val false] (if val (if val val val val)) true))
18.
名前衝突の問題 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val ~expr1] (if val val ~expr2))) (let [val true] (let [let nil] (or false val)) (or false true)) (let [val true] (let [let nil] (let [val false] (let [val false] (if val (if val val val val)) true))
19.
健全なマクロ (Hygienic macros) •
名前の衝突を自動的に回避してくれる ハイパーなマクロ
20.
健全なマクロ (Hygienic macros)
• 名前の衝突を自動的に回避してくれる ハイパーなマクロ (define-syntax or (syntax-rules () ((or expr1 expr2) (let ([val expr1]) (if val val expr2)))))
21.
健全なマクロ (Hygienic macros)
• 名前の衝突を自動的に回避してくれる ハイパーなマクロ (define-syntax or (let ([val true]) (syntax-rules () (or false val)) ((or expr1 expr2) (let ([val expr1]) (if val val expr2)))))
22.
健全なマクロ (Hygienic macros)
• 名前の衝突を自動的に回避してくれる ハイパーなマクロ (define-syntax or (let ([val true]) (syntax-rules () (or false val)) ((or expr1 expr2) (let ([val expr1]) (if val (let ([val true]) val (let ([val_0 false]) expr2))))) (if val_0 val_0 val)))
23.
マクロの分類 • 高レベル:専用のパターン言語をもつ • 低レベル:Lispの関数でコードを操作する
低レベル 高レベル 不 健 • 伝統的なマクロ 全 健 • syntactic closures • explicit renaming • syntax-rules 全 • syntax-case
24.
マクロの分類 • 高レベル:専用のパターン言語をもつ • 低レベル:Lispの関数でコードを操作する
低レベル 高レベル 不 健 • 伝統的なマクロ 全 > 健 • syntactic closures • explicit renaming • syntax-rules 全 • syntax-case
25.
マクロの分類 • 高レベル:専用のパターン言語をもつ • 低レベル:Lispの関数でコードを操作する
低レベル 高レベル 不 健 • 伝統的なマクロ 全 > > 健 • syntactic closures • explicit renaming • syntax-rules 全 • syntax-case
26.
Clojureの マクロシステムとその周辺
27.
Clojureのマクロシステム • 伝統的なマクロがベース
低レベル 高レベル 不 健 • 伝統的なマクロ 全 > • syntax-quote が特徴 > 健 • syntactic closures • explicit renaming • syntax-rules 全 • syntax-case
28.
syntax-quote
29.
syntax-quote 束縛変数の衝突
自由変数の衝突
30.
syntax-quote 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val# ~expr1] (if val# val# ~expr2)))
31.
syntax-quote 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val# ~expr1] (if val# syntax-quote val# ~expr2)))
32.
syntax-quote 束縛変数の衝突
自由変数の衝突 (defmacro or [expr1 expr2] `(let [val# ~expr1] (if val# syntax-quote val# ~expr2))) (let [val true] (or false val))
33.
syntax-quote
束縛変数の衝突 自由変数の衝突 (defmacro or [expr1 expr2] `(let [val# ~expr1] (if val# syntax-quote val# ~expr2))) (let [val true] (or false val)) (let [val true] (clojure.core/let [val__419__auto__ false] (if val__419__auto__ val__419__auto__ val)) #をつけた名前を自動でリネーム (auto-gensym)
34.
syntax-quote
束縛変数の衝突 自由変数の衝突 (defmacro or [expr1 expr2] `(let [val# ~expr1] (if val# syntax-quote val# ~expr2))) (let [val true] (let [let nil] (or false val)) (or false true)) (let [val true] (clojure.core/let [val__419__auto__ false] (if val__419__auto__ val__419__auto__ val)) #をつけた名前を自動でリネーム (auto-gensym)
35.
syntax-quote
束縛変数の衝突 自由変数の衝突 (defmacro or [expr1 expr2] `(let [val# ~expr1] (if val# syntax-quote val# ~expr2))) (let [val true] (let [let nil] (or false val)) (or false true)) (let [val true] (let [let nil] (clojure.core/let [val__419__auto__ false] (clojure.core/let [val__419__auto__ false] (if val__419__auto__ (if val__419__auto__ val__419__auto__ val__419__auto__ val)) true)) #をつけた名前を自動でリネーム (auto-gensym) その他の名前にはnamespace名をqualifyする
36.
メタデータ
• ほとんどすべてのオブジェクトにメタデータを付加できる • Clojureではコードもデータ →コードのほとんどあらゆる部分にメタデータをアノテー ションとして付加できる 名前をnamespaceにプライベートにする (defn ^:private f [x] x) (def ^:dynamic x nil) 動的スコープの変数にする 戻り値と引数の型ヒント (defn fact ^long [^long x] (if (= x 0) 1 (* x (fact (- x 1)))))
37.
Java Interop • ClojureからJavaのクラスにアクセスできる •
Clojureは大部分がJavaで書かれている • Javaで書かれているClojureのコンパイラ自 体や内部で使われる構文木にも触れる
38.
暗黙の引数 &formと&env • マクロ呼出しのフォームを囲むコンテ
キストに関する情報が渡ってくる - &form:マクロ呼出しのフォーム全体 - &env:マクロ呼出しの時点で見えて いるローカル環境
39.
Clojure マクロの応用例
40.
the オペレータ
http://d.hatena.ne.jp/athos/20120129/THE_operator_in_clojure • 「型を1つ引数にとり現在のスコープに唯一存 在するその型のオブジェクトを返す演算子」 by @kinaba • &envを使って、そのスコープで見えている変 数のうち、指定した型がメタデータに付いて いるものを拾ってくる (let [^File _ (File. "foo.txt") ^FileReader __ (FileReader. (the File)) ^BufferedReader ___ (BufferedReader (the FileReader))] (.readLine (the BufferedReader)))
41.
inline assembler マクロ
http://www.slideshare.net/sohta/shibuyalisp-tt7 • Clojureコンパイラが使うバイトコード 生成ライブラリをマクロ展開時に使う (def fact public final java.lang.Object invoke(java.lang. (fn-iasm [n] Code: (aload_1) Stack=2, Locals=6, Args_size=2 (checkcast Integer) 0: aload_1 (invokevirtual ^int Integer/intValue []) 1: checkcast #25; //class java/lang/I (istore_2) 4: invokevirtual #29; //Method java/lang/ (iconst_1) 7: istore_2 (istore_3) 8: iconst_1 :loop 9: istore_3 (iload_2) 10: iload_2 (ifeq :end) 11: ifeq 24 (ilaod_2) 14: iload_2 (iload_3) 15: iload_3 (imul) 16: imul (istore_3) 17: istore_3 (iinc 2 -1) 18: iinc 2, -1 (goto :loop) 21: goto 10 :end 24: iload_3 (iload_3) 25: invokestatic #33; //Method java/lang/ (invokestatic ^Integer Integer/valueOf [int]) 28: areturn (areturn)))
42.
syntactic-closure
http://d.hatena.ne.jp/athos/20120506/syntactic_closure_in_clojure • syntactic closuresによる健全なマクロを定義で きるようにするライブラリ 低レベル 高レベル • syntax-quoteで定義できない 不 健 全 • 伝統的なマクロ ある種のマクロが定義可能に • syntactic closures (define-syntax or [expr1 expr2] 健 • explicit renaming • syntax-rules 全 • syntax-case (sc-macro-transformer (fn [env] (quasiquote (let [val ~(make-syntactic-closure env nil expr1)] (if val val ~(make-syntactic-closure env nil expr2))))))) (let [val true] (let [val true] (or false val)) (let [val396 false] (if val396 val396 val))
43.
まとめ • Clojureのマクロ周りには遊べるおも ちゃがたくさん •
アイデア次第で貢献できる可能性? • nagoya-lispに参加しましょう
44.
おわり
Download