The TermClass specifies to which terms the transformation will be applied:
trans_function(OldTerm, NewTerm [, Module]) :- ... .
At transformation time, the system will call TransPred in the module
where local macro/3 was invoked. The term to transform is passed
as the first argument, the second is a free variable which the
transformation should bind to the transformed term, and the optional
third argument is the module where the term was being read in.
Options is a list which may be empty or contain one of the following type specification atoms:
In rare cases it is necessary to suppress macro expansion explicitly. The functor no_macro_expansion/1 can be wrapped around specific instances of a term to prevent it from being transformed. Macro expansion will then remove this wrapper so that the end result is the untransformed term alone.
% The following example illustrates how a/1 may be
% transformed into b/2 using the reader:
[eclipse]: [user].
trans_a(a(X),b(X,10)).
:- local macro(a/1,trans_a/2,[]).
yes.
[eclipse]: read(X).
a(fred).
X = b(fred, 10)
yes.
% Example showing use of protect_arg:
[eclipse]: [user].
trb(X, newfunctor(Arg)) :- arg(1, X, Arg).
trd(d, newd).
:- local macro(b/1, trb/2, []),
macro(b_protect/1, trb/2, [protect_arg]),
macro(d/0, trd/2, []).
yes.
[eclipse]: read(X1),read(X2).
b(d).
b_protect(d).
X1 = newfunctor(newd) % d is transformed
X2 = newfunctor(d) % d is not transformed
yes.
% Example showing use of type macros
[eclipse 1]: [user].
tr_int(0, 0).
tr_int(N, s(S)) :- N > 0, N1 is N-1, tr_int(N1, S).
:- local macro(type(integer), tr_int/2, []).
yes.
[eclipse 2]: read(X).
3.
X = s(s(s(0)))
yes.
%
% Example showing use of write macros
%
[eclipse 1]: [user].
tr_s(0, 0).
tr_s(s(S), N) :- tr_s(S, N1), N is N1+1.
:- local macro(s/1, tr_s/2, [write]).
yes.
[eclipse 2]: write(s(s(s(0)))).
3
yes.
Error:
local macro(X, trx/2, []). (Error 4).
local macro(a/1, tra/2, [c]). (Error 6).