This fixes #2725, by making it so that `strip_module(Pred, M, P), call(M:P)` doesn't throw an `instanciation_error` when `Pred` isn't in the form `module:predicate`. Now, `strip_module(hello, M, P)` will call `load_context(M)`, which unifies `M` with the topmost module (or `user`). Two new test cases are added: issue2725.pl, which tests the minimal case id(X) --> X. and the strip_module(P, M, _), call(M:P) scenario, and module_resolution, which tests the behavior of strip_module in a few scenarios.
36 lines
963 B
Prolog
36 lines
963 B
Prolog
:- module(issue2725, []).
|
|
:- use_module(library(dcgs)).
|
|
|
|
% Tests that the id/3 dcg can be called.
|
|
% library(dcgs) currently expands it to id(X, Y, Z) :- phrase(X, Y, Z).
|
|
id(X) --> X.
|
|
call_id :-
|
|
id("Hello", X, []),
|
|
X = "Hello".
|
|
:- initialization(call_id).
|
|
|
|
test_default_strip_module :-
|
|
strip_module(hello, M, P),
|
|
nonvar(M),
|
|
M = issue2725,
|
|
nonvar(P),
|
|
P = hello,
|
|
strip_module(hello, issue2725, _),
|
|
strip_module(hello, M, P).
|
|
:- initialization(test_default_strip_module).
|
|
|
|
% Tests that strip_module followed by call works with or without the module: prefix.
|
|
strip_module_call(Pred) :-
|
|
loader:strip_module(Pred, M, Pred0),
|
|
call(M:Pred0).
|
|
|
|
my_true.
|
|
|
|
test_strip_module_call :-
|
|
strip_module_call(my_true),
|
|
strip_module_call(issue2725:my_true).
|
|
:- initialization(test_strip_module_call).
|
|
|
|
% :- initialization(loader:prolog_load_context(module, M), write(M), write('\n')).
|
|
% :- initialization(loader:load_context(user)).
|