Merge pull request #696 from triska/format_distinct_variables

FIXED: format_//2: Keep different variables distinct.
This commit is contained in:
Mark Thom
2020-09-05 08:50:07 -06:00
committed by GitHub

View File

@@ -87,7 +87,8 @@
format_(Fs, Args) --> format_(Fs, Args) -->
{ must_be(list, Fs), { must_be(list, Fs),
must_be(list, Args), must_be(list, Args),
phrase(cells(Fs,Args,0,[]), Cells) }, unique_variable_names(Args, VNs),
phrase(cells(Fs,Args,0,[],VNs), Cells) },
format_cells(Cells). format_cells(Cells).
format_cells([]) --> []. format_cells([]) --> [].
@@ -157,22 +158,22 @@ element_gluevar(glue(_,V), N, N) --> [V].
consume whitespace in the sense of format strings. consume whitespace in the sense of format strings.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
cells([], Args, Tab, Es) --> cells([], Args, Tab, Es, _) -->
( { Args == [] } -> cell(Tab, Tab, Es) ( { Args == [] } -> cell(Tab, Tab, Es)
; { domain_error(empty_list, Args, format_//2) } ; { domain_error(empty_list, Args, format_//2) }
). ).
cells([~,~|Fs], Args, Tab, Es) --> !, cells([~,~|Fs], Args, Tab, Es, VNs) --> !,
cells(Fs, Args, Tab, [chars("~")|Es]). cells(Fs, Args, Tab, [chars("~")|Es], VNs).
cells([~,w|Fs], [Arg|Args], Tab, Es) --> !, cells([~,w|Fs], [Arg|Args], Tab, Es, VNs) --> !,
{ write_term_to_chars(Arg, [], Chars) }, { write_term_to_chars(Arg, [variable_names(VNs)], Chars) },
cells(Fs, Args, Tab, [chars(Chars)|Es]). cells(Fs, Args, Tab, [chars(Chars)|Es], VNs).
cells([~,q|Fs], [Arg|Args], Tab, Es) --> !, cells([~,q|Fs], [Arg|Args], Tab, Es, VNs) --> !,
{ write_term_to_chars(Arg, [quoted(true)], Chars) }, { write_term_to_chars(Arg, [quoted(true),variable_names(VNs)], Chars) },
cells(Fs, Args, Tab, [chars(Chars)|Es]). cells(Fs, Args, Tab, [chars(Chars)|Es], VNs).
cells([~,a|Fs], [Arg|Args], Tab, Es) --> !, cells([~,a|Fs], [Arg|Args], Tab, Es, VNs) --> !,
{ atom_chars(Arg, Chars) }, { atom_chars(Arg, Chars) },
cells(Fs, Args, Tab, [chars(Chars)|Es]). cells(Fs, Args, Tab, [chars(Chars)|Es], VNs).
cells([~|Fs0], Args0, Tab, Es) --> cells([~|Fs0], Args0, Tab, Es, VNs) -->
{ numeric_argument(Fs0, Num, [d|Fs], Args0, [Arg0|Args]) }, { numeric_argument(Fs0, Num, [d|Fs], Args0, [Arg0|Args]) },
!, !,
{ Arg is Arg0, % evaluate compound expression { Arg is Arg0, % evaluate compound expression
@@ -191,8 +192,8 @@ cells([~|Fs0], Args0, Tab, Es) -->
phrase((list(Bs),".",list(Ds)), Cs) phrase((list(Bs),".",list(Ds)), Cs)
) } ) }
), ),
cells(Fs, Args, Tab, [chars(Cs)|Es]). cells(Fs, Args, Tab, [chars(Cs)|Es], VNs).
cells([~|Fs0], Args0, Tab, Es) --> cells([~|Fs0], Args0, Tab, Es, VNs) -->
{ numeric_argument(Fs0, Num, ['D'|Fs], Args0, [Arg|Args]) }, { numeric_argument(Fs0, Num, ['D'|Fs], Args0, [Arg|Args]) },
!, !,
{ number_chars(Num, NCs), { number_chars(Num, NCs),
@@ -203,25 +204,25 @@ cells([~|Fs0], Args0, Tab, Es) -->
phrase(groups_of_three(Bs1), Bs2), phrase(groups_of_three(Bs1), Bs2),
reverse(Bs2, Bs), reverse(Bs2, Bs),
append(Bs, Ds, Cs) }, append(Bs, Ds, Cs) },
cells(Fs, Args, Tab, [chars(Cs)|Es]). cells(Fs, Args, Tab, [chars(Cs)|Es], VNs).
cells([~,i|Fs], [_|Args], Tab, Es) --> !, cells([~,i|Fs], [_|Args], Tab, Es, VNs) --> !,
cells(Fs, Args, Tab, Es). cells(Fs, Args, Tab, Es, VNs).
cells([~,n|Fs], Args, Tab, Es) --> !, cells([~,n|Fs], Args, Tab, Es, VNs) --> !,
cell(Tab, Tab, Es), cell(Tab, Tab, Es),
n_newlines(1), n_newlines(1),
cells(Fs, Args, 0, []). cells(Fs, Args, 0, [], VNs).
cells([~|Fs0], Args0, Tab, Es) --> cells([~|Fs0], Args0, Tab, Es, VNs) -->
{ numeric_argument(Fs0, Num, [n|Fs], Args0, Args) }, { numeric_argument(Fs0, Num, [n|Fs], Args0, Args) },
!, !,
cell(Tab, Tab, Es), cell(Tab, Tab, Es),
n_newlines(Num), n_newlines(Num),
cells(Fs, Args, 0, []). cells(Fs, Args, 0, [], VNs).
cells([~,s|Fs], [Arg|Args], Tab, Es) --> !, cells([~,s|Fs], [Arg|Args], Tab, Es, VNs) --> !,
cells(Fs, Args, Tab, [chars(Arg)|Es]). cells(Fs, Args, Tab, [chars(Arg)|Es], VNs).
cells([~,f|Fs], [Arg|Args], Tab, Es) --> !, cells([~,f|Fs], [Arg|Args], Tab, Es, VNs) --> !,
{ format_number_chars(Arg, Chars) }, { format_number_chars(Arg, Chars) },
cells(Fs, Args, Tab, [chars(Chars)|Es]). cells(Fs, Args, Tab, [chars(Chars)|Es], VNs).
cells([~|Fs0], Args0, Tab, Es) --> cells([~|Fs0], Args0, Tab, Es, VNs) -->
{ numeric_argument(Fs0, Num, [f|Fs], Args0, [Arg|Args]) }, { numeric_argument(Fs0, Num, [f|Fs], Args0, [Arg|Args]) },
!, !,
{ format_number_chars(Arg, Cs0), { format_number_chars(Arg, Cs0),
@@ -248,39 +249,39 @@ cells([~|Fs0], Args0, Tab, Es) -->
), ),
append(Bs, ['.'|Ds], Chars) append(Bs, ['.'|Ds], Chars)
) }, ) },
cells(Fs, Args, Tab, [chars(Chars)|Es]). cells(Fs, Args, Tab, [chars(Chars)|Es], VNs).
cells([~|Fs0], Args0, Tab, Es) --> cells([~|Fs0], Args0, Tab, Es, VNs) -->
{ numeric_argument(Fs0, Num, [r|Fs], Args0, [Arg|Args]) }, { numeric_argument(Fs0, Num, [r|Fs], Args0, [Arg|Args]) },
!, !,
{ integer_to_radix(Arg, Num, lowercase, Cs) }, { integer_to_radix(Arg, Num, lowercase, Cs) },
cells(Fs, Args, Tab, [chars(Cs)|Es]). cells(Fs, Args, Tab, [chars(Cs)|Es], VNs).
cells([~|Fs0], Args0, Tab, Es) --> cells([~|Fs0], Args0, Tab, Es, VNs) -->
{ numeric_argument(Fs0, Num, ['R'|Fs], Args0, [Arg|Args]) }, { numeric_argument(Fs0, Num, ['R'|Fs], Args0, [Arg|Args]) },
!, !,
{ integer_to_radix(Arg, Num, uppercase, Cs) }, { integer_to_radix(Arg, Num, uppercase, Cs) },
cells(Fs, Args, Tab, [chars(Cs)|Es]). cells(Fs, Args, Tab, [chars(Cs)|Es], VNs).
cells([~,'`',Char,t|Fs], Args, Tab, Es) --> !, cells([~,'`',Char,t|Fs], Args, Tab, Es, VNs) --> !,
cells(Fs, Args, Tab, [glue(Char,_)|Es]). cells(Fs, Args, Tab, [glue(Char,_)|Es], VNs).
cells([~,t|Fs], Args, Tab, Es) --> !, cells([~,t|Fs], Args, Tab, Es, VNs) --> !,
cells(Fs, Args, Tab, [glue(' ',_)|Es]). cells(Fs, Args, Tab, [glue(' ',_)|Es], VNs).
cells([~|Fs0], Args0, Tab, Es) --> cells([~|Fs0], Args0, Tab, Es, VNs) -->
{ numeric_argument(Fs0, Num, ['|'|Fs], Args0, Args) }, { numeric_argument(Fs0, Num, ['|'|Fs], Args0, Args) },
!, !,
cell(Tab, Num, Es), cell(Tab, Num, Es),
cells(Fs, Args, Num, []). cells(Fs, Args, Num, [], VNs).
cells([~|Fs0], Args0, Tab0, Es) --> cells([~|Fs0], Args0, Tab0, Es, VNs) -->
{ numeric_argument(Fs0, Num, [+|Fs], Args0, Args) }, { numeric_argument(Fs0, Num, [+|Fs], Args0, Args) },
!, !,
{ Tab is Tab0 + Num }, { Tab is Tab0 + Num },
cell(Tab0, Tab, Es), cell(Tab0, Tab, Es),
cells(Fs, Args, Tab, []). cells(Fs, Args, Tab, [], VNs).
cells([~,C|_], _, _, _) --> cells([~,C|_], _, _, _, _) -->
{ atom_chars(A, [~,C]), { atom_chars(A, [~,C]),
domain_error(format_string, A, format_//2) }. domain_error(format_string, A, format_//2) }.
cells(Fs0, Args, Tab, Es) --> cells(Fs0, Args, Tab, Es, VNs) -->
{ phrase(upto_what(Fs1, ~), Fs0, Fs), { phrase(upto_what(Fs1, ~), Fs0, Fs),
Fs1 = [_|_] }, Fs1 = [_|_] },
cells(Fs, Args, Tab, [chars(Fs1)|Es]). cells(Fs, Args, Tab, [chars(Fs1)|Es], VNs).
format_number_chars(N0, Chars) :- format_number_chars(N0, Chars) :-
N is N0, % evaluate compound expression N is N0, % evaluate compound expression
@@ -390,14 +391,14 @@ format(Stream, Fs, Args) :-
?- phrase(cells("~`at~50|", [], 0, []), Cs), ?- phrase(cells("~`at~50|", [], 0, []), Cs),
phrase(format_cells(Cs), Ls). phrase(format_cells(Cs), Ls).
?- phrase(cells("~ta~t~tb~tc~21|", [], 0, []), Cs). ?- phrase(format:cells("~ta~t~tb~tc~21|", [], 0, [], []), Cs).
Cs = [cell(0,21,[glue(' ',_38),chars([a]),glue(' ',_62),glue(' ',_67),chars([b]),glue(' ',_91),chars([c])])]. Cs = [cell(0,21,[glue(' ',_A),chars("a"),glue(' ',_B),glue(' ',_C),chars("b"),glue(' ',_D),chars("c ...")])]
?- phrase(cells("~ta~t~4|", [], 0, []), Cs). ?- phrase(format:cells("~ta~t~4|", [], 0, [], []), Cs).
Cs = [cell(0,4,[glue(' ',_38),chars([a]),glue(' ',_62)])]. Cs = [cell(0,4,[glue(' ',_A),chars("a"),glue(' ',_B)])]
?- phrase(format_cell(cell(0,1,[glue(a,_94)])), Ls). ?- phrase(format:format_cell(cell(0,1,[glue(a,_94)])), Ls).
?- phrase(format_cell(cell(0,50,[chars("hello")])), Ls). ?- phrase(format:format_cell(cell(0,50,[chars("hello")])), Ls).
?- phrase(format_("~`at~50|~n", []), Ls). ?- phrase(format_("~`at~50|~n", []), Ls).
?- phrase(format_("hello~n~tthere~6|", []), Ls). ?- phrase(format_("hello~n~tthere~6|", []), Ls).
@@ -462,10 +463,13 @@ portray_clause(Stream, Term) :-
format(Stream, "~s", [Ls]). format(Stream, "~s", [Ls]).
portray_clause_(Term) --> portray_clause_(Term) -->
{ term_variables(Term, Vs), { unique_variable_names(Term, VNs) },
foldl(var_name, Vs, VNs, 0, _) },
portray_(Term, VNs), ".\n". portray_(Term, VNs), ".\n".
unique_variable_names(Term, VNs) :-
term_variables(Term, Vs),
foldl(var_name, Vs, VNs, 0, _).
var_name(V, Name=V, Num0, Num) :- var_name(V, Name=V, Num0, Num) :-
charsio:fabricate_var_name(numbervars, Name, Num0), charsio:fabricate_var_name(numbervars, Name, Num0),
Num is Num0 + 1. Num is Num0 + 1.