Normally, macro expansion is performed implicitly by the parser, i.e. when using either the compiler or term-input builtins like read/1,2, read_term/2,3 or readvar/2,3.
For certain meta-programming applications, where one needs to work with the original unexpanded form of the input, this is undesirable. In such cases, macro-expansion can be switched off during reading and later performed explicitly using expand_macros/2.
For reading input without macro expansion, set the stream-flag macro_expansion to off before reading (see set_stream_property/3 or open/4), or use the facilities of the library(source_processor).
    % Given the program:
        t(water, wine).
        :- local macro(water, t/2, []).
    % Implicit macro expansion by read/1:
    ?- open(string("water"),read,S),
        read(S,X),
        close(S).
    X = wine
    yes.
    % Implicit macro expansion switched off:
    ?- open(string("water"),read,S,[macro_expansion(off)]),
        read(S,X),
        close(S).
    X = water
    yes.
    % Explicit macro expansion:
    ?- open(string("water"),read,S,[macro_expansion(off)]),
        read(S,X),
        expand_macros(X,Y),
        close(S).
    X = water
    Y = wine
    yes.
    % All occurrences are expanded:
    ?- open(string("[water,beer,fizzy(water)]"),read,S,[macro_expansion(off)]),
        read(S,X),
        expand_macros(X,Y),
        close(S).
    X = [water, beer, fizzy(water)]
    Y = [wine, beer, fizzy(wine)]
    yes.