Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Macros Friday, October 11, 13
Slide 2
Slide 2 text
In almost any language worth using, large portions of the language’s functionality is implemented with the language itself. Friday, October 11, 13
Slide 3
Slide 3 text
Macros change the syntax of lisp code Friday, October 11, 13
Slide 4
Slide 4 text
Macros work on parse tree of your program Friday, October 11, 13
Slide 5
Slide 5 text
Only use macros when a function won’t do Friday, October 11, 13
Slide 6
Slide 6 text
Macros are evaluated during compile time Friday, October 11, 13
Slide 7
Slide 7 text
Macros modify / generate Clojure code by means of Clojure code Friday, October 11, 13
Slide 8
Slide 8 text
Clojure code is bootstrapped by several forms such as fn*, if, let*, new, dot and so on... Friday, October 11, 13
Slide 9
Slide 9 text
Simplest macro ever Friday, October 11, 13
Slide 10
Slide 10 text
(defmacro call [sym & params] (cons sym params)) Friday, October 11, 13
Slide 11
Slide 11 text
(call inc 1) '(inc 1) (call + 1 2 3) '(+ 1 2 3) Friday, October 11, 13
Slide 12
Slide 12 text
Macro yields a list of symbols, which are later evaluated Friday, October 11, 13
Slide 13
Slide 13 text
Unquote Friday, October 11, 13
Slide 14
Slide 14 text
(defmacro thrice [form] `(do ~form ~form ~form)) Friday, October 11, 13
Slide 15
Slide 15 text
(thrice (println 'one)) (do (println 'one) (println 'one) (println 'one)) ~form ~form ~form Friday, October 11, 13
Slide 16
Slide 16 text
Forces evaluation Places form one-to-one (for the list of (println 'one) places both elements in as a list) Friday, October 11, 13
Slide 17
Slide 17 text
Splice-unquote Friday, October 11, 13
Slide 18
Slide 18 text
(defmacro my-apply [sym forms] `(~sym ~@forms)) Friday, October 11, 13
Slide 19
Slide 19 text
(my-apply + [1 2 3]) (+ 1 2 3) ~@forms Friday, October 11, 13
Slide 20
Slide 20 text
Forces evaluation Places given collection, removing outer brackets Friday, October 11, 13
Slide 21
Slide 21 text
Gensym Friday, October 11, 13
Slide 22
Slide 22 text
my-sym# G_123143 Friday, October 11, 13
Slide 23
Slide 23 text
Avoid shadowing Auto-generate (unique) symbols on the fly Reuse the name without setting your hair on fire Friday, October 11, 13
Slide 24
Slide 24 text
Quoting Friday, October 11, 13
Slide 25
Slide 25 text
(defmacro a-is-two [& body] `(let [~'a 2] ~@body)) Friday, October 11, 13
Slide 26
Slide 26 text
(a-is-two (println a)) (let [a 2] (println a)) Friday, October 11, 13
Slide 27
Slide 27 text
Useful for generating your own symbols Creating DSLs Chaining/scoping/shadowing Friday, October 11, 13
Slide 28
Slide 28 text
Quote vs Syntax Quote Friday, October 11, 13
Slide 29
Slide 29 text
'println println `println clojure.core/println Friday, October 11, 13
Slide 30
Slide 30 text
Macroexpansion Friday, October 11, 13
Slide 31
Slide 31 text
macroexpand-1 macroexpand macroexpand-all Friday, October 11, 13