From 0c29616bc23487a9ecd836a6fa33c949231ab2df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Manuel=20de=20Morais=20Santos=20Costa?= Date: Fri, 15 Jan 2010 16:21:29 +0000 Subject: [PATCH] =?UTF-8?q?SWI-compatible=20for=20initialization/2=C2=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/yap.tex | 17 +++++++++++++++ pl/consult.yap | 53 +++++++++++++++++++++++++++++++++++++++++++++++ pl/directives.yap | 3 +++ 3 files changed, 73 insertions(+) diff --git a/docs/yap.tex b/docs/yap.tex index 13483fb6c..4808f734b 100644 --- a/docs/yap.tex +++ b/docs/yap.tex @@ -1903,6 +1903,23 @@ other procedures. The compiler will execute goals @var{G} after consulting the current file. +@item initialization(+@var{Goal},+@var{When}) +@findex initialization/2 (directive) +@snindex initialization/2 (directive) +@cnindex initialization/2 (directive) +Similar to @code{initialization/1}, but allows for specifying when +@var{Goal} is executed while loading the program-text: + +@table @code +@item now + Execute @var{Goal} immediately. +@item after_load + Execute @var{Goal} after loading program-text. This is the same as initialization/1. +@item restore + Do not execute @var{Goal} while loading the program, but only when + restoring a state (not implemented yet). +@end table + @item library_directory(+@var{D}) @findex library_directory/1 @snindex library_directory/1 diff --git a/pl/consult.yap b/pl/consult.yap index 805bce585..23ed53377 100644 --- a/pl/consult.yap +++ b/pl/consult.yap @@ -302,6 +302,59 @@ use_module(M,F,Is) :- fail. '$initialization'(_). +'$initialization'(G,OPT) :- + ( + var(G) + -> + '$do_error'(instantiation_error,initialization(G,OPT)) + ; + number(G) + -> + '$do_error'(type_error(callable,G),initialization(G,OPT)) + ; + db_reference(G) + -> + '$do_error'(type_error(callable,G),initialization(G,OPT)) + ; + var(OPT) + -> + '$do_error'(instantiation_error,initialization(G,OPT)) + ; + atom(OPT) + -> + ( + OPT == now + -> + fail + ; + OPT == after_load + -> + fail + ; + OPT == restore + -> + fail + ; + '$do_error'(domain_error(initialization,OPT),initialization(OPT)) + ) + ; + '$do_error'(type_error(OPT),initialization(G,OPT)) + ). +'$initialization'(G,now) :- + ( '$notrace'(G) -> true ; format(user_error,':- ~w:~w failed.~n',[M,G]) ). +'$initialization'(G,after_load) :- + '$initialization'(G). +% ignore for now. +'$initialization'(G,restore). + +'$initialization'(G) :- + '$show_consult_level'(Level1), + % it will be done after we leave the current consult level. + Level is Level1-1, + recorda('$initialisation',do(Level,G),_), + fail. +'$initialization'(_). + '$exec_initialisation_goals' :- nb_setval('$initialization_goals',on), fail. diff --git a/pl/directives.yap b/pl/directives.yap index eb413776e..93a08c43b 100644 --- a/pl/directives.yap +++ b/pl/directives.yap @@ -38,6 +38,7 @@ '$directive'(if(_)). '$directive'(include(_)). '$directive'(initialization(_)). +'$directive'(initialization(_,_)). '$directive'(meta_predicate(_)). '$directive'(module(_,_)). '$directive'(module(_,_,_)). @@ -75,6 +76,8 @@ '$discontiguous'(D,M). '$exec_directive'(initialization(D), _, M) :- '$initialization'(M:D). +'$exec_directive'(initialization(D,OPT), _, M) :- + '$initialization'(M:D, OPT). '$exec_directive'(thread_initialization(D), _, M) :- '$thread_initialization'(M:D). '$exec_directive'(expects_dialect(D), _, _) :-