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)))
--
⑨