From 8607aee725861de6b0fc5fab5434ccadeb6c51ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Tue, 22 May 2018 21:33:34 +0100 Subject: [PATCH] Errors in C++ --- CXX/yapi.cpp | 61 ++-- H/YapGFlagInfo.h | 263 +++++++++--------- os/iopreds.c | 4 +- packages/python/pyio.c | 6 +- .../yap_kernel/yap_ipython/prolog/jupyter.yap | 4 +- pl/dialect.yap | 2 +- pl/error.yap | 2 +- 7 files changed, 161 insertions(+), 181 deletions(-) diff --git a/CXX/yapi.cpp b/CXX/yapi.cpp index 6b2ab35bc..3086e47f6 100644 --- a/CXX/yapi.cpp +++ b/CXX/yapi.cpp @@ -29,6 +29,25 @@ X_API void YAP_UserBackCPredicate(const char *, YAP_UserCPred, YAP_UserCPred, #if YAP_PYTHON X_API bool do_init_python(void); #endif + + +} + +static void YAPCatchError() + { + if (LOCAL_CommittedError != nullptr && + LOCAL_CommittedError->errorNo != YAP_NO_ERROR ) { + // Yap_PopTermFromDB(info->errorTerm); + // throw throw YAPError( ); + Term es[2]; + es[0] = TermError; + es[1] = MkErrorTerm(LOCAL_CommittedError); + LOCAL_CommittedError = nullptr; + Functor f = Yap_MkFunctor(Yap_LookupAtom("print_message"), 2); + YAP_RunGoalOnce(Yap_MkApplTerm(f, 2, es)); + // Yap_PopTermFromDB(info->errorTerm); + // throw throw YAPError( SOURCE(), ); + } } YAPPredicate::YAPPredicate(Term &t, Term &tmod, CELL *&ts, const char *pname) { @@ -486,13 +505,8 @@ bool YAPEngine::call(YAPPredicate ap, YAPTerm ts[]) { // don't forget, on success these bindings will still be there); result = YAP_LeaveGoal(false, &q); - if (LOCAL_CommittedError != nullptr) { - std::cerr << "Exception received by " << __func__ << "( " - << YAPError(LOCAL_CommittedError).text() - << ").\n Forwarded...\n\n"; - // Yap_PopTermFromDB(info->errorTerm); - // throw throw YAPError( SOURCE(), ); - } + YAPCatchError(); + Yap_CloseHandles(q.CurSlot); RECOVER_MACHINE_REGS(); return result; @@ -551,17 +565,11 @@ bool YAPEngine::mgoal(Term t, Term tmod) { return result; } } catch (...) { - if (LOCAL_CommittedError != nullptr && - LOCAL_CommittedError->errorNo != YAP_NO_ERROR) { - std::cerr << "Exception received by " << __func__ << "( " - << YAPError(LOCAL_CommittedError).text() - << ").\n Forwarded...\n\n"; - YAP_LeaveGoal(result, &q); + YAPCatchError(); // free(LOCAL_CommittedError); return false; } - } } void YAPEngine::release() { @@ -617,13 +625,7 @@ Term YAPEngine::fun(Term t) { __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec "); bool result = (bool)YAP_EnterGoal(ap, nullptr, &q); - if (LOCAL_CommittedError != nullptr) { - std::cerr << "Exception received by " << __func__ << "( " - << YAPError(LOCAL_CommittedError).text() - << ").\n Forwarded...\n\n"; - // Yap_PopTermFromDB(info->errorTerm); - // throw throw YAPError( SOURCE(), ); - } + YAPCatchError(); { YAP_LeaveGoal(result, &q); // PyEval_RestoreThread(_save); @@ -739,18 +741,8 @@ bool YAPQuery::next() { YAP_LeaveGoal(false, &q_h); Yap_CloseHandles(q_handles); q_open = false; - if (LOCAL_CommittedError != nullptr) { - // Yap_PopTermFromDB(info->errorTerm); - // throw throw YAPError( ); - Term es[2]; - es[0] = TermError; - es[1] = MkErrorTerm(LOCAL_CommittedError); - Functor f = Yap_MkFunctor(Yap_LookupAtom("print_message"), 2); - YAP_RunGoalOnce(Yap_MkApplTerm(f, 2, es)); - // Yap_PopTermFromDB(info->errorTerm); - // throw throw YAPError( SOURCE(), ); - } - } else { + YAPCatchError(); + } else { q_handles = Yap_StartSlots(); } RECOVER_MACHINE_REGS(); @@ -926,9 +918,6 @@ PredEntry *YAPPredicate::getPred(YAPTerm &tt, CELL *&outp) { Term m = Yap_CurrentModule(), t = tt.term(); t = Yap_StripModule(t, &m); - std::cerr << "Exception received by " << __func__ << "( " << tt.text() - << ").\n Forwarded...\n\n"; - if (IsVarTerm(t) || IsNumTerm(t)) { if (IsVarTerm(t)) throw YAPError(SOURCE(), INSTANTIATION_ERROR, tt.term(), 0); diff --git a/H/YapGFlagInfo.h b/H/YapGFlagInfo.h index a964d5cd1..ea7d8a732 100644 --- a/H/YapGFlagInfo.h +++ b/H/YapGFlagInfo.h @@ -45,34 +45,43 @@ opportunity. Initial value is 10,000. May be changed. A value of 0 YAP_FLAG(ALLOW_VARIABLE_NAME_AS_FUNCTOR_FLAG, "allow_variable_name_as_functor", false, booleanFlag, "false", - NULL), /**< - - boolean flag allows syntax such + NULL),/**< + boolean flag to enable syntax such as ~~~ Tree(Node(L,node,R)) :- Tree(L), - Tree(R). + Tree(R). ~~~ */ - - /**< `answer_format` how to present answers, default is `~p`. */ YAP_FLAG(ANSWER_FORMAT_FLAG, "answer_format", true, isatom, "~p", NULL), + /**< how to present answers, default is `~p`. */ #if __APPLE__ YAP_FLAG(APPLE_FLAG, "apple", false, booleanFlag, "true", NULL), /**< - `read-only boolean, a machine running an Apple Operating System * - * + `read-only boolean, true if in a machine running an Apple Operating System * + */ #endif YAP_FLAG(ARCH_FLAG, "arch", false, isatom, YAP_ARCH, NULL),/**< - `apple`: read-only atom, it describes the ISA used in this version of YAP. - Available from YAP_AEH. + read-only atom, it describes the ISA used in this version of YAP. + Extracted from YAP_ARCH. */ - YAP_FLAG(ARGV_FLAG, "argv", false, argv, "@boot", NULL), - /**< `arithmetic_exceptions` + YAP_FLAG(ARGV_FLAG, "argv", false, argv, "@boot", NULL), /**< + * read-only flag that stores the arguments passed from the calling program to the Prolog system, + * + * As an example, if YAP was called as follows: + * ~~~~~ + * yap -l script -z main -- /home 33 + * ~~~~ + * the finall two arguments would be available as: + * ['home'. '33'] + */ + + YAP_FLAG(ARITHMETIC_EXCEPTIONS_FLAG, "arithmetic_exceptions", true, + booleanFlag, "true", NULL), /**< ` Read-write flag telling whether arithmetic exceptions generate Prolog exceptions. If enabled: @@ -92,79 +101,81 @@ opportunity. Initial value is 10,000. May be changed. A value of 0 It is `true` by default, but it is disabled by packages like CLP(BN) and ProbLog. */ - YAP_FLAG(ARITHMETIC_EXCEPTIONS_FLAG, "arithmetic_exceptions", true, - booleanFlag, "true", NULL), + YAP_FLAG(BACK_QUOTES_FLAG, "back_quotes", true, isatom, "true", NULL), /**> If _Value_ is unbound, tell whether a back quoted list of characters token is converted to a list of atoms, `chars`, to a list of integers, `codes`, or to a single atom, `atom`. If _Value_ is bound, set to the corresponding behavior. The default value is `string` */ - YAP_FLAG(BACK_QUOTES_FLAG, "back_quotes", true, isatom, "true", NULL), - /**< `bounded` is iso - - Read-only flag telling whether integers are bounded. The value depends - on whether YAP uses the GMP library or not. - */ YAP_FLAG(BOUNDED_FLAG, "bounded", false, booleanFlag, "false", NULL), - YAP_FLAG(C_CC_FLAG, "c_cc", false, isatom, C_CC, NULL), - YAP_FLAG(C_CFLAGS_FLAG, "c_cflags", false, isatom, C_CFLAGS, NULL), - YAP_FLAG(C_LDFLAGS_FLAG, "c_ldflags", false, isatom, C_LDFLAGS, NULL), - YAP_FLAG(C_LIBPLSO_FLAG, "c_libplso", false, isatom, C_LIBPLSO, NULL), - YAP_FLAG(C_LIBS_FLAG, "c_libs", false, isatom, C_LIBS, NULL), - /**< `char_conversion is iso` + /**< `bounded` is iso + Read-only flag telling whether integers are bounded. The value depends + on whether YAP uses the GMP library or not. +*/ + + YAP_FLAG(C_CC_FLAG, "c_cc", false, isatom, C_CC, NULL), +/**< C compiler used to compile YAP. */ + YAP_FLAG(C_CFLAGS_FLAG, "c_cflags", false, isatom, C_CFLAGS, NULL), + /**< preprocessor flags that were used to compile YAP */ + YAP_FLAG(C_LDFLAGS_FLAG, "c_ldflags", false, isatom, C_LDFLAGS, NULL), + /**< flags used to link YAP */ + YAP_FLAG(C_LIBPLSO_FLAG, "c_libplso", false, isatom, C_LIBPLSO, NULL), + /**< name of YAP as a dynamic librar */ + YAP_FLAG(C_LIBS_FLAG, "c_libs", false, isatom, C_LIBS, NULL), + /**< libraries use to link YAP' */ + YAP_FLAG(CHAR_CONVERSION_FLAG, "char_conversion", true, booleanFlag, + "false", NULL), /**< Writable flag telling whether a character conversion table is used when reading terms. The default value for this flag is `off` except in `sicstus` and `iso` language modes, where it is `on`. */ - YAP_FLAG(CHAR_CONVERSION_FLAG, "char_conversion", true, booleanFlag, - "false", NULL), - /**< `character_escapes is iso ` + + YAP_FLAG(CHARACTER_ESCAPES_FLAG, "character_escapes", true, booleanFlag, + "true", NULL),/**< Writable flag telling whether a character escapes are enables, `true`, or disabled, `false`. The default value for this flag is `true`. */ - YAP_FLAG(CHARACTER_ESCAPES_FLAG, "character_escapes", true, booleanFlag, - "true", NULL), YAP_FLAG(COLON_SETS_CALLING_CONTEXT_FLAG, "colon_sets_calling_context", true, booleanFlag, "true", NULL), - /**< `compiled_at ` + /**< use colom to set the caller module, and override the current default module. */ + YAP_FLAG(COMPILED_AT_FLAG, "compiled_at", false, isatom, YAP_COMPILED_AT, + NULL), /**< `compiled_at ` Read-only flag that gives the time when the main YAP binary was compiled. It is obtained staight from the __TIME__ macro, as defined in the C99. */ - YAP_FLAG(COMPILED_AT_FLAG, "compiled_at", false, isatom, YAP_COMPILED_AT, - NULL), - /**< `debug is iso ` + + + YAP_FLAG(DEBUG_FLAG, "debug", true, booleanFlag, "false", NULL),/**< `debug is iso ` If _Value_ is unbound, tell whether debugging is `true` or `false`. If _Value_ is bound to `true` enable debugging, and if it is bound to `false` disable debugging. */ - YAP_FLAG(DEBUG_FLAG, "debug", true, booleanFlag, "false", NULL), - YAP_FLAG(DEBUG_INFO_FLAG, "debug_info", true, booleanFlag, "true", NULL), + YAP_FLAG(DEBUG_INFO_FLAG, "debug_info", true, booleanFlag, "true", NULL),/**< generate debugging data */ YAP_FLAG(DEBUG_ON_ERROR_FLAG, "debug_on_error", true, booleanFlag, "true", - NULL), - /**< `debugger_print_options ` + NULL), /**< call debugger on generating an error */ - If bound, set the argument to the `write_term/3` options the - debugger uses to write terms. If unbound, show the current options. - */ YAP_FLAG(DEBUGGER_PRINT_OPTIONS_FLAG, "debugger_print_options", true, list_option, "[quoted(true),numbervars(true),portrayed(true),max_depth(10)]", - NULL), + NULL), /**< + If bound, set the argument to the `write_term/3` options the + debugger uses to write terms. If unbound, show the current options. + */ YAP_FLAG(DEBUGGER_SHOW_CONTEXT_FLAG, "debugger_show_context", true, - booleanFlag, "false", NULL), - /**< `dialect ` + booleanFlag, "false", NULL), /**< + * always show the current source module while debugging. YAP will only show the calling module if not `prolog`oy `user`*/ + YAP_FLAG(DIALECT_FLAG, "dialect", false, ro, "yap", NULL), /**< Read-only flag that always returns `yap`. */ - YAP_FLAG(DIALECT_FLAG, "dialect", false, ro, "yap", NULL), - /**< `discontiguous_warnings ` - + YAP_FLAG(DISCONTIGUOUS_WARNINGS_FLAG, "discontiguous_warnings", true, + booleanFlag, "true", NULL), /**< If `true` (default `true`) YAP checks for definitions of the same predicate that are separated by clauses for other predicates. This may indicate that different procedures have the same name. @@ -173,39 +184,41 @@ opportunity. Initial value is 10,000. May be changed. A value of 0 predicates. */ - YAP_FLAG(DISCONTIGUOUS_WARNINGS_FLAG, "discontiguous_warnings", true, - booleanFlag, "true", NULL), - /**< `dollar_as_lower_case ` + + YAP_FLAG(DOLLAR_AS_LOWER_CASE_FLAG, "dollar_as_lower_case", true, + booleanFlag, "false", NULL), /**< `dollar_as_lower_case ` If `off` (default) consider the character `$` a control character, if `on` consider `$` a lower case character. */ - YAP_FLAG(DOLLAR_AS_LOWER_CASE_FLAG, "dollar_as_lower_case", true, - booleanFlag, "false", NULL), - /**< `double_quotes is iso ` + + + YAP_FLAG(DOUBLE_QUOTES_FLAG, "double_quotes", true, isatom, "codes", dqs),/**< `double_quotes is iso ` If _Value_ is unbound, tell whether a double quoted list of characters token is converted to a list of atoms, `chars`, to a list of integers, `codes`, or to a single atom, `atom`. If _Value_ is bound, set to the corresponding behavior. The default value is `codes`. */ - YAP_FLAG(DOUBLE_QUOTES_FLAG, "double_quotes", true, isatom, "codes", dqs), - YAP_FLAG(EDITOR_FLAG, "editor", true, isatom, "$EDITOR", NULL), - /**< `executable ` + + YAP_FLAG(EDITOR_FLAG, "editor", true, isatom, "$EDITOR", NULL), /**< + * Report the current default editor, as defined by the environment variable EDITOR. + */ + + YAP_FLAG(EXECUTABLE_FLAG, "executable", false, executable, "@boot", NULL),/**< Read-only flag. It unifies with an atom that gives the original program path. */ - YAP_FLAG(EXECUTABLE_FLAG, "executable", false, executable, "@boot", NULL), - /**< `fast ` + + YAP_FLAG(FAST_FLAG, "fast", true, booleanFlag, "false", NULL),/**< `fast ` If `on` allow fast machine code, if `off` (default) disable it. Only available in experimental implementations. */ - YAP_FLAG(FAST_FLAG, "fast", true, booleanFlag, "false", NULL), YAP_FLAG(FILE_NAME_VARIABLES_FLAG, "file_name_variables", true, booleanFlag, - "true", NULL), - /**< + `float_format ` + "true", NULL),/**< non-implemented */ + YAP_FLAG(FLOAT_FORMAT_FLAG, "float_format", true, isatom, "%.16f", NULL),/**< C-library `printf()` format specification used by write/1 and friends to determine how floating point numbers are printed. The default is `%.15g`. The specified value is passed to `printf()` @@ -213,21 +226,18 @@ opportunity. Initial value is 10,000. May be changed. A value of 0 printed, `%g` will print all floats using 6 digits instead of the default 15. */ - YAP_FLAG(FLOAT_FORMAT_FLAG, "float_format", true, isatom, "%.16f", NULL), - /**< `gc` + YAP_FLAG(GC_FLAG, "gc", true, booleanFlag, "on", NULL),/**< If `on` allow garbage collection (default), if `off` disable it. */ - YAP_FLAG(GC_FLAG, "gc", true, booleanFlag, "on", NULL), - /**< `gc_margin ` + YAP_FLAG(GC_MARGIN_FLAG, "gc_margin", true, nat, "0", gc_margin),/**< Set or show the minimum free stack before starting garbage collection. The default depends on total stack size. */ - YAP_FLAG(GC_MARGIN_FLAG, "gc_margin", true, nat, "0", gc_margin), - /**< `gc_trace ` - + YAP_FLAG(GC_TRACE_FLAG, "gc_trace", true, isatom, "off", NULL), + /**< ` If `off` (default) do not show information on garbage collection and stack shifts, if `on` inform when a garbage collection or stack shift happened, if verbose give detailed information on garbage @@ -235,17 +245,15 @@ opportunity. Initial value is 10,000. May be changed. A value of 0 information on data-structures found during the garbage collection process, namely, on choice-points. */ - YAP_FLAG(GC_TRACE_FLAG, "gc_trace", true, isatom, "off", NULL), - /**< `generate_debug_info ` + YAP_FLAG(GENERATE_DEBUGGING_INFO_FLAG, "generate_debug_info", true, + booleanFlag, "true", NULL),/**< If `true` (default) generate debugging information for procedures, including source mode. If `false` predicates no information is generated, although debugging is still possible, and source mode is disabled. */ - YAP_FLAG(GENERATE_DEBUGGING_INFO_FLAG, "generate_debug_info", true, - booleanFlag, "true", NULL), YAP_FLAG(GMP_VERSION_FLAG, "gmp_version", false, isatom, "4.8.12", NULL), YAP_FLAG(HALT_AFTER_CONSULT_FLAG, "halt_after_consult", false, booleanFlag, "false", NULL), @@ -386,55 +394,48 @@ opportunity. Initial value is 10,000. May be changed. A value of 0 Yap_InitReadline), YAP_FLAG(REPORT_ERROR_FLAG, "report_error", true, booleanFlag, "true", NULL), - /**<`resource_database` + + YAP_FLAG(RESOURCE_DATABASE_FLAG, "resource_database", false, isatom, + YAP_BOOTSTRAP, NULL),/**< Name of the resource file (saved-state or Prolog file) used to construct the YAP run-time environment. */ - YAP_FLAG(RESOURCE_DATABASE_FLAG, "resource_database", false, isatom, - YAP_BOOTSTRAP, NULL), - /**<`saved_program` + YAP_FLAG(SAVED_PROGRAM_FLAG, "saved_program", false, booleanFlag, "false", + NULL), /**< if `true` YAP booted from a `yss` file, usually `startup.yss'. If `false`, YAP booted from a Prolog file, by default `boot.yap`. */ - YAP_FLAG(SAVED_PROGRAM_FLAG, "saved_program", false, booleanFlag, "false", - NULL), - /**< `shared_object_extension ` - - Suffix associated with loadable code. - */ YAP_FLAG(SHARED_OBJECT_EXTENSION_FLAG, "shared_object_extension", false, isatom, SO_EXT, NULL), - /**< `shared_object_search_path ` + + YAP_FLAG(SHARED_OBJECT_SEARCH_PATH_FLAG, "shared_object_search_path", true, + isatom, SO_PATH, NULL),/**< Name of the environment variable used by the system to search for shared objects. */ - YAP_FLAG(SHARED_OBJECT_SEARCH_PATH_FLAG, "shared_object_search_path", true, - isatom, SO_PATH, NULL), - /**< `single_quoted text is usuallly interpreted as atoms. This flagTerm - allows other inerpretations such as strings_contains_strings */ YAP_FLAG(SINGLE_QUOTES_FLAG, "single_quotes", true, isatom, "atom", sqf), +/**< single_quoted text is usuallly interpreted as atoms. This flagTerm + allows other inerpretations such as strings_contains_strings */ - /**< `signals` + YAP_FLAG(SIGNALS_FLAG, "signals", true, booleanFlag, "true", NULL),/**< If `true` (default) YAP handles Signals such as `^C` (`SIGINT`). */ - YAP_FLAG(SIGNALS_FLAG, "signals", true, booleanFlag, "true", NULL), - /**< `source` + YAP_FLAG(SOURCE_FLAG, "source", true, booleanFlag, "true", NULL),/**< If `true` maintain the source for all clauses. Notice that this is trivially supported for facts, and always supported for dynamic code. */ - YAP_FLAG(SOURCE_FLAG, "source", true, booleanFlag, "true", NULL), - /**< `strict_iso ` + YAP_FLAG(STRICT_ISO_FLAG, "strict_iso", true, booleanFlag, "false", NULL),/**< If _Value_ is unbound, tell whether strict ISO compatibility mode is `on` or `off`. If _Value_ is bound to `on` set language mode to `iso` and enable strict mode. If _Value_ is @@ -455,52 +456,51 @@ opportunity. Initial value is 10,000. May be changed. A value of 0 depends on a Prolog's platform specific features. */ - YAP_FLAG(STRICT_ISO_FLAG, "strict_iso", true, booleanFlag, "false", NULL), - /**< `system_options ` + YAP_FLAG(SYSTEM_OPTIONS_FLAG, "system_options", false, options, + SYSTEM_OPTIONS, NULL), /**< This read only flag tells which options were used to compile YAP. Currently it informs whether the system supports `big_numbers`, `coroutining`, `depth_limit`, `low_level_tracer`, `or-parallelism`, `rational_trees`, `readline`, `tabling`, `threads`, or the `wam_profiler`. */ - YAP_FLAG(SYSTEM_OPTIONS_FLAG, "system_options", false, options, - SYSTEM_OPTIONS, NULL), YAP_FLAG(SYSTEM_THREAD_ID_FLAG, "system_thread_id", false, sys_thread_id, "@boot", NULL), - /**< `tabling_mode` + + YAP_FLAG(TABLING_MODE_FLAG, "tabling_mode", true, isatom, "[]", NULL),/**< `tabling_mode` Sets or reads the tabling mode for all tabled predicates. Please (see Tabling) for the list of options. */ - YAP_FLAG(TABLING_MODE_FLAG, "tabling_mode", true, isatom, "[]", NULL), YAP_FLAG(THREADS_FLAG, "threads", false, ro, "MAX_THREADS", NULL), YAP_FLAG(TIMEZONE_FLAG, "timezone", false, ro, "18000", NULL), YAP_FLAG(TOPLEVEL_PRINT_ANON_FLAG, "toplevel_print_anon", true, booleanFlag, "true", NULL), - /**< `toplevel_hook ` + YAP_FLAG(TOPLEVEL_PRINT_OPTIONS_FLAG, "toplevel_print_options", true, + list_option, "[quoted(true),numbervars(true),portrayed(true)]", + NULL), /**< If bound, set the argument to a goal to be executed before entering the top-level. If unbound show the current goal or `true` if none is presented. Only the first solution is considered and the goal is not backtracked into. */ - YAP_FLAG(TOPLEVEL_PRINT_OPTIONS_FLAG, "toplevel_print_options", true, - list_option, "[quoted(true),numbervars(true),portrayed(true)]", - NULL), YAP_FLAG(TOPLEVEL_PROMPT_FLAG, "toplevel_prompt", true, isatom, "?- ", mkprompt), YAP_FLAG(TTY_CONTROL_FLAG, "tty_control", true, booleanFlag, "true", NULL), - /**< `unix` + + YAP_FLAG(UNIX_FLAG, "unix", false, ro, "true", NULL),/**< Read-only BooleanFlag flag that unifies with `true` if YAP is running on an Unix system. Defined if the C-compiler used to compile this version of YAP either defines `__unix__` or `unix`. */ - YAP_FLAG(UNIX_FLAG, "unix", false, ro, "true", NULL), - /**< `update_semantics ` + + YAP_FLAG(UPDATE_SEMANTICS_FLAG, "update_semantics", true, isatom, "logical", + NULL), /**< `update_semantics ` Define whether YAP should follow `immediate` update semantics, as in C-Prolog (default), `logical` update semantics, @@ -509,10 +509,8 @@ opportunity. Initial value is 10,000. May be changed. A value of 0 procedures follow logical semantics but the internal data base still follows immediate semantics. */ - YAP_FLAG(UPDATE_SEMANTICS_FLAG, "update_semantics", true, isatom, "logical", - NULL), - /**< - `user_flags ` + + YAP_FLAG(USER_FLAGS_FLAG, "user_flags", true, isatom, "error", NULL),/**< Define the behaviour of set_prolog_flag/2 if the flag is not known. Values are `silent`, `warning` and `error`. The first two create the flag @@ -522,87 +520,82 @@ opportunity. Initial value is 10,000. May be changed. A value of 0 are encouraged to use `create_prolog_flag/3` to create flags for their library. */ - YAP_FLAG(USER_FLAGS_FLAG, "user_flags", true, isatom, "error", NULL), - /**< `unknown is iso` + + YAP_FLAG(UNKNOWN_FLAG, "unknown", true, isatom, "error", Yap_unknown), /**< `unknown is iso` Corresponds to calling the unknown/2 built-in. Possible ISO values are `error`, `fail`, and `warning`. Yap includes the following extensions: `fast_fail` does not invoke any handler. */ - YAP_FLAG(UNKNOWN_FLAG, "unknown", true, isatom, "error", Yap_unknown), YAP_FLAG(VARIABLE_NAMES_MAY_END_WITH_QUOTES_FLAG, "variable_names_may_end_with_quotes", true, booleanFlag, "false", NULL), - /**< `verbose ` + YAP_FLAG(VERBOSE_FLAG, "verbose", true, isatom, "normal", NULL),/**< If `normal` allow printing of informational and banner messages, such as the ones that are printed when consulting. If `silent` disable printing these messages. It is `normal` by default except if YAP is booted with the `-q` or `-L` flag. */ - YAP_FLAG(VERBOSE_FLAG, "verbose", true, isatom, "normal", NULL), YAP_FLAG(VERBOSE_AUTOLOAD_FLAG, "verbose_autoload", true, booleanFlag, "false", NULL), - /**< `verbose_file_search ` + + YAP_FLAG(VERBOSE_FILE_SEARCH_FLAG, "verbose_file_search", true, booleanFlag, + "false", NULL),/**< If `true` allow printing of informational messages when searching for file names. If `false` disable printing these messages. It is `false` by default except if YAP is booted with the `-L` flag. */ - YAP_FLAG(VERBOSE_FILE_SEARCH_FLAG, "verbose_file_search", true, booleanFlag, - "false", NULL), - /**< `verbose_load ` + + YAP_FLAG(VERBOSE_LOAD_FLAG, "verbose_load", true, isatom, "normal", NULL),/**< If `true` allow printing of informational messages when consulting files. If `false` disable printing these messages. It is `normal` by default except if YAP is booted with the `-L` flag. */ - YAP_FLAG(VERBOSE_LOAD_FLAG, "verbose_load", true, isatom, "normal", NULL), - /**< `version_data ` + YAP_FLAG(VERSION_FLAG, "version", false, nat, YAP_NUMERIC_VERSION, NULL),/**< Read-only flag that unifies with a number of the form `_Major_ * 100000 + _Minor_ *100 + _Patch_`, where _Major_ is the major version, _Minor_ is the minor version, and _Patch_ is the patch number. */ - YAP_FLAG(VERSION_FLAG, "version", false, nat, YAP_NUMERIC_VERSION, NULL), - /**< - `version ` Read-only flag that returns a compound term with the + + YAP_FLAG(VERSION_DATA_FLAG, "version_data", false, ro, YAP_TVERSION, NULL), /**< + Read-only flag that returns a compound term with the current version of YAP. The term will have the name `yap` and arity 4, the first argument will be the major version, the second the minor version, the third the patch number, and the last one is reserved. */ - YAP_FLAG(VERSION_DATA_FLAG, "version_data", false, ro, YAP_TVERSION, NULL), - /**< `version_git ` - ` + + YAP_FLAG(VERSION_GIT_FLAG, "version_git", false, isatom, YAP_GIT_HEAD, + NULL), /**< this is the unique identifier for the last commit of the current GIT HEAD, it xan be used to identify versions that differ on small (or large) updates. */ - YAP_FLAG(VERSION_GIT_FLAG, "version_git", false, isatom, YAP_GIT_HEAD, - NULL), YAP_FLAG(WRITE_ATTRIBUTES_FLAG, "write_attributes", true, isatom, "ignore", NULL), #if __WINDOWS__ - /**< `windows` + + YAP_FLAG(WINDOWS_FLAG, "windows", false, ro, "true", NULL), /**< `windows` Read-only booleanFlag flag that unifies with `true` if YAP is running on an Windows machine. */ - YAP_FLAG(WINDOWS_FLAG, "windows", false, ro, "true", NULL), -#endif - /**< `write_strings ` + #endif + YAP_FLAG(WRITE_STRINGS_FLAG, "write_strings", true, booleanFlag, "false", + NULL) , /**< Writable flag telling whether the system should write lists of integers that are writable character codes using the list notation. It is `on` if enables or `off` if disabled. The default value for this flag is `off`. */ - YAP_FLAG(WRITE_STRINGS_FLAG, "write_strings", true, booleanFlag, "false", - NULL), END_GLOBAL_FLAGS diff --git a/os/iopreds.c b/os/iopreds.c index 38ff9c30f..cfd9f4a70 100644 --- a/os/iopreds.c +++ b/os/iopreds.c @@ -1584,7 +1584,7 @@ int Yap_OpenStream(Term tin, const char *io_mode, Term user_name, } else { st->file = fopen(fname, io_mode); } - if (!st->file) { + if (!st->file && !st->vfs) { fprintf(stderr, "trying %s\n", fname); PlIOError(EXISTENCE_ERROR_SOURCE_SINK, tin, "%s", fname); /* extract BACK info passed through the stream descriptor */ @@ -1629,7 +1629,7 @@ int Yap_OpenStream(Term tin, const char *io_mode, Term user_name, pop_text_stack(i); } } - if (st->file == NULL) { + if (st->file == NULL && st->vfs == NULL) { if (!strchr(io_mode, 'b') && binary_file(fname)) { UNLOCK(st->streamlock); if (errno == ENOENT && !strchr(io_mode, 'r')) { diff --git a/packages/python/pyio.c b/packages/python/pyio.c index 11c7ae539..0a3017135 100644 --- a/packages/python/pyio.c +++ b/packages/python/pyio.c @@ -62,13 +62,11 @@ static void *py_open(VFS_t *me, const char *name, const char *io_mode, st->user_name = TermOutStream; } else if (strcmp(name, "sys.stderr") == 0) { st->user_name = TermErrStream; + } else if (strcmp(name, "input") == 0) { + pystream = PyObject_Call(pystream, PyTuple_New(0), NULL); } else { st->user_name = YAP_MkAtomTerm(st->name); } - // we assume object is already open, so there is no need to open it. - if (PyCallable_Check(pystream)) - st->u.private_data = PyObject_Call(pystream, PyTuple_New(0), NULL); - else st->u.private_data = pystream; st->vfs = me; python_release_GIL(ctk); diff --git a/packages/python/yap_kernel/yap_ipython/prolog/jupyter.yap b/packages/python/yap_kernel/yap_ipython/prolog/jupyter.yap index a1ac4b3dc..321791415 100644 --- a/packages/python/yap_kernel/yap_ipython/prolog/jupyter.yap +++ b/packages/python/yap_kernel/yap_ipython/prolog/jupyter.yap @@ -69,10 +69,10 @@ nb_setval(jupyter_cell, false), ). streams(true) :- nb_setval(jupyter_cell, true), - open('/python/input', read, _Input, [alias(user_input),bom(false)]), +% open('/python/input', read, _Input, [alias(user_input),bom(false)]), open('/python/sys.stdout', append, _Output, [alias(user_output)]), open('/python/sys.stderr', append, _Error, [alias(user_error)]), - set_prolog_flag(user_input,_Input), +% set_prolog_flag(user_input,_Input), set_prolog_flag(user_output,_Output), set_prolog_flag(user_error,_Error). diff --git a/pl/dialect.yap b/pl/dialect.yap index b1acc28e7..2aef183bf 100644 --- a/pl/dialect.yap +++ b/pl/dialect.yap @@ -6,7 +6,7 @@ * * @brief support Prolog dialects * - * @defgroup Dialects Compatibilty with other Prolog dialects + * @defgroup Dialects Compatibility with other Prolog dialects * @ingroup extensions * @{ * @brief Prolog dialects diff --git a/pl/error.yap b/pl/error.yap index 2b96441e3..e97ecdecd 100644 --- a/pl/error.yap +++ b/pl/error.yap @@ -26,7 +26,7 @@ /** @defgroup SWI-error High-level error testing. -@ingroup builtins +@ingroup Deb_Interaction This SWI module provides predicates to simplify error generation and checking. Adapted to use YAP built-ins.