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