From 3f316c5c9265618fe7095cc39c4cb10909cbe468 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Fri, 16 Jul 2021 20:09:02 +0000 Subject: Implement a bit more of prolog flag predicates set_prolog_flag/2 and current_prolog_flag/2 --- stdlib.pl | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'stdlib.pl') diff --git a/stdlib.pl b/stdlib.pl index 0986781..d093eed 100644 --- a/stdlib.pl +++ b/stdlib.pl @@ -549,3 +549,60 @@ nl :- nl(S) :- put_char(S, ' '). % This should really be \n + +% flags +set_prolog_flag(Flag, Value) :- + is_nonvar(Flag), + is_nonvar(Value), + is_atom(Flag), + is_prolog_flag(Flag), + is_appropriate_flag_value(Flag, Value), + is_modifiable_flag(Flag), + '$set_prolog_flag'(Flag, Value). + +current_prolog_flag(Flag, Value) :- + is_atom_or_var(Flag), + ( atom(Flag) + -> is_prolog_flag(Flag) + ; true + ), + current_prolog_flags(FlagsAndValues), + member(flag(Flag, Value), FlagsAndValues). + +is_prolog_flag(Flag) :- + member(Flag, + [ bounded + , max_integer + , min_integer + , integer_rounding_function + , char_conversion + , debug + , max_arity + , unknown + , double_quotes]), + ! + ; domain_error(prolog_flag, Flag). + +is_modifiable_flag(Flag) :- + member(Flag, [char_conversion, debug, unknown, double_quotes]), + ! + ; permission_error(modify, flag, Flag). + +is_appropriate_flag_value(Flag, Value) :- + appropriate_flag_values(Flag, Values), + member(Value, Values), + ! + ; domain_error(flag_value, Flag + Value). + +appropriate_flag_values(bounded, [true, false]). +appropriate_flag_values(max_integer, [Val]) :- + current_prolog_flag(max_integer, Val). +appropriate_flag_values(min_integer, [Val]) :- + current_prolog_flag(min_integer, Val). +appropriate_flag_values(integer_rounding_function, [down, toward_zero]). +appropriate_flag_values(char_conversion, [on, off]). +appropriate_flag_values(debug, [on, off]). +appropriate_flag_values(max_arity, [Val]) :- + current_prolog_flag(max_arity). +appropriate_flag_values(unknown, [error, fail, warning]). +appropriate_flag_values(double_quotes, [chars, codes, atom]). \ No newline at end of file -- cgit v1.2.3