File tree Expand file tree Collapse file tree 3 files changed +43
-7
lines changed Expand file tree Collapse file tree 3 files changed +43
-7
lines changed Original file line number Diff line number Diff line change 3056
3056
(.push ~dest (unchecked-get (js-arguments ) i#))
3057
3057
(recur (inc i#))))))
3058
3058
3059
+ (core/defn- elide-implicit-macro-args [arglists]
3060
+ (core/map (core/fn [arglist]
3061
+ (if (core/vector? arglist)
3062
+ (core/subvec arglist 2 )
3063
+ (core/drop 2 arglist)))
3064
+ arglists))
3065
+
3059
3066
(core/defn- variadic-fn [name meta [[arglist & body :as method] :as fdecl] emit-var?]
3060
3067
(core/letfn [(dest-args [c]
3061
3068
(map (core/fn [n] `(unchecked-get (js-arguments ) ~n))
3062
3069
(range c)))]
3063
3070
(core/let [rname (symbol (core/str ana/*cljs-ns*) (core/str name))
3064
3071
sig (remove '#{&} arglist)
3065
3072
c-1 (core/dec (count sig))
3073
+ macro? (:macro meta)
3066
3074
meta (assoc meta
3067
3075
:top-fn
3068
3076
{:variadic? true
3069
- :max-fixed-arity c-1
3070
- :method-params [sig]
3071
- :arglists (core/list arglist)
3077
+ :max-fixed-arity ( core/cond-> c-1 macro? ( core/- 2 ))
3078
+ :method-params ( core/cond-> [sig] macro? elide-implicit-macro-args)
3079
+ :arglists (core/cond-> ( core/ list arglist) macro? elide-implicit-macro-args )
3072
3080
:arglists-meta (doall (map meta [arglist]))})]
3073
3081
`(do
3074
3082
(def ~(with-meta name meta)
3117
3125
(concat
3118
3126
(map count sigs)
3119
3127
[(core/- (count (first (filter varsig? arglists))) 2 )]))
3128
+ macro? (:macro meta)
3120
3129
meta (assoc meta
3121
3130
:top-fn
3122
3131
{:variadic? variadic
3123
- :max-fixed-arity maxfa
3124
- :method-params sigs
3125
- :arglists arglists
3132
+ :max-fixed-arity ( core/cond-> maxfa macro? ( core/- 2 ))
3133
+ :method-params ( core/cond-> sigs macro? elide-implicit-macro-args)
3134
+ :arglists ( core/cond-> arglists macro? elide-implicit-macro-args)
3126
3135
:arglists-meta (doall (map meta arglists))})
3127
3136
args-sym (gensym " args" )
3128
3137
param-counts (map count arglists)]
Original file line number Diff line number Diff line change 9
9
(ns cljs.macro-test
10
10
(:refer-clojure :exclude [==])
11
11
(:require [cljs.test :refer-macros [deftest is]])
12
- (:use-macros [cljs.macro-test.macros :only [==]]))
12
+ (:use-macros [cljs.macro-test.macros :only [==]])
13
+ (:require-macros [cljs.macro-test.cljs2852]))
13
14
14
15
(deftest test-macros
15
16
(is (= (== 1 1 ) 2 )))
22
23
23
24
(deftest test-cljs-2283
24
25
(is (= " :a" (first (js-keys (js-obj :a 1 ))))))
26
+
27
+ (deftest test-cljs-2852
28
+ (is (= '([x])) (cljs.macro-test.cljs2852/beta ))
29
+ (is (= '([x] [x y])) (cljs.macro-test.cljs2852/delta ))
30
+ (is (= '([x] [x & xs])) (cljs.macro-test.cljs2852/zeta )))
Original file line number Diff line number Diff line change
1
+ (ns cljs.macro-test.cljs2852 )
2
+
3
+ (defmacro alpha
4
+ ([x]))
5
+
6
+ (defmacro beta []
7
+ `'~(:arglists (meta #'alpha)))
8
+
9
+ (defmacro gamma
10
+ ([x])
11
+ ([x y]))
12
+
13
+ (defmacro delta []
14
+ `'~(:arglists (meta #'gamma)))
15
+
16
+ (defmacro epsilon
17
+ ([x])
18
+ ([x & xs]))
19
+
20
+ (defmacro zeta []
21
+ `'~(:arglists (meta #'epsilon)))
You can’t perform that action at this time.
0 commit comments