% on SWISH we'll avoid the file to file translation, by converting on a term by term basis, assuming the transform to be 1-1 (except for nlp) % we assume the LPS transform to preserve Prolog user:term_expansion(NiceTerm,'$source_location'(File, Line):ExpandedTerms) :- % somehow the source location is not being kept, causing later failure of clause_info/5 :-( %context_module(user), % LPS programs are in the user module prolog_load_context(source,File), % atom_prefix(File,'pengine://'), % process only SWISH windows expecting_lps_dialect, prolog_load_context(term_position,TP), stream_position_data(line_position,TP,Line), catch(lps_nlp_translate(NiceTerm,ExpandedTerms),_,fail), !. % hook for LogicalContracts extension user:term_expansion(NiceTerm,ExpandedTerm) :- % context_module(user), % LPS programs are in the user module %prolog_load_context(source,File), atom_prefix(File,'pengine://'), % process only SWISH windows expecting_lps_dialect, may_clear_hints, set_top_term(NiceTerm), % current_syntax(lps2p,true), In the future we may want to support other syntax conversions % variable names probably not available here, but we don't care about lpsp2p syntax anymore: % somehow this fails to... some terms;-) prolog_load_context(file,File), mylog(normal-File), syntax2p(NiceTerm,[],lps2p,ExpandedTerm). end_of_file. :- module(lps_term_expander, [lps_term_expander/3,lps_f_term_expansion_now/3]). :- nodebug(lps(term_expand)). :- module_transparent(lps_term_expander/3). :- use_module(('../utils/psyntax.P'),[ lps2p_file/2, lps2p/3, syntax2p_file/4, syntax2p/4, syntax2p_literal/7, golps/2, golps/1, dumpjs/2, dumpjs/1, file_generator_name/2, may_clear_hints/0,term_colours/2,timeless_ref/1, set_top_term/1, dumploaded/2 ]). get_source_location(File,Line):- source_location(File,Line),!. get_source_location(File,Line):- prolog_load_context(source,File), prolog_load_context(term_position,TP), stream_position_data(line_position,TP,Line),!. add_source_location(_Module,ExpandedTerm,Output):- nonvar(ExpandedTerm), \+ ((ExpandedTerm=(Compound:_), compound(Compound))), get_source_location(File,Line), Output = ('$source_location'(File, Line):ExpandedTerm), !. add_source_location(_Module,Output,Output). % on SWISH we'll avoid the file to file translation, by converting on a term by term basis, assuming the transform to be 1-1 (except for nlp) % we assume the LPS transform to preserve Prolog lps_f_term_expansion(Module,NiceTerm,Output) :- % somehow the source location is not being kept, causing later failure of clause_info/5 :-( % atom_prefix(File,'pengine://'), % process only SWISH windows lps_f_term_expansion_now(Module,NiceTerm,ExpandedTerm),!, add_source_location(Module,ExpandedTerm,Output), maybe_inform(Module,NiceTerm,ExpandedTerm). lps_f_term_expansion_now(_Module,NiceTerm,ExpandedTerm):- notrace(catch(call(call,lps_nlp_translate(NiceTerm,ExpandedTerm)),_,fail)), !. % hook for LogicalContracts extension lps_f_term_expansion_now(_Module,NiceTerm,ExpandedTerm) :- may_clear_hints, set_top_term(NiceTerm),!, % current_syntax(lps2p,true), In the future we may want to support other syntax conversions % variable names probably not available here, but we don't care about lpsp2p syntax anymore: % somehow this fails to... some terms;-) prolog_load_context(file,File), mylog(normal-File), syntax2p(NiceTerm,[],lps2p,ExpandedTerm). /* their origninal TE % on SWISH we'll avoid the file to file translation, by converting on a term by term basis, assuming the transform to be 1-1 (except for nlp) % we assume the LPS transform to preserve Prolog user:term_expansion(NiceTerm,'$source_location'(File, Line):ExpandedTerms) :- % somehow the source location is not being kept, causing later failure of clause_info/5 :-( context_module(user), % LPS programs are in the user module prolog_load_context(source,File), atom_prefix(File,'pengine://'), % process only SWISH windows prolog_load_context(term_position,TP), stream_position_data(line_position,TP,Line), catch(lps_nlp_translate(NiceTerm,ExpandedTerms),_,fail), !. % hook for LogicalContracts extension user:term_expansion(NiceTerm,ExpandedTerm) :- context_module(user), % LPS programs are in the user module prolog_load_context(source,File), atom_prefix(File,'pengine://'), % process only SWISH windows may_clear_hints, set_top_term(NiceTerm), % current_syntax(lps2p,true), In the future we may want to support other syntax conversions % variable names probably not available here, but we don't care about lpsp2p syntax anymore: % somehow this fails to... some terms;-) prolog_load_context(file,File), mylog(normal-File), syntax2p(NiceTerm,[],lps2p,ExpandedTerm). */ lps_term_expander(Module,NiceTerm,ExpandedTerm):- expecting_lps_dialect, is_lps_module_and_stream_ok(Module),!, % context_module(user), % LPS programs are in the user module lps_f_term_expansion(Module,NiceTerm,ExpandedTerm),!, prolog_load_context(variable_names, Vars), maybe_save_varname_info(NiceTerm,Vars,module(Module)), maybe_save_varname_info(ExpandedTerm,Vars,module(Module)),!. maybe_save_varname_info(ExpandedTerm,Vars,Why):- expand_to_hb(ExpandedTerm,H,B), ignore((Vars\==[], assertz(varname_cache:varname_info(H,B,Vars,Why)))),!. maybe_inform(_Module,NiceTerm,ExpandedTerm):- ignore(((debugging(lps(term_expand)), NiceTerm\=@=ExpandedTerm,flush_output(user_error), format(user_error,'~N~n% LPS: ~p.~n% Into: ~p.~n',[NiceTerm,ExpandedTerm]), flush_output(user_error)))). :- module_transparent(system:term_expansion/2). system:term_expansion(NiceTerm,ExpandedTerm):- expecting_lps_dialect, % compound(NiceTerm), NiceTerm \= (_:_), % context_module(Module), prolog_load_context(module,Module), lps_term_expander(Module,NiceTerm,ExpandedTerm),!.