Christian patches for call_cleanup and documentation.

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@633 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2002-10-11 03:39:11 +00:00
parent 523fae9544
commit efc7c1c5a6
3 changed files with 197 additions and 99 deletions

View File

@ -1,4 +1,4 @@
<\input texinfo @c -*- mode: texinfo; coding: latin-1; -*-
\input texinfo @c -*- mode: texinfo; coding: latin-1; -*-
@c %**start of header
@setfilename yap.info
@ -93,7 +93,7 @@ manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted qto copy and distribute translations of this
Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that this permission notice may be stated in a
translation approved by the OFAI.
@ -226,6 +226,7 @@ Subnodes of Library
* String I/O:: Writing To and Reading From Strings
* System:: System Utilities
* Terms:: Utilities on Terms
* Cleanup:: Call With registered Cleanup Calls
* Timeout:: Call With Timeout
* Trees:: Updatable Binary Trees
* UGraphs:: Unweighted Graphs
@ -393,7 +394,7 @@ acknowledge the contributions from Ashwin Srinivasian.
We are happy to include in YAP several excellent packages developed
under separate licenses. Our thanks to the authors for their kind
authorisation to include these packages.
authorization to include these packages.
The packages are, in alphabetical order:
@ -434,7 +435,7 @@ manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted qto copy and distribute translations of this
Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that this permission notice may be stated in a
translation approved by the OFAI.
@ -501,7 +502,7 @@ conventions on where to place software.
actually a script that calls the Prolog engine, stored at @code{LIBDIR}.
@item @code{LIBDIR} is the directory where libraries are stored. YAPLIBDIR is a
subsdirectory that contains the Prolog engine and a Prolog library.
subdirectory that contains the Prolog engine and a Prolog library.
@item @code{INCLUDEDIR} is used if you want to use Yap as a library.
@ -582,7 +583,7 @@ Sun's cc compiler, IBM's xlc, SGI's cc, and Microsoft's Visual C++
6.0.
@menu
* Tuning for GCC:: Using the GNUCC ncompiler
* Tuning for GCC:: Using the GNUCC compiler
* Compiling Under Visual C++:: Using Microsoft's Visual C++ environment
* Tuning for SGI cc:: Compiling Under SGI's @code{cc}
@end menu
@ -599,7 +600,7 @@ YAP is set by default to compile with the best compilation flags we
know. Even so, a few specific options reduce portability. The option
@itemize @bullet
@item @code{--enable-max-performance=yes} will try to support the best
available flags for a specific architecural model. Currently, the option
available flags for a specific architectural model. Currently, the option
assumes a recent version of @code{GCC}.
@item @code{--enable-debug-yap} compiles Yap so that it can be debugged
by tools such as @code{dbx} or @code{gdb}.
@ -625,7 +626,7 @@ YAP_EXTRAS= ... -mno-app-regs -DOPTIMISE_ALL_REGS_FOR_SPARC=1
and YAP will get two extra registers! This trick does not work on
SunOS 4 machines.
Note that versions of GCC can be tweaked to recognise different
Note that versions of GCC can be tweaked to recognize different
processors within the same instruction set, eg, 486, Pentium, and
PentiumPro for the x86; or Ultrasparc, and Supersparc for
Sparc. Unfortunately, some of these tweaks do may make Yap run slower or
@ -641,7 +642,7 @@ GCC"/"Submodel Options". Specifically, you should check
@table @code
@item 486:
In order to take advantage of 486 specific optimisations in GCC 2.7.*:
In order to take advantage of 486 specific optimizations in GCC 2.7.*:
@example
YAP_EXTRAS= ... -m486 -DBP_FREE=1
@ -701,7 +702,7 @@ You should check the default installation path which is set to
@code{/PROGRA~1/Yap} in the standard Makefile. This string will usually
be expanded into @code{c:\Program Files\Yap} by Windows.
The cygwin environment does not provide @t{gm}. You can fecth a dll for
The cygwin environment does not provide @t{gm}. You can fetch a dll for
the @t{gmp} library from @url{http://www.sf.net/projects/mingwrep}.
It is also possible to configure Yap to be a part of the cygwin
@ -735,7 +736,7 @@ First, it is a good idea to build Yap as a DLL:
DLL project, initially empty.
Notice that either the project is named yapdll or you must replace the
preprocessor's variable @var{YAPDLL_EXPORTS} to match your project names
preprocessors variable @var{YAPDLL_EXPORTS} to match your project names
in the files @code{YapInterface.h} and @code{c_interface.c}.
@item add all .c files in the @var{$YAPSRC/C} directory and in the
@ -1276,7 +1277,7 @@ The next examples demonstrates the use of escape sequences in YAP:
The first three examples return a list including only character 12 (form
feed). The last example escapes the escape character.
Escape sequences were not available in C-Prolog and in origional
Escape sequences were not available in C-Prolog and in original
versions of YAP up to 4.2.0. Escape sequences can be disable by using:
@example
@code{:- yap_flag(character_escapes,off).}
@ -1471,7 +1472,7 @@ files specified by @var{F} into the file being currently consulted.
@end table
@node Setting the Compiler, Saving, Compiling, Loading Programs
@section Changing the Compiler's Behaviour
@section Changing the Compiler's Behavior
This section presents a set of built-ins predicates designed to set the
environment for the compiler.
@ -1512,7 +1513,7 @@ The same as @code{source_mode(_,off)}.
@snindex compile_expressions/0
@cnindex compile_expressions/0
After a call to this predicate, arithmetical expressions will be compiled.
(see example below). This is the default behaviour.
(see example below). This is the default behavior.
@item do_not_compile_expressions
@findex do_not_compile_expressions/0
@ -1588,7 +1589,7 @@ Adds @var{D} to the end of YAP's directory search path.
@findex add_to_path/2
@snindex path/1
@cnindex path/1
Inserts @var{D} in thgoe position, of the directory search path of
Inserts @var{D} in the position, of the directory search path of
YAP, specified by @var{N}. @var{N} must be either of
@code{first} or @code{last}.
@ -1971,7 +1972,7 @@ a(G) :- call(G)
...
@end example
The expected behaviour for this procedure is to execute goal @var{G}
The expected behavior for this procedure is to execute goal @var{G}
within the current module, that is, within @code{example}.
On the other hand, when executing @code{call/1} the system only knows
where @code{call/1} was defined, that is, it only knows of
@ -2460,7 +2461,7 @@ dynamic. What YAP does when trying to execute undefined predicates can
be specified through three different ways:
@itemize @bullet
@item By setting an YAP flag, through the @code{yap_flag/2} or
@code{set_prolog_flag/2} built-ins. This solution generalises the
@code{set_prolog_flag/2} built-ins. This solution generalizes the
ISO standard.
@item By using the @code{unknown/2} built-in (this solution is
compatible with previous releases of YAP).
@ -3408,7 +3409,7 @@ YAP currently ignores these options.
@findex absolute_file_name/2
@syindex absolute_file_name/2
@cnindex absolute_file_name/2
Give the path a full path @var{FullPath} Yap would use to consule a file
Give the path a full path @var{FullPath} Yap would use to consult a file
named @var{Name}. Unify @var{FullPath} with @code{user} if the file
name is @code{user}.
@ -3506,7 +3507,7 @@ unbound, the procedure will backtrack through all open
streams. Otherwise, the first argument must be a stream term (you may
use @code{current_stream} to obtain a current stream given a file name).
The following properties are recognised:
The following properties are recognized:
@table @code
@ -3727,7 +3728,7 @@ following options:
@table @code
@item quoted(+@var{Bool})
If @code{true}, quote atoms if this would be necessary for the atom to
be recognised as an atom by YAP's parser. The default value is
be recognized as an atom by YAP's parser. The default value is
@code{false}.
@item ignore_ops(+@var{Bool})
@ -3989,7 +3990,7 @@ We next show how to do centering:
The two @code{~t} escape sequence force filling both before and after
@code{Hello}. Space is then evenly divided bewteen the right and the
@code{Hello}. Space is then evenly divided between the right and the
left sides.
@item format(+@var{S},+@var{T},+@var{L})
@ -4438,7 +4439,7 @@ Call @code{socket/4} with @var{TYPE} bound to @code{'SOCK_STREAM'} and
@cnindex socket_close/1
Close socket @var{SOCKET}. Note that sockets used in
@code{socket_connet} (that is, client sockets) should not be closed with
@code{socket_connect} (that is, client sockets) should not be closed with
@code{socket_close}, as they will be automatically closed when the
corresponding stream is closed with @code{close/1} or @code{close/2}.
@ -4706,7 +4707,7 @@ undefined results.
@cnindex assertz_static/1
Adds clause @var{C} to the end of a static procedure. Asserting a
static clause for a predicate while choice-points for the predicate are
availabe has undefined results.
available has undefined results.
@end table
@ -5456,7 +5457,7 @@ Arranges for YAP to be interrupted in @var{Seconds}
seconds. When interrupted, YAP will execute @var{Callable} and
then return to the previous execution. If @var{Seconds} is @code{0}, no
new alarm is scheduled. In any event, any previously set alarm is
cancelled.
canceled.
The variable @var{OldAlarm} unifies with the number of seconds remaining
until any previously scheduled alarm was due to be delivered, or with
@ -5525,8 +5526,8 @@ Set the interrupt handler for soft interrupt @var{Signal} to be
@var{Callable}. @var{OldAction} is unified with the previous handler.
Only a subset of the software interrupts (signals) can have their
handlers maniputated through @code{on_signal/3}.
Their POSIX names, YAP names and default behaviour is given below.
handlers manipulated through @code{on_signal/3}.
Their POSIX names, YAP names and default behavior is given below.
The "YAP name" of the signal is the atom that is associated with
each signal, and should be used as the first argument to
@code{on_signal/3}. It is chosen so that it matches the signal's POSIX
@ -5538,7 +5539,7 @@ are made on the handler provided by the user.
@table @code
@item SIGHUP (Hangup)
sig_hup in YAP; Reconsult the initialisation files
sig_hup in YAP; Reconsult the initialization files
~/.yaprc, ~/.prologrc and ~/prolog.ini.
@item SIGUSR1 and SIGUSR2 (User signals)
sig_usr1 and sig_usr2 in YAP; Print a message and halt.
@ -5669,7 +5670,7 @@ write_profile_data([D-P|SLP]) :-
These are the current predicates to access and clear profiling data:
@table @code
@item profile_data(?@var{Na/Ar}, ?@var{Paramater}, -@var{Data})
@item profile_data(?@var{Na/Ar}, ?@var{Parameter}, -@var{Data})
@findex profile_data/3
@snindex profile_data/3
@cnindex profile_data/3
@ -5873,7 +5874,7 @@ previously.
@snindex static_array/3
@cnindex static_array/3
Similar to @code{static_array/3}, but the array is memory mapped to file
@var{File}. This means that the array is initialised from the file, and
@var{File}. This means that the array is initialized from the file, and
that any changes to the array will also be stored in the file.
This built-in is only available in operating systems that support the
@ -6108,7 +6109,7 @@ reading terms. The default value for this flag is @code{off} except in
@c @code{iso} mode, which corresponds to @code{on}, and @code{sicstus}
@c mode, which corresponds to the mode traditionally used in SICStus
@c Prolog. In this mode back-quoted escape sequences should not close with
@c a backquote and unrecognised escape codes do not result in error.
@c a backquote and unrecognized escape codes do not result in error.
@item debug [ISO]
@findex debug (yap_flag/2 option)
@ -6138,7 +6139,7 @@ If @code{off} (default) consider the character '$' a control character, if
If @var{Value} is unbound, tell whether a double quoted list of characters
token is converted to a list of atoms, @code{chars}, to a list of integers,
@code{codes}, or to a single atom, @code{atom}. If @var{Value} is bound, set to
the corresponding behaviour. The default value is @code{codes}.
the corresponding behavior. The default value is @code{codes}.
@item fast
@findex fast (yap_flag/2 option)
@ -6218,7 +6219,7 @@ Read-only flag telling the maximum arity of a functor. Takes the value
Read-only flag telling the maximum integer in the
implementation. Depends on machine and Operating System
architecture, and on whether YAP uses the @code{GMP} multiprecision
library. If @code{bounded} is false, requestes for @code{max_integer}
library. If @code{bounded} is false, requests for @code{max_integer}
will fail.
@item min_integer [ISO]
@ -6226,7 +6227,7 @@ will fail.
@* Read-only flag telling the minimum integer in the
implementation. Depends on machine and Operating System architecture,
and on whether YAP uses the @code{GMP} multiprecision library. If
@code{bounded} is false, requestes for @code{min_integer} will fail.
@code{bounded} is false, requests for @code{min_integer} will fail.
@item n_of_integer_keys_in_bb
@findex n_of_integer_keys_in_bb (yap_flag/2 option)
@ -6285,7 +6286,7 @@ from a modern Prolog system. Moreover, because most Prolog
implementations do not fully implement the standard and because the
standard itself gives the implementor latitude in a few important
questions, such as the unification algorithm and maximum size for
numbers there is not guarantee that prolograms compliant with this mode
numbers there is not guarantee that programs compliant with this mode
will work the same way in every Prolog and in every platform. We thus
believe this mode is mostly useful when investigating how a program
depends on a Prolog's platform specific features.
@ -6456,7 +6457,7 @@ Defines the operator @var{A} or the list of operators @var{A} with type
Note that if there is a preexisting operator with the same name and
type, this operator will be discarded. Also, @code{','} may not be defined
as an operator, and it is not allowed to have the same for an infix and
a posfix operator.
a postfix operator.
@item current_op(@var{P},@var{T},@var{F}) [ISO]
@findex current_op/3
@ -6571,6 +6572,7 @@ Library, Extensions, Builtins, Top
* String I/O:: Writing To and Reading From Strings
* System:: System Utilities
* Terms:: Utilities on Terms
* Cleanup:: Call With registered Cleanup Calls
* Timeout:: Call With Timeout
* Trees:: Updatable Binary Trees
* UGraphs:: Unweighted Graphs
@ -7101,7 +7103,7 @@ ordered sets will not necessarily result in an ordered set. Use
@findex ord_add_element/3
@syindex ord_add_element/3
@cnindex ord_add_element/3
Insering @var{Element} in @var{Set1} returns @var{Set2}. It should give
Inserting @var{Element} in @var{Set1} returns @var{Set2}. It should give
exactly the same result as @code{merge(Set1, [Element], Set2)}, but a
bit faster, and certainly more clearly. The same as @code{ord_insert/3}.
@ -7127,7 +7129,7 @@ Holds when @var{Element} is a member of @var{Set}.
@findex ord_insert/3
@syindex ord_insert/3
@cnindex ord_insert/3
Insering @var{Element} in @var{Set1} returns @var{Set2}. It should give
Inserting @var{Element} in @var{Set1} returns @var{Set2}. It should give
exactly the same result as @code{merge(Set1, [Element], Set2)}, but a
bit faster, and certainly more clearly. The same as @code{ord_add_element/3}.
@ -7226,7 +7228,7 @@ to obtain a floating point number uniformly distributed between 0 and 1.
@findex ranstart/0
@snindex ranstart/0
@cnindex ranstart/0
Initialise the random number generator using a built-in seed. The
Initialize the random number generator using a built-in seed. The
@code{ranstart/0} built-in is always called by the system when loading
the package.
@ -7234,7 +7236,7 @@ the package.
@findex ranstart/1
@snindex ranstart/1
@cnindex ranstart/1
Initialise the random number generator with user-defined @var{Seed}. The
Initialize the random number generator with user-defined @var{Seed}. The
same @var{Seed} always produces the same sequence of numbers.
@item ranunif(+@var{Range},-@var{I})
@ -7593,7 +7595,7 @@ will fail if @var{Key} is not present.
@findex splay_init/3
@snindex splay_init/3
@cnindex splay_init/3
Initialise a new splay tree.
Initialize a new splay tree.
@item splay_insert(+@var{Key},?@var{Val},+@var{Tree},-@var{NewTree})
@findex splay_insert/4
@ -7773,7 +7775,7 @@ difference list of character codes @var{L-L0}.
@end table
@noindent
These builtins are initialised to belong to the module @code{charsio} in
These builtins are initialized to belong to the module @code{charsio} in
@code{init.yap}. Novel procedures for manipulating strings by explicitly
importing these built-ins.
@ -7869,7 +7871,7 @@ number is Operating System dependent.
@syindex file_property/2
@cnindex file_property/2
The atom @var{File} corresponds to an existing file, and @var{Property}
will be unified with a property of this file. The poperties are of the
will be unified with a property of this file. The properties are of the
form @code{type(@var{Type})}, which gives whether the file is a regular
file, a directory, a fifo file, or of unknown type;
@code{size(@var{Size})}, with gives the size for a file, and
@ -8087,7 +8089,7 @@ Wait until process @var{PID} terminates, and return its exits @var{Status}.
@end table
@node Terms, Timeout, System, Library
@node Terms, Cleanup, System, Library
@section Utilities On Terms
@cindex utilities on terms
@ -8170,11 +8172,61 @@ variable in @var{Term1}.
Succeed if the second argument @var{Var} is a variable and occurs in
term @var{Term}.
@end table
@node Cleanup, Timeout, Terms, Library
@section Call With registered Cleanup Calls
@cindex cleanup
@t{call_cleanup/1} and @t{call_cleanup/2} allow predicates to register
code for execution after the call is finished. This library is loaded
with the @code{use_module(library(cleanup))} command.
@table @code
@item call_cleanup(+@var{Goal})
@findex call_cleanup/1
@syindex call_cleanup/1
@cnindex call_cleanup/1
Execute goal @var{Goal} within a cleanup-context. Called predicates
might register cleanup Goals which are called right after the end of
the call to @var{Goal}. Cuts and exceptions inside Goal do not prevent the
execution of the cleanup calls. @t{call_cleanup} might be nested.
@item call_cleanup(+@var{Goal}, +@var{CleanUpGoal})
@findex call_cleanup/2
@syindex call_cleanup/2
@cnindex call_cleanup/2
This is similar to @t{call_cleanup/1} with an additional
@var{CleanUpGoal} which gets called after @var{Goal} is finished.
@item on_cleanup(+@var{CleanUpGoal})
@findex on_cleanup/1
@syindex on_cleanup/1
@cnindex on_cleanup/1
Any Predicate might registers a @var{CleanUpGoal}. The
@var{CleanUpGoal} is put onto the current cleanup context. All such
CleanUpGoals are executed in reverse order of their registration when
the surrounding cleanup-context ends. This call will throw an exception
if a predicate tries to register a @var{CleanUpGoal} outside of any
cleanup-context.
@item cleanup_all
@findex cleanup_all/0
@syindex cleanup_all/0
@cnindex cleanup_all/0
Calls all pending CleanUpGoals and resets the cleanup-system to an
initial state. Should only be used as one of the last calls in the
main program.
@end table
@node Timeout, Trees, Terms, Library
There are some private predicates which could be used in special
cases, such as manually setting up cleanup-contexts and registering
CleanUpGoals for other than the current cleanup-context.
Read the Source Luke.
@node Timeout, Trees, Cleanup, Library
@section Calls With Timeout
@cindex timeout
@ -8188,7 +8240,7 @@ available with the @code{use_module(library(timeout))} command.
@findex time_out/3
@syindex time_out/3
@cnindex time_out/3
Execute goal @var{Goal} with time limite @var{Timeout}, where
Execute goal @var{Goal} with time limited @var{Timeout}, where
@var{Timeout} is measured in milliseconds. If the goal succeeds, unify
@var{Result} with success. If the timer expires before the goal
terminates, unify @var{Result} with @t{timeout}.
@ -8275,9 +8327,9 @@ are represented in one of two ways:
pairs, where the pairs can be in any old order. This form is
convenient for input/output.
@item The S-representation of a graph is a list of (vertex-neighbours)
@item The S-representation of a graph is a list of (vertex-neighbors)
pairs, where the pairs are in standard order (as produced by keysort)
and the neighbours of each vertex are also in standard order (as
and the neighbors of each vertex are also in standard order (as
produced by sort). This form is convenient for many calculations.
@end itemize
@ -8439,7 +8491,7 @@ NL = [1,2,7,5]
@findex complement/2
@syindex complement/2
@cnindex complement/2
Unify @var{NewGraph} with the graph complementar to @var{Graph}.
Unify @var{NewGraph} with the graph complementary to @var{Graph}.
In the next example:
@example
?- complement([1-[3,5],2-[4],3-[],
@ -8462,7 +8514,7 @@ Compose the graphs @var{LeftGraph} and @var{RightGraph} to form @var{NewGraph}.
L = [1-[4],2-[1,2,4],3-[]]
@end example
@item top_sort(+@var{Graph}, +@var{Sort})
@item top_sort(+@var{Graph}, -@var{Sort})
@findex top_sort/2
@syindex top_sort/2
@cnindex top_sort/2
@ -8699,7 +8751,7 @@ variable. In the latter case, YAP discards previous values for the
attributes.
@item The built-in @code{get_atts/2} can be used to check the values of
an attribute associated with a variable.
@item The unification algorit mcalls the user-defined predicate
@item The unification algoritm calls the user-defined predicate
@t{verify_attributes/3} before trying to bind an attributed
variable. Unification will resume after this call.
@item The user-defined predicate
@ -9099,7 +9151,7 @@ manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted qto copy and distribute translations of this
Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that this permission notice may be stated in a
translation approved by the OFAI.
@ -11992,7 +12044,7 @@ internals, or to system debuggers.
@findex reset_op_counters/0
@snindex reset_op_counters/0
@cnindex reset_op_counters/0
Reinitialise all counters.
Reinitialize all counters.
@item show_op_counters(+@var{A})
@findex show_op_counters/1
@ -12005,7 +12057,7 @@ label must be an atom.
@findex show_ops_by_group/1
@snindex show_ops_by_group/1
@cnindex show_ops_by_group/1
Display the current value for the counters, organised by groups, using
Display the current value for the counters, organized by groups, using
label @var{A}. The label must be an atom.
@end table
@ -12734,7 +12786,7 @@ then allow one to construct functors, and to obtain their name and arity.
@end example
@noindent
Note that the functor is essencially a pair formed by an atom, and
Note that the functor is essentially a pair formed by an atom, and
arity.
@node Unifying Terms, Manipulating Strings, Manipulating Terms, C-Interface
@ -12771,7 +12823,7 @@ fails and generates an exception if @var{String} is not a valid string.
@findex YAP_BufferToAtomList (C-Interface function)
The C-interface also includes utility routines to do the reverse, that
is, to copy a from a buffer to a list of character codes or to a list of
character atomsr
character atoms
@example
YAP_Term YAP_BufferToString(char *@var{buf})
YAP_Term YAP_BufferToAtomList(char *@var{buf})
@ -12833,7 +12885,7 @@ streams. It is most useful if you are doing @code{fork()}.
@findex YAP_OpenStream (C-Interface function)
The next routine allows a currently open file to become a stream. The
routine receives as arguments a file descriptor, the true file name as a
string, an atom with the yser name, and a set of flags:
string, an atom with the user name, and a set of flags:
@example
void YAP_OpenStream(void *@var{FD}, char *@var{name}, YAP_Term @var{t}, int @var{flags})
@end example
@ -12998,7 +13050,7 @@ case exits with @code{YAP_cut_succeed} in order to cut any further
backtracking. If this is not the last solution then we save the value
for the next solution in the data structure and exit normally with 1
denoting success. Note also that in any of the two cases we use the
function @code{YAP_nify} to bind the argument of the call to the value
function @code{YAP_unify} to bind the argument of the call to the value
saved in @code{ n100_state->next_solution}.
@ -13110,7 +13162,7 @@ To actually use this library you must follow a five step process:
@enumerate
@item
You must initialise the YAP environment. A single function,
You must initialize the YAP environment. A single function,
@code{YAP_FastInit} asks for a contiguous chunk in your memory space, fills
it in with the data-base, and sets up YAP's stacks and
execution registers. You can use a saved space from a standard system by
@ -13155,7 +13207,7 @@ main(int argc, char *argv[]) @{
@end cartouche
@end example
The program first initialises YAP, calls the query for the
The program first initializes YAP, calls the query for the
first time and succeeds, and then backtracks twice. The first time
backtracking succeeds, the second it fails and exits.
@ -13201,7 +13253,7 @@ such term exists the function will return the empty list.
@item YapFastInit(@code{char *} @var{SavedState})
@findex YapFastInit/1
Initialise a copy of YAP from @var{SavedState}. The copy is
Initialize a copy of YAP from @var{SavedState}. The copy is
monolithic and currently must be loaded at the same address where it was
saved. @code{YapFastInit} is a simpler version of @code{YapInit}.
@ -13211,7 +13263,7 @@ saved. @code{YapFastInit} is a simpler version of @code{YapInit}.
@var{SchedulerLoop}, @code{int} @var{DelayedReleaseLoad}, @code{int}
@var{argc}, @code{char **} @var{argv})
@findex YapInit/9
Initialise YAP. In the future the arguments as a single @code{C}
Initialize YAP. In the future the arguments as a single @code{C}
structure.
If @var{SavedState} is not NULL, try to open and restore the file
@ -13270,12 +13322,12 @@ flags in the @code{flag} argument: @code{YAP_WRITE_QUOTED},
@item @code{void} YapInitConsult(@code{int} @var{mode}, @code{char *} @var{filename})
@findex YapInitConsult/2
Enter consult mode on file @var{filename}. This mode maintains a few
data-structures internally, for instanc to know whether a predicate
data-structures internally, for instance to know whether a predicate
before or not. It is still possible to execute goals in consult mode.
If @var{mode} is @code{TRUE} the file will be reconsulted, otherwise
just consulted. In practice, this function is most useful for
bootstraping Prolog, as otherwise one may call the Prolog predicate
bootstrapping Prolog, as otherwise one may call the Prolog predicate
@code{compile/1} or @code{consult/1} to do compilation.
Note that it is up to the user to open the file @var{filename}. The

View File

@ -28,6 +28,7 @@ PROGRAMS= $(srcdir)/apply_macros.yap \
$(srcdir)/atts.yap \
$(srcdir)/avl.yap \
$(srcdir)/charsio.yap \
$(srcdir)/cleanup.yap \
$(srcdir)/heaps.yap \
$(srcdir)/lists.yap \
$(srcdir)/logtalk.yap \

View File

@ -1,3 +1,33 @@
% cleanup.yap
% Copyright (C) 2002 by Christian Thaeter
%
% public interface:
%
% :- fragile name/arity.
% declares the predicate denoted by name/arity as fragile predicate.
% Whenever such a fragile predicate is used in a query it will be
% called through call_cleanup/1.
%
% call_cleanup(Goal).
% call_cleanup(Goal,CleanUpGoal).
% Goal will be called in a cleanup-context, where any registered
% CleanUpGoal inside of that context will be called when Goal is left,
% either by a fail, cut or exeption.
% It is possible to nest cleanup contexts.
%
% on_cleanup(CleanUpGoal).
% registers CleanUpGoal to the current cleanup context.
% CleanUpGoal's are executed in reverse order of their registration.
% throws an exception if called outside of any cleanup-context.
%
% cleanup_all.
% calls all pending CleanUpGoals and resets the cleanup-system to an initial state.
% should only be used as one of the last calls in the main program.
%
% hidden predicates:
% most private predicates could also be used in special cases, such as manually setting up cleanup-contexts.
% Read the Source.
:- module( cleanup, [
call_cleanup/2,
call_cleanup/1,
@ -5,33 +35,13 @@
cleanup_all/0
]).
/*
public interface:
call_cleanup(Goal).
call_cleanup(Goal,CleanUpGoal).
Goal will be called in a cleanup-context, where any registered
CleanUpGoal inside of that context will be called when Goal is left,
either by a fail, cut or exeption.
It is possible to nest cleanup contexts.
:- multifile user:goal_expansion/3.
on_cleanup(CleanUpGoal).
registers CleanUpGoal to the current cleanup context.
CleanUpGoal's are executed in reverse order of their registration.
throws an exception if called outside of any cleanup-context.
:- user_defined_directive(fragile(G), cleanup:cleanup_expansion(G)).
:- op(1150, fx,fragile).
cleanup_all.
calls all pending CleanUpGoals and resets the cleanup-system to an initial state.
should only be used as one of the last calls in the main program.
hidden predicates:
most private predicates could also be used in special cases, such as manually setting up cleanup-contexts.
Read the Source.
*/
:- meta_predicate
:- meta_predicate
call_cleanup(:,:),
call_cleanup(:),
on_cleanup(:),
@ -42,11 +52,13 @@ Read the Source.
:- initialization(init_cleanup).
init_cleanup :-
get_value('cleanup:level',[]),
set_value('cleanup:level',0).
bb_put(expansion_toggle,1),
\+ bb_get(cleanup_level,_),
bb_put(cleanup_level,0).
% TODO: would be nice to register cleanup_all into the
% toplevel to be called after each query is finished
init_cleanup.
% call goal G with a cleanup CL in a cleanup context
call_cleanup(G,CL) :-
needs_cleanup(L),
@ -70,15 +82,19 @@ call_cleanup(G) :-
% begin cleanup level
needs_cleanup(CL) :-
get_value('cleanup:level',L),
bb_get(cleanup_level,L),
CL is L + 1,
set_value('cleanup:level',CL).
bb_put(cleanup_level,CL).
cleanup_context(CL) :-
bb_get(cleanup_level,CL).
% leave cleanup level, call all registred cleanup predicates within
do_cleanup(CL) :-
CN is CL - 1,
set_value('cleanup:level',CN),
bb_put(cleanup_level,CN),
next_cleanup(CL).
next_cleanup(CL) :-
@ -88,19 +104,19 @@ next_cleanup(CL) :-
(call(G);true),
next_cleanup(CL).
% clean up all remaining stuff / reinitialize cleanup-module
cleanup_all :- do_cleanup(1).
cleanup_all :-
do_cleanup(1).
cleanup_all.
% register a cleanup predicate (normal reverse-order cleanup)
on_cleanup(G) :-
get_value('cleanup:level',L),
bb_get(cleanup_level,L),
on_cleanup(L,G).
on_cleanup(L,G) :-
L =< 0,
throw(no_cleanup_context(G)).
throw(error(instantiation_error,no_cleanup_context(G))).
on_cleanup(L,G) :-
callable(G),
recorda(cleanup:handle,(L,G),_).
@ -108,7 +124,7 @@ on_cleanup(L,G) :-
% register a cleanup predicate (reverse-reverse-order cleanup)
on_cleanupz(G) :-
get_value('cleanup:level',L),
bb_get(cleanup_level,L),
on_cleanupz(L,G).
on_cleanupz(L,G) :-
@ -118,3 +134,32 @@ on_cleanupz(L,G) :-
callable(G),
recordz(cleanup:handle,(L,G),_).
% helpers
cleanup_expansion(X) :-
var(X),!,throw(error(instantiation_error,fragile(X))).
cleanup_expansion((H,T)) :- cleanup_expansion(H),cleanup_expansion(T).
cleanup_expansion([H,T]) :- cleanup_expansion(H),cleanup_expansion(T).
cleanup_expansion(G/A) :-
atom(G),integer(A),!,
compose_var_goal(G/A,GG),
\+ clause(user:goal_expansion(GG,M,NG),_), % TODO: match body too
assert(( user:goal_expansion(GG,M,NG)
:- bb_get(expansion_toggle,1)
-> bb_put(expansion_toggle,0),
NG=call_cleanup(M:GG)
; bb_put(expansion_toggle,1),
NG=M:GG )).
cleanup_expansion(X) :-
!,throw(error(instantiation_error,fragile(X))).
compose_var_goal(G/A,NG) :-
arity_to_vars(A,L), NG =.. [G|L].
arity_to_vars(N,L) :-
arity_to_vars(N,[],L).
arity_to_vars(N,L1,L2) :-
N > 0,
NN is N-1,
LT = [L|L1],
arity_to_vars(NN,LT,L2).
arity_to_vars(0,L,L).