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