ref: 81e3856ec51e1a24c73377eb3e090dda90a5c395
parent: 29420860912ae02b1bf14f2d4ab098dc83b7519a
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Mon Apr 14 21:07:36 EDT 2025
compiler: check *all* args for duplicates, not just keyword ones
--- a/boot/sl.boot
+++ b/boot/sl.boot
@@ -188,9 +188,9 @@
vec loadv #() apply tapply aref aref2) compile-builtin-call)
compile-f #fn("n2702101>22262:" #(call-with-values #fn("n070AF62:" #(compile-f-))
#fn("n20:")) compile-f)
- compile-f- #fn("n2Ib620862186>1_51472501T731T517415175761T52731518<J7027@408<88H360E@802888518>288;51~75798;5286<8@518A3=07:2;8A52@30q48;3\xa208@JL07<872=8?893808>U@408>54@r07>877?2@7A2@7B8@527C288@515153515247<872D8?288@51893808>U@408>5547E8708;8:8?55@30q42F8>L23I07<87893702G@402H8>53@W0893?07<872I8>53@E08;J?07<872J8>53@30q47K08:7L7M1518:52537N878B<52487r4288:51r4Mp47O878BD7M1515447<872P5247Q2R7S87EG517T87518=5387r3G62:" #(#1=#fn("z0I:" #() void)
- #fn("n1700510=863J0712285>18652;J904A<8661:q:" #(caar any #fn("n1A0<Q;3404A:")) any-duplicate-kw)
- make-code-emitter lastcdr lambda:vars filter cons? λ #fn(length) keyword-arg? error "compile error: duplicate keyword "
+ compile-f- #fn("n2Ib620862186>1_51472501T731T517415175761T52731518<J7027@408<88H360E@802888518>288;51~75798;5286<8:518A3=07:2;8A52@30q48;3\xa208@JL07<872=8?893808>U@408>54@r07>877?2@7A2@7B8@527C288@515153515247<872D8?288@51893808>U@408>5547E8708;8:8?55@30q42F8>L23I07<87893702G@402H8>53@W0893?07<872I8>53@E08;J?07<872J8>53@30q47K08:7L7M1518:52537N878B<52487r4288:51r4Mp47O878BD7M1515447<872P5247Q2R7S87EG517T87518=5387r3G62:" #(#1=#fn("z0I:" #() void)
+ #fn("n10<0=863J0702185>18652;J904A<8661:q:" #(any #fn("n1A0Q;3404A:")) any-duplicates)
+ make-code-emitter lastcdr lambda:vars filter cons? λ #fn(length) keyword-arg? error "compile error: duplicate argument: "
emit optargs bcode:indexfor make-perfect-hash-table #fn(map) cons car iota keyargs
emit-optional-arg-inits 255 vargc.l argc.l vargc argc extend-env complex-bindings lambda:body
box-vars compile-in ret values #fn(fn) encode-byte-code const-to-idx-vec) compile-f-)
--- a/src/compiler.sl
+++ b/src/compiler.sl
@@ -694,12 +694,12 @@
ff))
(def (compile-f- env f)
- (def (any-duplicate-kw kw)
- (let ((k (caar kw))
- (rest (cdr kw)))
+ (def (any-duplicates v)
+ (let ((k (car v))
+ (rest (cdr v)))
(when rest
- (or (any (λ (next) (and (eq? k (car next)) k)) rest)
- (any-duplicate-kw rest)))))
+ (or (any (λ (next) (and (eq? k next) k)) rest)
+ (any-duplicates rest)))))
;; compile lambda expression, assuming defines already lowered
(let ((g (make-code-emitter))
@@ -712,10 +712,10 @@
(nargs (if (atom? args) 0 (length args)))
(nreq (- nargs (length opta)))
(kwa (filter keyword-arg? opta))
- (dupkw (any-duplicate-kw kwa)))
+ (dupv (any-duplicates vars)))
- (when dupkw
- (error "compile error: duplicate keyword " dupkw))
+ (when dupv
+ (error "compile error: duplicate argument: " dupv))
;; emit argument checking prologue
(when opta