Skip to content

Commit 3ac045b

Browse files
authored
Shorter varargs (#694)
1 parent 8dab103 commit 3ac045b

File tree

2 files changed

+50
-67
lines changed

2 files changed

+50
-67
lines changed

src/squint/compiler_common.cljc

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252

5353
(defn emit-return [s env]
5454
(if (= :return (:context env))
55-
(format "return %s;"
55+
(format "return %s"
5656
s)
5757
s))
5858

@@ -380,7 +380,7 @@
380380
ctx)]
381381
(cond-> (emit l (assoc env :context
382382
ctx))
383-
(= :return ctx) (str ";"))))
383+
(= :return ctx) (statement))))
384384
iife?
385385
(wrap-implicit-iife env))]
386386
s))
@@ -444,30 +444,31 @@
444444
(let [gensym (:gensym env)
445445
expr? (= :expr (:context env))
446446
gs (gensym "caseval__")
447-
eenv (expr-env env)]
448-
(cond-> (str
449-
(when expr?
450-
(str "var " gs ";\n"))
451-
"switch (" (emit v eenv) ") {"
452-
(str/join (map (fn [test then]
453-
(str/join
454-
(map (fn [test]
455-
(str "case " (emit test eenv) ":\n"
456-
(if expr?
457-
(str gs " = " then)
458-
(emit then env))
459-
"\nbreak;\n"))
460-
test)))
461-
tests thens))
462-
(when default
463-
(str "default:\n"
464-
(if expr?
465-
(str gs " = " (emit default eenv))
466-
(emit default env))))
467-
(when expr?
468-
(str "return " gs ";"))
469-
"}")
470-
expr? (wrap-implicit-iife env))))
447+
eenv (expr-env env)
448+
ret (cond-> (str
449+
(when expr?
450+
(str "var " gs ";\n"))
451+
"switch (" (emit v eenv) ") {"
452+
(str/join (map (fn [test then]
453+
(str/join
454+
(map (fn [test]
455+
(str "case " (emit test eenv) ":\n"
456+
(if expr?
457+
(str gs " = " then)
458+
(statement (emit then env)))
459+
"\nbreak;\n"))
460+
test)))
461+
tests thens))
462+
(when default
463+
(str "default:\n"
464+
(if expr?
465+
(str gs " = " (emit default eenv))
466+
(emit default env))))
467+
(when expr?
468+
(str "return " gs ";"))
469+
"}")
470+
expr? (wrap-implicit-iife env))]
471+
ret))
471472

472473
(defmethod emit-special 'recur [_ env [_ & exprs]]
473474
(let [gensym (:gensym env)

src/squint/internal/fn.cljc

Lines changed: 23 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
(param-bind [param]
7272
`[~param (^:ana/no-resolve first ~restarg)
7373
~restarg (^:ana/no-resolve next ~restarg)])
74-
(apply-to []
74+
(_apply-to []
7575
(if (< 1 (count sig))
7676
(let [params (repeatedly (dec (count sig)) gensym)]
7777
(with-meta
@@ -100,22 +100,22 @@
100100
~(dec (count sig)))])
101101
#_(js-inline-comment " @this {Function} ")
102102
;; dissoc :top-fn so this helper gets ignored in cljs.analyzer/parse 'set!
103-
(set! (. ~(vary-meta sym dissoc :top-fn) ~'-cljs$lang$applyTo)
103+
#_(set! (. ~(vary-meta sym dissoc :top-fn) ~'-cljs$lang$applyTo)
104104
~(apply-to)))))))
105105

106-
(defn- multi-arity-fn [name meta fdecl emit-var?]
106+
(defn- multi-arity-fn [name meta fdecl _emit-var?]
107107
(let [name (munge (or name (gensym "f")))]
108-
(letfn [(dest-args [c]
109-
(map (fn [n] (core-unchecked-get (core-js-arguments) n))
108+
(letfn [(dest-args [args-sym c]
109+
(map (fn [n] `(aget ~args-sym ~n))
110110
(range c)))
111-
(fixed-arity [rname sig]
111+
(fixed-arity [rname args-sym sig]
112112
(let [c (count sig)]
113113
[c `(. ;; prevent resolving rname, for REPL mode
114114
~(list 'js* (str rname))
115115
(~(symbol
116116
(str "cljs$core$IFn$_invoke$arity$" c))
117-
~@(dest-args c)))]))
118-
(fn-method [name [sig & body :as method]]
117+
~@(dest-args args-sym c)))]))
118+
(fn-method [name [sig & _body :as method]]
119119
(if
120120
(some '#{&} sig)
121121
(variadic-fn* name method false)
@@ -137,18 +137,11 @@
137137
varsig? #(boolean (some '#{&} %))
138138
{sigs false var-sigs true} (group-by varsig? arglists)
139139
variadic? (pos? (count var-sigs))
140-
variadic-params (if variadic?
141-
(cond-> (remove '#{&} (first var-sigs))
142-
true count
143-
macro? (- 2))
144-
0)
145140
maxfa (apply max
146141
(concat
147142
(map count sigs)
148143
[(- (count (first var-sigs)) 2)]))
149144
mfa (cond-> maxfa macro? (- 2))
150-
;; problematic
151-
;; _ (prn (doall (map meta arglists)))
152145
meta (assoc meta
153146
:top-fn
154147
{:variadic? variadic?
@@ -158,38 +151,27 @@
158151
:arglists (cond-> arglists #_#_macro? elide-implicit-macro-args)
159152
:arglists-meta (doall (map clojure.core/meta arglists))}
160153
:squint.compiler/no-rename true)
161-
args-sym (gensym "args")
162-
param-counts (map count arglists)
163154
name (with-meta name meta)
164-
args-arr (gensym "args-arr")]
165-
#_(when (< 1 (count var-sigs))
166-
(ana/warning :multiple-variadic-overloads {} {:name name}))
167-
#_(when (and (pos? variadic-params)
168-
(not (== variadic-params (+ 1 mfa))))
169-
(ana/warning :variadic-max-arity {} {:name name}))
170-
#_(when (not= (distinct param-counts) param-counts)
171-
(ana/warning :overload-arity {} {:name name}))
155+
args-sym (gensym "args")]
172156
`(let [~name
173-
(fn [~'var_args]
174-
(case (.-length ~(core-js-arguments))
175-
~@(mapcat #(fixed-arity rname %) sigs)
157+
(fn [~(symbol (str "..." args-sym))]
158+
(case (.-length ~args-sym)
159+
~@(mapcat #(fixed-arity rname args-sym %) sigs)
176160
~(if variadic?
177-
`(let [~args-arr [] #_(array)]
178-
~(core-copy-arguments args-arr)
179-
(let [argseq# (when (< ~maxfa (.-length ~args-arr))
180-
(.slice ~args-arr ~maxfa) #_(new #_:ana/no-resolve cljs.core/IndexedSeq
181-
0 nil))]
182-
(.
183-
;; prevent resolving rname, for REPL mode
184-
~(list 'js* (str rname))
185-
(~'cljs$core$IFn$_invoke$arity$variadic
186-
~@(dest-args maxfa)
187-
argseq#))))
161+
`(let [argseq# (when (< ~maxfa (.-length ~args-sym))
162+
(.slice ~args-sym ~maxfa) #_(new #_:ana/no-resolve cljs.core/IndexedSeq
163+
0 nil))]
164+
(.
165+
;; prevent resolving rname, for REPL mode
166+
~(list 'js* (str rname))
167+
(~'cljs$core$IFn$_invoke$arity$variadic
168+
~@(dest-args args-sym maxfa)
169+
argseq#)))
188170
(if (:macro meta)
189171
`(throw (js/Error.
190-
(str "Invalid arity: " (- (alength ~(core-js-arguments)) 2))))
172+
(str "Invalid arity: " (- (.-length ~args-sym) 2))))
191173
`(throw (js/Error.
192-
(str "Invalid arity: " (alength ~(core-js-arguments)))))))))]
174+
(str "Invalid arity: " (.-length ~args-sym))))))))]
193175
~@(map #(fn-method name %) fdecl)
194176
;; optimization properties
195177
(set! (. (cljs.core/js* ~name) ~'-cljs$lang$maxFixedArity) ~maxfa)

0 commit comments

Comments
 (0)