From 0f347162b74d945f509955b6c57e506ab800db7b Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Thu, 22 Jul 2021 19:35:53 +0000 Subject: Implement halt/0, halt/1, and understand the --no-repl flag --- builtins.c | 17 +++++++++++++++++ loader.pl | 5 ++++- repl.pl | 12 +++++------- stdlib.pl | 10 ++++++++++ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/builtins.c b/builtins.c index d1f70b9..79c71f0 100644 --- a/builtins.c +++ b/builtins.c @@ -70,6 +70,7 @@ BuiltinProto(builtinsetstreamposition); BuiltinProto(builtinop); BuiltinProto(builtincurrentops); BuiltinProto(builtinnewemptymodule); +BuiltinProto(builtinhalt); int compareterms(Term *, Term *); @@ -199,6 +200,8 @@ findbuiltin(Term *goal) return builtincurrentops; if(Match(L"$new_empty_module", 1)) return builtinnewemptymodule; + if(Match(L"$halt", 1)) + return builtinhalt; return nil; } @@ -1649,3 +1652,17 @@ builtinnewemptymodule(Term *goal, Binding **bindings, Module *module) addemptymodule(name); return 1; } + +int +builtinhalt(Term *goal, Binding **bindings, Module *module) +{ + USED(bindings); + USED(module); + vlong exitcode = goal->children->ival; + char *msg = nil; + if(exitcode != 0) + msg = smprint("pprolog exit code: %lld\n", exitcode); + + exits(msg); + return 1; +} diff --git a/loader.pl b/loader.pl index 0a9f8df..99478d0 100644 --- a/loader.pl +++ b/loader.pl @@ -2,7 +2,10 @@ start(Args) :- catch((load_module_from_file('/sys/lib/prolog/repl.pl'), ReplLoaded = true), E, (print_exception(E), ReplLoaded = false)), - ( ReplLoaded = true-> repl:repl(Args) ). + !, + ( ReplLoaded = true + -> repl:repl(Args) + ). print_exception(E) :- write('Caught exception while loading /sys/lib/prolog/repl.pl: '), diff --git a/repl.pl b/repl.pl index 0bb279f..8f68551 100644 --- a/repl.pl +++ b/repl.pl @@ -1,17 +1,15 @@ :- module(repl, []). repl([_ProgName|Args]) :- - write('Welcome to p-prolog version 1.'), - nl, - write('Started with args: '), - write(Args), - nl, - flush_output, handle_args(Args), - repl_loop. + ( member('--no-repl', Args) + -> halt + ; repl_loop + ). handle_arg('-d') :- set_prolog_flag(debug, on). +handle_arg('--no-repl'). handle_arg(Arg) :- loader:load_module_from_file(Arg). diff --git a/stdlib.pl b/stdlib.pl index bca7e31..19b20d0 100644 --- a/stdlib.pl +++ b/stdlib.pl @@ -683,6 +683,16 @@ current_op(Priority, Op_specifier, Operator) :- current_ops(Operators), member(op(Priority, Op_specifier, Operator), Operators). +% Halting + +halt(X) :- + is_nonvar(X), + is_integer(X), + '$halt'(X). + +halt :- + halt(0). + % Loading prolog text consult(File) :- -- cgit v1.2.3