erlang: -module/M:F cross-module calls (+10 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled

This commit is contained in:
2026-04-25 04:01:14 +00:00
parent 882205aa70
commit 424b5ca472
6 changed files with 152 additions and 7 deletions

View File

@@ -634,6 +634,71 @@
(nm (ev "try exit(a) catch error:X -> e; throw:X -> t; exit:X -> x end"))
"x")
;; ── modules: -module(M)., M:F/N cross-module calls ─────────────
(er-eval-test "load module returns name"
(nm (erlang-load-module "-module(m1). foo() -> 42."))
"m1")
(er-eval-test "cross-module zero-arity"
(do
(erlang-load-module "-module(m2). val() -> 7.")
(ev "m2:val()"))
7)
(er-eval-test "cross-module n-ary"
(do
(erlang-load-module "-module(m3). add(X, Y) -> X + Y.")
(ev "m3:add(3, 4)"))
7)
(er-eval-test "module recursive fn"
(do
(erlang-load-module "-module(m4). fact(0) -> 1; fact(N) -> N * fact(N-1).")
(ev "m4:fact(6)"))
720)
(er-eval-test "module sibling calls"
(do
(erlang-load-module "-module(m5). a(X) -> b(X) + 1. b(X) -> X * 10.")
(ev "m5:a(5)"))
51)
(er-eval-test "module multi-arity"
(do
(erlang-load-module
"-module(m6). f(X) -> X. f(X, Y) -> X + Y. f(X, Y, Z) -> X * Y + Z.")
(ev "{m6:f(1), m6:f(2, 3), m6:f(2, 3, 4)}"))
(er-mk-tuple (list 1 5 10)))
(er-eval-test "module pattern match clauses"
(do
(erlang-load-module
"-module(m7). check(0) -> zero; check(N) when N > 0 -> pos; check(_) -> neg.")
(nm (ev "m7:check(-3)")))
"neg")
(er-eval-test "cross-module call within module"
(do
(erlang-load-module "-module(util1). dbl(X) -> X * 2.")
(erlang-load-module "-module(util2). quad(X) -> util1:dbl(X) * 2.")
(ev "util2:quad(5)"))
20)
(er-eval-test "module undefined fn raises"
(do
(erlang-load-module "-module(m8). foo() -> 1.")
(er-io-flush!)
(ev "P = spawn(fun () -> m8:bar() end), receive after 0 -> ok end")
(let ((reason (er-proc-field (er-mk-pid 1) :exit-reason)))
(and (er-tuple? reason) (nm (nth (get reason :elements) 0)))))
"undef")
(er-eval-test "module function used in spawn"
(do
(erlang-load-module "-module(m9). work(P) -> P ! done.")
(ev "Me = self(), spawn(fun () -> m9:work(Me) end), receive done -> ok end"))
(er-mk-atom "ok"))
(define
er-eval-test-summary
(str "eval " er-eval-test-pass "/" er-eval-test-count))