This commit is contained in:
Vitor Santos Costa 2018-10-12 14:57:05 +01:00
parent cb1c73c973
commit 7772699ef7
7 changed files with 163 additions and 107 deletions

View File

@ -767,6 +767,8 @@ option(WITH_DOCS
"generate YAP docs" OFF) "generate YAP docs" OFF)
IF (WITH_DOCS) IF (WITH_DOCS)
get_target_property(YAP_SOURCES libYap SOURCES)
add_subDIRECTORY(docs) add_subDIRECTORY(docs)
ENDIF (WITH_DOCS) ENDIF (WITH_DOCS)

View File

@ -26,8 +26,7 @@ SET( EXT
${DOCS_SOURCE_DIR}/custom/theme.css ${DOCS_SOURCE_DIR}/custom/theme.css
${DOCS_SOURCE_DIR}/custom/yap.css ${DOCS_SOURCE_DIR}/custom/yap.css
) )
foreach(i ${CMAKE_HTML_EXTRA_}) foreach(i ${CMAKE_HTML_EXTRA_})
string(APPEND CMAKE_HTML_EXTRA ${i} " ") string(APPEND CMAKE_HTML_EXTRA ${i} " ")
endforeach(i ${CMAKE_HTML_EXTRA_}) endforeach(i ${CMAKE_HTML_EXTRA_})
@ -88,10 +87,6 @@ endforeach(i ${DOCS_EXCLUDE_})
set(doxyfile_in ${CMAKE_SOURCE_DIR}/docs/Doxyfile.in) set(doxyfile_in ${CMAKE_SOURCE_DIR}/docs/Doxyfile.in)
add_subdirectory(../packages/raptor/doc ${CMAKE_BINARY_DIR}/packages/raptor/doc) add_subdirectory(../packages/raptor/doc ${CMAKE_BINARY_DIR}/packages/raptor/doc)
SET(DOC_INPUT_FILES_ SET(DOC_INPUT_FILES_

View File

@ -22,30 +22,32 @@
/** /**
* *
*
@defgroup args Term Argument Manipulation. * @defgroup args Term Argument Manipulation.
*
@ingroup @library * @ingroup @library
*
@{ * @{
*
Extends arg/3 by including backtracking through arguments and access *This library extends arg/3 by supporting backtracking through
to sub-arguments, *arguments and access to sub-arguments,
*
- arg0/3 * - arg0/3
- args/3 * - args/3
- args0/3 * - args0/3
- genarg/3 * - genarg/3
- genarg0/3 * - genarg0/3
- path_arg/3 * - path_arg/3
*
*
It is based on the Quintus Prolog arg library. Except for project, all *It is based on the Quintus Prolog public domain library. Except for
predicates use the arg/3 argument pattern. *project, all predicates use the arg/3 argument pattern. This file has
This file has been included in the YAP library by Vitor Santos Costa, 2008. No error checking is actuallly performed within the package: this left to the C-code thaat implements arg``/3 and *been included in the YAP library by Vitor Santos Costa, 2008.
genarg/3. *
*/ * No error checking is actuallly performed within the package: this
*left to the C-code that implements arg/3 and genarg/3.
*/
/** /**
* @pred arg0( +_Index_, +_Term_ , -_Arg_ ) * @pred arg0( +_Index_, +_Term_ , -_Arg_ )

View File

@ -20,8 +20,6 @@
* @author VITOR SANTOS COSTA <vsc@VITORs-MBP.lan> * @author VITOR SANTOS COSTA <vsc@VITORs-MBP.lan>
* @date Wed Nov 18 01:23:45 2015 * @date Wed Nov 18 01:23:45 2015
* *
* @brief interaction with the OS, be it Unix, Linux, or Windows.
*
* *
*/ */
@ -33,6 +31,7 @@
delete_file/1, delete_file/1,
delete_file/2, delete_file/2,
directory_files/2, directory_files/2,
directory_map/2,
environ/2, environ/2,
exec/3, exec/3,
file_exists/2, file_exists/2,
@ -61,7 +60,11 @@
working_directory/2 working_directory/2
]). ]).
/** @defgroup operating_system_support, Operating System Functionality
/** @defgroup operating_system_support Operating System Functionality
* @brief Portable Interaction with the OS, be it Unix, Linux, OSX, or Windows.
*
@ingroup library @ingroup library
@{ @{
@ -74,13 +77,6 @@ are available through the `use_module(library(system))` command.
*/ */
/** @pred file_exists(+ _File_)
The atom _File_ corresponds to an existing file.
*/
/** @pred file_property(+ _File_,? _Property_) /** @pred file_property(+ _File_,? _Property_)
@ -212,13 +208,6 @@ completes. YAP uses `/bin/sh` in Unix systems and `COMSPEC` in
WIN32. WIN32.
*/
/** @pred system(+ _Command_,- _Res_)
Interface to `system`: execute command _Command_ and unify
_Res_ with the result.
*/ */
/** @pred tmp_file(+_Base_, - _File_) /** @pred tmp_file(+_Base_, - _File_)
@ -236,21 +225,6 @@ temporary files.
Interface with _tmpnam_: obtain a new, unique file name _File_. Interface with _tmpnam_: obtain a new, unique file name _File_.
*/
/** @pred working_directory(- _Old_,+ _New_)
/** @pred working_directory(- _CurDir_,? _NextDir_)
Fetch the current directory at _CurDir_. If _NextDir_ is bound
to an atom, make its value the current working directory.
Unifies _Old_ with an absolute path to the current working directory
and change working directory to _New_. Use the pattern
`working_directory(CWD, CWD)` to get the current directory. See
also `absolute_file_name/2` and chdir/1.
*/ */
:- use_module(library(lists), [append/3]). :- use_module(library(lists), [append/3]).
@ -451,15 +425,11 @@ if there is one. This predicate is backtrackable in Unix systems, but
not currently in Win32 configurations. not currently in Win32 configurations.
~~~~~ ~~~~~
?- environ('HOME',X). ?- environ('HOME',V).
X = 'C:\\cygwin\\home\\administrator' ? V = 'C:\\cygwin\\home\\administrator' ?
~~~~~ ~~~~~
*/ _EnvVar_ may be bound to an atom, or just be
/** @pred environ(+E, -S)
Given an environment variable _E_ this predicate unifies the second
argument _S_ with its value. _E_ may be bound to an atom, or just be
unbound. In the latter case environ/2 will enumerate over all unbound. In the latter case environ/2 will enumerate over all
environment variables. environment variables.
@ -666,6 +636,19 @@ get_shell(Shell, '/c') :-
getenv('COMSPEC', Shell). getenv('COMSPEC', Shell).
get_shell('/bin/sh','-c'). get_shell('/bin/sh','-c').
/**
* @pred system(+ _S_)
Passes command _S_ to the Bourne shell (on UNIX environments) or the
current command interpreter in WIN32 environments.
*/
/**
* @pred system
Passes command _S_ to the Bourne shell (on UNIX environments) or the
current command interpreter in WIN32 environments.
*/
system :- system :-
default_shell(Command), default_shell(Command),
do_system(Command, _Status, Error), do_system(Command, _Status, Error),
@ -676,6 +659,13 @@ default_shell(Shell) :- win, !,
default_shell('/bin/sh'). default_shell('/bin/sh').
/** @pred system(+ _Command_,- _Res_)
Interface to `system`: execute command _Command_ and unify
_Res_ with the result.
n*/
system(Command, Status) :- system(Command, Status) :-
G = system(Command, Status), G = system(Command, Status),
check_command(Command, G), check_command(Command, G),
@ -764,13 +754,6 @@ rename_file(F0, F) :-
rename_file(F0, F, Error), rename_file(F0, F, Error),
handle_system_internal(Error, off, rename_file(F0, F)). handle_system_internal(Error, off, rename_file(F0, F)).
/**
* @pred system(+ _S_)
Passes command _S_ to the Bourne shell (on UNIX environments) or the
current command interpreter in WIN32 environments.
*/
/** @pred directory_files(+ _Dir_,+ _List_) /** @pred directory_files(+ _Dir_,+ _List_)
@ -788,4 +771,44 @@ environments, and `findfirst` in WIN32 through the system_library buil
directory_files(X,Y) :- directory_files(X,Y) :-
list_directory(X,Y). list_directory(X,Y).
:- meta_predicate directory_map(+,1,-),
rb_apply(+,+,2,-).
/** @pred directory_map(+ _Dir_, 1:_P_)
Given a directory _Dir_, directory_map/2 visits all files in _Dir_,
and verifies whether `P(F)` holds, where _F_ is the file's absolute
path.
~~~~~
?- directory_map('.', process).
~~~~~
The predicates performs a left-recursive traversal. It does not protect against file system errors and it does not check for symbolic links.
*/
directory_map(D, P),
working_directory(_, D),
list_directory(D,L),
d_map(L, P).
d_map([],_,_,_).
d_map(['.'|Fs],D, P) :-
d_map(Fs,D, P).
d_map(['..'|Fs],D, P) :-
d_map(Fs, D, P).
d_map([D|Fs], D, P) :-
absolute_file_name( F, File, [prefix(D)] ),
f_map(File, P),
d_map(Fs, D, P).
f_map(File, P) :-
catch( file_property( File, type(directory) ), _, fail ),
directory_map( File, P).
f_map(File, P) :-
call(P,File).
/** @} */ /** @} */

View File

@ -1150,6 +1150,19 @@ const char *Yap_getcwd(char *cwd, size_t cwdlen) {
return rc; return rc;
} }
/** @pred working_directory( ?_CurDir_,? _NextDir_)
Fetch the current directory at _CurDir_. If _NextDir_ is bound
to an atom, make its value the current working directory.
Unifies _Old_ with an absolute path to the current working directory
and change working directory to _New_. Use the pattern
`working_directory(CWD, CWD)` to get the current directory. See
also `absolute_file_name/2` and chdir/1.
*/
static Int working_directory(USES_REGS1) { static Int working_directory(USES_REGS1) {
char dir[YAP_FILENAME_MAX + 1]; char dir[YAP_FILENAME_MAX + 1];
Term t1 = Deref(ARG1), t2; Term t1 = Deref(ARG1), t2;

View File

@ -3,8 +3,6 @@
* @author Nuno Fonseca (nunofonseca@acm.org), Tiago Soares * @author Nuno Fonseca (nunofonseca@acm.org), Tiago Soares
* @date 2005-05-14 * @date 2005-05-14
* *
* @brief Yap PreProcessing
*
* *
*/ */
%==================================================================================== %====================================================================================
@ -32,16 +30,18 @@
). ).
/** /**
* @defgroup Ypp Yap PreProcessing * @defgroup Ypp YAP PreProcessing
* @brief YAP Interface to the C Preprocessor
*
* @{ * @{
* @ingroup library * @ingroup library
* *
* This program can be used as a preprocessor in the * This program allows preprocessing in the
* style of the `C` language. Currently, it must be used through * style of the `C` language. Currently, it must be used through
* ypp_consult and or ypp_reconsult. * ypp_consult/1 and or ypp_reconsult/1. See the myddas library for examples of use.
* *
* Notice that ypp uses `#` commands and it is different from the Prolog if/1 * Notice that ypp uses `#` commands and it is different from the Prolog if/1
* directive. * directive. The `ypp` extension should be used for these files.
* *
*/ */
@ -57,14 +57,26 @@ ypp_state(State):-
get_state(State), get_state(State),
!. !.
/** @pred ypp_define(_Name_,_Value_)
*
* Define a new preprocessor symbol _Name_, and bind it to _Value_ (same as `#define`)
*/
ypp_define(Name,Value):- ypp_define(Name,Value):-
ground(Name),ground(Value), ground(Name),ground(Value),
store_define(Name,Value). store_define(Name,Value).
/** @pred ypp_undefine(_Name_)
*
* Discard a preprocessor symbol _Name_ (same as `#undef`)
*/
ypp_undefine(Name):- ypp_undefine(Name):-
ground(Name), ground(Name),
del_define(Name). del_define(Name).
/** @pred ypp_extcmd(_Cmd_)
*
* Add a preprocessor extension _Cmd_
*/
ypp_extcmd(Cmd):- ypp_extcmd(Cmd):-
ground(Cmd),!, ground(Cmd),!,
eraseall('____ypp_extcmd'), eraseall('____ypp_extcmd'),
@ -73,10 +85,18 @@ ypp_extcmd(Cmd):-
\+ ground(Cmd), \+ ground(Cmd),
recorded('____ypp_extcmd',Cmd,_). recorded('____ypp_extcmd',Cmd,_).
/** @pred ypp_consult(_File_)
*
* Preprocess and consult a file.
*/
ypp_consult(File):- ypp_consult(File):-
(get_state(on)->ypp_file(File,NFile);NFile=File), (get_state(on)->ypp_file(File,NFile);NFile=File),
consult(NFile). consult(NFile).
/** @pred ypp_reconsult(_File_)
*
* Preprocess and reconsult a file.
*/
ypp_reconsult(File):- ypp_reconsult(File):-
(get_state(on)->ypp_file(File,NFile);NFile=File), (get_state(on)->ypp_file(File,NFile);NFile=File),
reconsult(NFile). reconsult(NFile).

View File

@ -108,7 +108,7 @@ sicstus :- catch(current_prolog_flag(system_type, _), _, fail).
:- if(swi). :- if(swi).
throw_error(Error_term,Impldef) :- throw_error(Error_term,Impldef) :-
throw(error(Error_term,context(Impldef,_))). throw(error(Error_term,Impldef)).
:- set_prolog_flag(generate_debug_info, false). :- set_prolog_flag(generate_debug_info, false).
:- use_module(library(option)). :- use_module(library(option)).
@ -126,9 +126,9 @@ set_test_flag(Name, Value) :-
throw_error(Error_term,Impldef) :- throw_error(Error_term,Impldef) :-
throw(error(Error_term,i(Impldef))). % SICStus 3 work around throw(error(Error_term,i(Impldef))). % SICStus 3 work around
:- use_module(swi). % SWI-Compatibility %:- use_module(swi). % SWI-Compatibility
:- use_module(library(terms)). :- use_module(library(terms)).
:- op(700, xfx, =@=). %:- op(700, xfx, =@=).
'$set_source_module'( In, Out) :- '$set_source_module'( In, Out) :-
current_source_module(In, Out). current_source_module(In, Out).
@ -159,7 +159,7 @@ set_test_flag( Name, Val ) :-
retractall(test_flag(Name,_)), retractall(test_flag(Name,_)),
asserta(test_flag(Name, Val)). asserta(test_flag(Name, Val)).
:- op(1150, fx, thread_local). %:- op(1150, fx, thread_local).
user:term_expansion((:- thread_local(PI)), (:- dynamic(PI))) :- user:term_expansion((:- thread_local(PI)), (:- dynamic(PI))) :-
prolog_load_context(module, plunit). prolog_load_context(module, plunit).
@ -255,7 +255,6 @@ loading_tests :-
% unit is ended by :- end_tests(UnitName). % unit is ended by :- end_tests(UnitName).
begin_tests(Unit) :- begin_tests(Unit) :-
trace,
begin_tests(Unit, []). begin_tests(Unit, []).
begin_tests(Unit, Options) :- begin_tests(Unit, Options) :-
@ -267,30 +266,31 @@ begin_tests(Unit, Options) :-
:- if(swi). :- if(swi).
begin_tests(Unit, Name, File:Line, Options) :- begin_tests(Unit, Name, File:Line, Options) :-
loading_tests, !, loading_tests, !,
'$set_source_module'(Context, Context), prolog_flag(typein_module,Context, Context),
( current_unit(Unit, Name, Context, Options) ( current_unit(Unit, Name, Context, Options)
-> true -> true
; retractall(current_unit(Unit, Name, _, _)), ; retractall(current_unit(Unit, Name, _, _)),
assert(current_unit(Unit, Name, Context, Options)) assert(current_unit(Unit, Name, Context, Options))
), ),
'$set_source_module'(Old, Name), prolog_flag(typein_module,Old, Name),
'$declare_module'(Name, test, Context, File, Line, false), declare_module(Name, test, Context, File, Line, false),
discontiguous(Name:'unit test'/4), discontiguous(Name:'unit test'/4),
% '$set_predicate_attribute'(Name:'unit test'/4, trace, 0), discontiguous(Name:'unit body'/2),
discontiguous(Name:'unit body'/2), multifile(Name:'unit test'/4),
asserta(loading_unit(Unit, Name, File, Old)). multifile(Name:'unit body'/2),
asserta(loading_unit(Unit, Name, File, Old)).
begin_tests(Unit, Name, File:_Line, _Options) :- begin_tests(Unit, Name, File:_Line, _Options) :-
'$set_source_module'(Old, Old), prolog_flag(typein_module,Old, Old),
asserta(loading_unit(Unit, Name, File, Old)). asserta(loading_unit(Unit, Name, File, Old)).
'$declare_module'( Name, Class, Context, File, Line, _AllowFile ) :- declare_module( Name, Class, Context, File, Line, _AllowFile ) :-
Name \= Context, Name \= Context,
!, !,
set_module_property( Name, base(Context) ), set_module_property( Name, base(Context) ),
set_module_property( Name, class(Class) ), set_module_property( Name, class(Class) ),
set_module_property( Name, exports([], File, Line) ). set_module_property( Name, exports([], File, Line) ).
'$declare_module'( Name, _Class, Name, _File, _Line, _AllowFile ) . declare_module( Name, _Class, Name, _File, _Line, _AllowFile ) .
:- else. :- else.
@ -327,7 +327,7 @@ end_tests(Unit) :-
loading_unit(StartUnit, _, _, _), !, loading_unit(StartUnit, _, _, _), !,
( Unit == StartUnit ( Unit == StartUnit
-> once(retract(loading_unit(StartUnit, _, _, Old))), -> once(retract(loading_unit(StartUnit, _, _, Old))),
'$set_source_module'(_, Old) prolog_flag(typein_module,_, Old)
; throw_error(context_error(plunit_close(Unit, StartUnit)), _) ; throw_error(context_error(plunit_close(Unit, StartUnit)), _)
). ).
end_tests(Unit) :- end_tests(Unit) :-
@ -463,7 +463,7 @@ user:term_expansion(Term, Expanded) :-
*******************************/ *******************************/
:- if(swi). :- if(swi).
%:- use_module(library(error)). :- use_module(library(error)).
:- else. :- else.
must_be(list, X) :- !, must_be(list, X) :- !,
( is_list(X) ( is_list(X)
@ -689,7 +689,7 @@ make_run_tests(Files) :-
:- if(swi). :- if(swi).
unification_capability(sto_error_incomplete). %unification_capability(sto_error_incomplete).
% can detect some (almost all) STO runs % can detect some (almost all) STO runs
unification_capability(rational_trees). unification_capability(rational_trees).
unification_capability(finite_trees). unification_capability(finite_trees).
@ -701,6 +701,7 @@ set_unification_capability(Cap) :-
current_unification_capability(Cap) :- current_unification_capability(Cap) :-
current_prolog_flag(occurs_check, Flag), current_prolog_flag(occurs_check, Flag),
cap_to_flag(Cap, Flag), !. cap_to_flag(Cap, Flag), !.
current_unification_capability(false).
cap_to_flag(sto_error_incomplete, error). cap_to_flag(sto_error_incomplete, error).
cap_to_flag(rational_trees, false). cap_to_flag(rational_trees, false).
@ -1033,7 +1034,7 @@ cmp(Var =@= Value, Var, variant, Value). % variant/2 is the same =@=
% True if Goal succeeded. Det is unified to =true= if Goal left % True if Goal succeeded. Det is unified to =true= if Goal left
% no choicepoints and =false= otherwise. % no choicepoints and =false= otherwise.
:- if((swi|sicstus)). :- if((swi)).
call_det(Goal, Det) :- call_det(Goal, Det) :-
call_cleanup(Goal,Det0=true), call_cleanup(Goal,Det0=true),
( var(Det0) -> Det = false ; Det = true ). ( var(Det0) -> Det = false ; Det = true ).