-t custom toplevel option
- Add -t FLAG to specify custom toplevel (arity 0 predicate) - Default toplevel is 'repl' if -t is not specified - Using `-t halt` achieves original goal of guaranteed termination - Custom toplevels enable flexible exit strategies (e.g., server mode) - Update help text to document -t flag Examples: scryer-prolog -t halt program.pl # Exits after execution scryer-prolog -t my_repl program.pl # Custom REPL scryer-prolog program.pl # Default REPL Co-Authored-By: J.J.'s Robot <noreply@example.com>
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
:- dynamic(disabled_init_file/0).
|
:- dynamic(disabled_init_file/0).
|
||||||
:- dynamic(started/0).
|
:- dynamic(started/0).
|
||||||
|
:- dynamic(custom_toplevel/1).
|
||||||
|
|
||||||
load_scryerrc :-
|
load_scryerrc :-
|
||||||
( '$home_directory'(HomeDir) ->
|
( '$home_directory'(HomeDir) ->
|
||||||
@@ -53,7 +54,13 @@ start_repl :-
|
|||||||
; true
|
; true
|
||||||
),
|
),
|
||||||
(\+ disabled_init_file -> load_scryerrc ; true),
|
(\+ disabled_init_file -> load_scryerrc ; true),
|
||||||
repl.
|
start_toplevel.
|
||||||
|
|
||||||
|
start_toplevel :-
|
||||||
|
( custom_toplevel(Goal) ->
|
||||||
|
user:call(Goal)
|
||||||
|
; repl
|
||||||
|
).
|
||||||
|
|
||||||
args_consults_goals([], [], []).
|
args_consults_goals([], [], []).
|
||||||
args_consults_goals([Arg|Args], Consults, Goals) :-
|
args_consults_goals([Arg|Args], Consults, Goals) :-
|
||||||
@@ -71,12 +78,13 @@ delegate_task([], Goals0) :-
|
|||||||
args_consults_goals(Goals1, Consults, Goals),
|
args_consults_goals(Goals1, Consults, Goals),
|
||||||
run_goals(Consults),
|
run_goals(Consults),
|
||||||
run_goals(Goals),
|
run_goals(Goals),
|
||||||
repl.
|
start_toplevel.
|
||||||
|
|
||||||
delegate_task([Arg0|Args], Goals0) :-
|
delegate_task([Arg0|Args], Goals0) :-
|
||||||
( ( member(Arg0, ["-h", "--help"]) -> print_help
|
( ( member(Arg0, ["-h", "--help"]) -> print_help
|
||||||
; member(Arg0, ["-v", "--version"]) -> print_version
|
; member(Arg0, ["-v", "--version"]) -> print_version
|
||||||
; member(Arg0, ["-g", "--goal"]) -> gather_goal(g, Args, Goals0)
|
; member(Arg0, ["-g", "--goal"]) -> gather_goal(g, Args, Goals0)
|
||||||
|
; member(Arg0, ["-t"]) -> gather_toplevel(Args, Goals0)
|
||||||
; member(Arg0, ["-f"]) -> disable_init_file
|
; member(Arg0, ["-f"]) -> disable_init_file
|
||||||
; member(Arg0, ["--no-add-history"]) -> ignore_machine_arg
|
; member(Arg0, ["--no-add-history"]) -> ignore_machine_arg
|
||||||
),
|
),
|
||||||
@@ -96,6 +104,8 @@ print_help :-
|
|||||||
write('Print version information and exit'), nl,
|
write('Print version information and exit'), nl,
|
||||||
write(' -g, --goal GOAL '),
|
write(' -g, --goal GOAL '),
|
||||||
write('Run the query GOAL'), nl,
|
write('Run the query GOAL'), nl,
|
||||||
|
write(' -t GOAL '),
|
||||||
|
write('Use GOAL as custom toplevel (arity 0 predicate)'), nl,
|
||||||
write(' -f '),
|
write(' -f '),
|
||||||
write('Fast startup. Do not load initialization file (~/.scryerrc)'), nl,
|
write('Fast startup. Do not load initialization file (~/.scryerrc)'), nl,
|
||||||
write(' --no-add-history '),
|
write(' --no-add-history '),
|
||||||
@@ -117,6 +127,17 @@ gather_goal(Type, Args0, Goals) :-
|
|||||||
Gs =.. [Type, Gs1],
|
Gs =.. [Type, Gs1],
|
||||||
delegate_task(Args, [Gs|Goals]).
|
delegate_task(Args, [Gs|Goals]).
|
||||||
|
|
||||||
|
gather_toplevel(Args0, Goals0) :-
|
||||||
|
length(Args0, N),
|
||||||
|
( N < 1 -> print_help, halt
|
||||||
|
; true
|
||||||
|
),
|
||||||
|
[TopLevel|Args] = Args0,
|
||||||
|
atom_chars(Goal, TopLevel),
|
||||||
|
retractall(custom_toplevel(_)),
|
||||||
|
asserta(custom_toplevel(Goal)),
|
||||||
|
delegate_task(Args, Goals0).
|
||||||
|
|
||||||
disable_init_file :-
|
disable_init_file :-
|
||||||
asserta('disabled_init_file').
|
asserta('disabled_init_file').
|
||||||
|
|
||||||
@@ -154,7 +175,7 @@ run_goals([g(Gs0)|Goals]) :- !,
|
|||||||
Exception,
|
Exception,
|
||||||
( write_term(Goal, [variable_names(VNs),double_quotes(DQ)]),
|
( write_term(Goal, [variable_names(VNs),double_quotes(DQ)]),
|
||||||
write(' causes: '),
|
write(' causes: '),
|
||||||
write_term(Exception, [double_quotes(DQ)]), nl % halt?
|
write_term(Exception, [double_quotes(DQ)]), nl
|
||||||
)
|
)
|
||||||
) -> true
|
) -> true
|
||||||
; write('% Warning: initialization failed for: '),
|
; write('% Warning: initialization failed for: '),
|
||||||
|
|||||||
Reference in New Issue
Block a user