cl: multiple values — 15 new tests (174 eval, 346 total green)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 46s

VALUES wraps 2+ values in {:cl-type "mv"}; cl-mv-primary strips to
primary in IF/AND/OR/COND/cl-call-fn single-value contexts; cl-mv-vals
expands for MULTIPLE-VALUE-BIND, MULTIPLE-VALUE-CALL, NTH-VALUE.
This commit is contained in:
2026-05-05 11:23:12 +00:00
parent 733b1ebefa
commit 4cd8773766
3 changed files with 108 additions and 7 deletions

View File

@@ -388,3 +388,51 @@
(cl-test "unwind-protect: nested, inner cleanup first"
(ev "(let ((n 0)) (unwind-protect (unwind-protect 1 (setq n (+ n 10))) (setq n (+ n 1))) n)")
11)
;; ── VALUES / MULTIPLE-VALUE-BIND / NTH-VALUE ────────────────────
(cl-test "values: single returns plain"
(ev "(values 42)")
42)
(cl-test "values: zero returns nil"
(ev "(values)")
nil)
(cl-test "values: multi — primary via funcall"
(ev "(car (list (values 1 2)))")
1)
(cl-test "multiple-value-bind: basic"
(ev "(multiple-value-bind (a b) (values 1 2) (+ a b))")
3)
(cl-test "multiple-value-bind: extra vars get nil"
(ev "(multiple-value-bind (a b c) (values 10 20) (list a b c))")
(list 10 20 nil))
(cl-test "multiple-value-bind: extra values ignored"
(ev "(multiple-value-bind (a) (values 1 2 3) a)")
1)
(cl-test "multiple-value-bind: single value source"
(ev "(multiple-value-bind (a b) 42 (list a b))")
(list 42 nil))
(cl-test "nth-value: 0"
(ev "(nth-value 0 (values 10 20 30))")
10)
(cl-test "nth-value: 1"
(ev "(nth-value 1 (values 10 20 30))")
20)
(cl-test "nth-value: out of range"
(ev "(nth-value 5 (values 10 20))")
nil)
(cl-test "multiple-value-call: basic"
(ev "(multiple-value-call #'+ (values 1 2) (values 3 4))")
10)
(cl-test "multiple-value-prog1: returns first"
(ev "(multiple-value-prog1 1 2 3)")
1)
(cl-test "multiple-value-prog1: side effects run"
(ev "(let ((x 0)) (multiple-value-prog1 99 (setq x 7)) x)")
7)
(cl-test "values: nil primary in if"
(ev "(if (values nil t) 'yes 'no)")
"NO")
(cl-test "values: truthy primary in if"
(ev "(if (values 42 nil) 'yes 'no)")
"YES")