shithub: sl

Download patch

ref: d2507e31bade33aadd39368719e8f6a934d76193
parent: 0178b9b6444db31ec88591757ba51c983f37b10b
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Wed Apr 16 01:08:55 EDT 2025

compiler: validate var-supplied

--- a/boot/sl.boot
+++ b/boot/sl.boot
@@ -313,9 +313,9 @@
                                                                        #fn(str-length)) keyword->sym)
             keyword-arg? #fn("n10B;3904200<61:" #(#fn(keyword?)) keyword-arg?) lambda-vars
             #fn("n1Ib520852185>1_51485<00qq54422237405162:" #(#0#
-                                                              #fn("n40S;J5040R340D:0B3Z00<R3T082;J504833<0702112263:A<0=1828364:0B3\x9a00<B3\x940730<r252;J;04730<r3523?074051R360q@=070250<2615442774051513=0A<0=182D64:833<0702112863:A<0=1D8364:0B3>070290<26164:01C:07021162:7029026164:" #(error
-  "compile error: invalid argument list " ": optional arguments must come after required" length=
-  caar "compile error: invalid optional argument " " in list " #fn(keyword?)
+                                                              #fn("n40S;J5040R340D:0B3Z00<R3T082;J504833<0702112263:A<0=1828364:0B3\xa500<B3\x9f073051R3Y0740<r252;JF04740<r352;390475051R360q@=070260<2715442873051513=0A<0=182D64:833<0702112963:A<0=1D8364:0B3>0702:0<27164:01C:07021162:702:027164:" #(error
+  "compile error: invalid argument list " ": optional arguments must come after required" caar
+  length= caddar "compile error: invalid optional argument " " in list " #fn(keyword?)
   ": keyword arguments must come last." "compile error: invalid formal argument ") check-formals)
                                                               #fn(map)
                                                               #fn("n10B390700<61:0:" #(keyword->sym))
--- a/src/compiler.sl
+++ b/src/compiler.sl
@@ -542,9 +542,10 @@
                       o ": optional arguments must come after required")
                (check-formals (cdr l) o opt kw)))
           ((and (cons? l) (cons? (car l)))
-           (unless (and (or (length= (car l) 2)  ; default value
-                            (length= (car l) 3)) ; default value and "was set" var
-                        (sym? (caar l)))
+           (unless (and (sym? (caar l))
+                        (or (length= (car l) 2) ; default value
+                            (and (length= (car l) 3) ; default value and "var-supplied"
+                                 (sym? (caddar l)))))
                    (error "compile error: invalid optional argument " (car l)
                           " in list " o))
            (if (keyword? (caar l))
--- a/test/unittest.sl
+++ b/test/unittest.sl
@@ -772,3 +772,6 @@
   `(let ((a# 2)) (list a# ,x)))
 
 (assert (equal? '(1 (2 3)) (f (g 3))))
+
+; a-supplied is nil
+(assert-fail (eval '(def (f (a 0 nil)) nil)))
--