erlang: list comprehensions (+12 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled

This commit is contained in:
2026-04-25 06:19:14 +00:00
parent 8e809614ba
commit 193b0c04be
6 changed files with 172 additions and 10 deletions

View File

@@ -902,6 +902,41 @@
(nm (if (er-atom? reason) reason (nth (get reason :elements) 0)))))
"badarg")
;; ── list comprehensions ───────────────────────────────────────
(er-eval-test "lc map double"
(ev "hd([X * 2 || X <- [1, 2, 3]])") 2)
(er-eval-test "lc map sum"
(ev "lists:foldl(fun (X, Acc) -> X + Acc end, 0, [X * 2 || X <- [1, 2, 3]])")
12)
(er-eval-test "lc length"
(ev "length([X || X <- [1, 2, 3, 4, 5]])") 5)
(er-eval-test "lc filter sum"
(ev "lists:foldl(fun (X, Acc) -> X + Acc end, 0, [X || X <- [1, 2, 3, 4, 5], X rem 2 =:= 0])")
6)
(er-eval-test "lc filter only"
(ev "length([X || X <- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], X > 5])")
5)
(er-eval-test "lc empty source"
(get (ev "[X || X <- []]") :tag) "nil")
(er-eval-test "lc all filtered"
(get (ev "[X || X <- [1, 2, 3], X > 100]") :tag) "nil")
(er-eval-test "lc cartesian length"
(ev "length([{X, Y} || X <- [1, 2, 3], Y <- [a, b]])")
6)
(er-eval-test "lc pattern match"
(ev "lists:foldl(fun (X, Acc) -> X + Acc end, 0, [V || {ok, V} <- [{ok, 1}, {error, x}, {ok, 2}, {ok, 3}]])")
6)
(er-eval-test "lc nested generators"
(ev "length([{X, Y} || X <- [1, 2, 3], Y <- [10, 20, 30], X + Y > 12])")
7)
(er-eval-test "lc squares"
(ev "lists:foldl(fun (X, Acc) -> X + Acc end, 0, [X*X || X <- [1, 2, 3, 4, 5]])")
55)
;; First {ok, X} tuple: head of [{ok,a}, {ok,b}] is {ok, a}.
(er-eval-test "lc tuple capture"
(nm (nth (get (get (ev "[{ok, X} || X <- [a, b]]") :head) :elements) 0))
"ok")
(define
er-eval-test-summary
(str "eval " er-eval-test-pass "/" er-eval-test-count))