diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-22 19:35:53 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-22 19:35:53 +0000 |
commit | 0f347162b74d945f509955b6c57e506ab800db7b (patch) | |
tree | a5c5fb36dc632b5e2f387058b8170e0811001af8 | |
parent | 77c7fea4cee74562ad60c7ce96ca830a7ebda8b7 (diff) |
Implement halt/0, halt/1, and understand the --no-repl flag
-rw-r--r-- | builtins.c | 17 | ||||
-rw-r--r-- | loader.pl | 5 | ||||
-rw-r--r-- | repl.pl | 12 | ||||
-rw-r--r-- | stdlib.pl | 10 |
4 files changed, 36 insertions, 8 deletions
@@ -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; +} @@ -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: '), @@ -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). @@ -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) :- |