shithub: sl

Download patch

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