34
35:- module(codegen,
36 [ add_suffix/3,
37 is_newer/2,
38 line_atom/2,
39 save_to_file/2,
40 term_to_file/2,
41 with_output_to_file/2
42 ]). 43
44:- use_module(library(apply)). 45:- use_module(library(listing)). 46
47is_newer(File1, File2) :-
48 exists_file(File1),
49 exists_file(File2),
50 time_file(File1, Time1),
51 time_file(File2, Time2),
52 Time1 > Time2.
53
54add_suffix(Suffix, Name1, Name) :-
55 file_name_extension(Name2, _, Name1),
56 atom_concat(Name2, Suffix, Name).
57
58:- meta_predicate with_output_to_file(+,0 ). 59
60with_output_to_file(File, Goal) :-
61 setup_call_cleanup(tell(File), Goal, told).
62
63:- meta_predicate save_to_file(+,2). 64
65save_to_file(File, Goal) :-
66 call(Goal, Lines, []),
67 with_output_to_file(File, write_lines(Lines)).
68
69:- meta_predicate term_to_file(+,2). 70
71term_to_file(File, Goal) :-
72 call(Goal, Terms, []),
73 with_output_to_file(File, maplist(portray_clause, Terms)).
74
75write_lines([]) :- !.
76write_lines([E|L]) :- !,
77 write_lines(E),
78 write_lines(L).
79write_lines(Line) :-
80 write_line(Line).
81
82write_line(Line) :-
83 ( nonvar(Line),
84 do_write_line_2(Line)
85 ->true
86 ; writeln(Line)
87 ).
88
89write_line_1(Line) :-
90 ( nonvar(Line),
91 do_write_line_1(Line)
92 ->true
93 ; write(Line)
94 ).
95
96do_write_line_1(F-A) :-
97 format(F, A).
98do_write_line_1(A+B) :-
99 write_line_1(A),
100 write_line_1(B).
101do_write_line_1(A/S) :-
102 maplist(line_atom, [S|A], [C|L]),
103 atomic_list_concat(L, C, V),
104 write(V).
105
106line_atom(Line, Atom) :- with_output_to(atom(Atom), write_line_1(Line)).
107
108do_write_line_2((:- A)) :- portray_clause((:- A)).
109do_write_line_2((A :- B)) :- portray_clause((A :- B)).
110do_write_line_2((A --> B)) :- portray_clause((A --> B)).
111do_write_line_2(Line) :- write_line_1(Line), nl