File: macros.clj

package info (click to toggle)
clojure1.6 1.6.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 3,608 kB
  • ctags: 5,838
  • sloc: java: 27,336; xml: 498; sh: 69; makefile: 45
file content (69 lines) | stat: -rw-r--r-- 2,333 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
;   Copyright (c) Rich Hickey. All rights reserved.
;   The use and distribution terms for this software are covered by the
;   Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
;   which can be found in the file epl-v10.html at the root of this distribution.
;   By using this software in any fashion, you are agreeing to be bound by
;   the terms of this license.
;   You must not remove this notice, or any other, from this software.

; Author: Frantisek Sodomka

(ns clojure.test-clojure.macros
  (:use clojure.test))

; http://clojure.org/macros

; ->
; defmacro definline macroexpand-1 macroexpand


;; -> and ->> should not be dependent on the meaning of their arguments

(defmacro c
  [arg]
  (if (= 'b (first arg))
    :foo
    :bar))

(deftest ->test
  (let [a 2, b identity]
    (is (= (-> a b c)
           (c (b a))))))

(deftest ->>test
  (let [a 2, b identity]
    (is (= (->> a b c)
           (c (b a))))))

(deftest ->metadata-test
  (testing "a trivial form"
    (is (= {:hardy :har :har :-D}
           (meta (macroexpand-1 (list `-> (with-meta
                                            'quoted-symbol
                                            {:hardy :har :har :-D})))))))
  (testing "a nontrivial form"
    (let [a (with-meta 'a {:foo :bar})
          b (with-meta '(b c d) {:bar :baz})
          e (with-meta 'e {:baz :quux})
          expanded (macroexpand-1 (list `-> a b e))]
      (is (= expanded '(e (b a c d))))
      (is (= {:baz :quux} (meta (first expanded))))
      (is (= {:bar :baz} (meta (second expanded))))
      (is (= {:foo :bar} (meta (second (second expanded))))))))


(deftest ->>metadata-test
  (testing "a trivial form"
    (is (= {:hardy :har :har :-D}
           (meta (macroexpand-1 (list `->> (with-meta
                                             'quoted-symbol
                                             {:hardy :har :har :-D})))))))
  (testing "a non-trivial form"
    (let [a (with-meta 'a {:foo :bar})
          b (with-meta '(b c d) {:bar :baz})
          e (with-meta 'e {:baz :quux})
          expanded (macroexpand-1 (list `->> a b e))]
      (is (= expanded '(e (b c d a))))
      (is (= {:baz :quux} (meta (first expanded))))
      (is (= {:bar :baz} (meta (second expanded))))
      (is (= {:foo :bar} (meta (last (second expanded))))))))