Covers: dict destructuring, nested let-match, missing keys → nil, multi-expression body, compiled function path (bytecode desugaring), computed expressions, nested destructuring. 2709/2709 tests pass. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
48 lines
1.5 KiB
Plaintext
48 lines
1.5 KiB
Plaintext
;; Tests for let-match — CEK special form and bytecode compiler desugaring
|
|
;; let-match destructures a dict: (let-match {:key var} expr body...)
|
|
|
|
(deftest "let-match destructures dict"
|
|
(let-match {:name n :age a} (dict :name "alice" :age 30)
|
|
(assert= n "alice")
|
|
(assert= a 30)))
|
|
|
|
(deftest "let-match inside let"
|
|
(let ((data (dict :status "ok" :value 42)))
|
|
(let-match {:status s :value v} data
|
|
(assert= s "ok")
|
|
(assert= v 42))))
|
|
|
|
(deftest "let-match missing key gives nil"
|
|
(let-match {:present p :missing m} (dict :present "yes")
|
|
(assert= p "yes")
|
|
(assert= m nil)))
|
|
|
|
(deftest "let-match body evaluates all expressions"
|
|
(let ((result nil))
|
|
(let-match {:a a} (dict :a 1)
|
|
(set! result a)
|
|
(assert= result 1))))
|
|
|
|
;; In function body — tests bytecode compiler desugaring path
|
|
(define lm-add (fn (d) (let-match {:x x :y y} d (+ x y))))
|
|
|
|
(deftest "let-match in compiled function"
|
|
(assert= (lm-add (dict :x 3 :y 7)) 10))
|
|
|
|
(define lm-format (fn (input) (let-match {:type t :value v} input (str t ":" v))))
|
|
|
|
(deftest "let-match variant 2 in compiled function"
|
|
(assert= (lm-format (dict :type "num" :value 5)) "num:5"))
|
|
|
|
;; Nested let-match
|
|
(deftest "nested let-match"
|
|
(let-match {:outer o} (dict :outer (dict :inner 99))
|
|
(let-match {:inner i} o
|
|
(assert= i 99))))
|
|
|
|
;; let-match with computed expression
|
|
(deftest "let-match with function call as expr"
|
|
(let-match {:a a :b b} (dict :a (+ 1 2) :b (* 3 4))
|
|
(assert= a 3)
|
|
(assert= b 12)))
|