
%% Predicates in this file allow for:
%% 
%% (A) selective recompilation/reconsulting  of program source
%% files (i.e. those named in the file_group of the `load' file),
%% 
%% and  
%% 
%% (B) selective recompilation of user defined segment macros, 
%% two level rules and lexicon of morphemes, into the form in which
%% they are used by the program. (Predicates actually performing the 
%% individual compilations given elsewhere.)  

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% reload/0 :
% main reloading predicate.
% Prints numbered list of file names. User enters
% command "compile" or "reconsult", plus numbers of 
% selected files. Special selection option "0" for  
% reloading all files. If no command given, default
% mode for reloading is compile. 

reload:- 
   nl, write('Options: compile / reconsult'), nl, nl,  
   write('File selections: '), nl, 
   file_group(Files),                  % Stored list of program files
   write('      0. ALL FILES'), nl, 
   print_files(Files,1),               % Print numbered list of files
   nl, write('Enter command [default = compile]'), 
   write(' + selection numbers'), 
   get_command(reload,Command),        % Read input, identify command.
   reload(Command).                    % Reload selected files, 
                                       % according to command. 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% reload/1: 
% Check inputted command, before proceeding.

reload([]):- nl, write('No files loaded.'), nl.

reload([number|DSs]):- !,     % if only numbers given (i.e. `number'
   reload([compile|DSs]).     % case) default mode is compile

reload([Command,[0]]):-          % Special `load all files' case. 
   file_group(AllFiles),                 % Stored list of program files
   max_atom_length(AllFiles,MaxLen),     % - for formatting purposes
   load_files(Command,AllFiles,AllFiles,MaxLen).  % Do it. 

reload([Command|DSs]):-   
   digit_strings_to_numbers(DSs,Ns),    % Convert to selection numbers
   file_group(AllFiles),                % Stored list of program files
   length(AllFiles,Len),                
   ((member(N,Ns), 
     \+((1 =< N, N =< Len)))            % Check for any numbers out of range
         -> (nl, write(' *** erroneous input: number out of range *** '), 
             nl, write('No files loaded.'),
	     nl, fail)
	   ; true), 
   set_of(F,N^(member(N,Ns), nth(N,F,AllFiles)), Selected), 
                                      % Pick out the selected files.
   max_atom_length(Selected,MaxLen),  % - for formatting purposes
   load_files(Command,Selected,AllFiles,MaxLen). 
                                      % Load selected files in order.

reload(_):- 
   nl,                     % Catch all, for unrecognised command
   write(' *** erroneous input *** '), nl, 
   write('No files loaded.'), nl.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Load files in list "Selected" according to "Command" 
% (recurses down list "Files" - initially  full file group,  
% rather than Selected, to ensure files loaded in correct order). 

load_files(_Command,_Selected,[],_MaxLen).             % finished
load_files(Command,Selected,[File|Files],MaxLen):-  
   member(File,Selected),                          % file selected,
   load_file(Command,File,MaxLen),                 % so load it!
   load_files(Command,Selected,Files,MaxLen).
load_files(Command,Selected,[File|Files],MaxLen):-  
   \+ member(File,Selected),                      % file not selected,
   load_files(Command,Selected,Files,MaxLen).     % ignore it. 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% compile or reconsult single file "File". 

% Compile case

load_file(compile,File,MaxLen):-        
   name(File,Name),
   length(Name,Len), 
   Spaces is MaxLen - Len,             % - for formatting
   nl, write('      compiling: '), write(File),
   compile(File), 
   spaces(Spaces), write(' - compiled.').    

% Reconsult case

load_file(reconsult,File,MaxLen):-    
   name(File,Name),
   length(Name,Len), 
   Spaces is MaxLen - Len, 
   nl, write('   reconsulting: '), write(File),
   reconsult(File), 
   spaces(Spaces), write(' - reconsulted.').   


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Prints out the file names
% as a numbered list.

print_files([],_). 
print_files([F|Fs],N):- 
   write('     '), 
   (N < 10 -> write(' ') ; true), 
   write(N), write('. '), write(F), nl, 
   M is N+1, 
   print_files(Fs,M). 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% SET_UP/0: 
%
% Allows user to select options of recompiling (into 
% form used by program) any or all of the user's segment
% macro definitions, two level rules and morphemes. 

set_up:- 
    nl, write('Options:'), nl, 
    write('   0.  Compile ALL (macros/lexicon/rules).'), nl, 
    write('   1.  Compile segment MACROS.'), nl, 
    write('   2.  Compile two level RULES.'), nl, 
    write('   3.  Compile LEXICON'), nl, nl, 
    write('Enter numbers for selected options.'), nl,
    write('|: '), 
    read_digits(Ds),           % Read user selections. 
    set_up(Ds), nl.            % Compile according to user selections. 
 
set_up(Ds):- 
   member(D,Ds), 
   \+(member(D,[0,1,2,3])), !,               % Check for unrecognised selections. 
   nl, write(' *** Unrecognised entry '),    % Warn. 
   write(D), write(' *** '), nl. 

set_up(Ds):-                     % User selects compilation of ALL of 
   member(0,Ds), !,              % macros/lexicon/rules
   set_up([1,2,3]).       % Call set_up/1 to do all three compilations. 

set_up(Ds):-                                         % Do comilations as selected by 
   (member(1,Ds) -> macro_set_up ; true),            % individual numbers. 
   (member(2,Ds) -> compile_twolevelrules ; true),
   (member(3,Ds) -> compile_lexicon ; true). 

s:- set_up.           % Abbreviated command. 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

