[ Predicate Database and Compiler | Reference Manual | Alphabetic Index ]

compile_term(+Clauses, ++Options)

Compile specified clause or list of clauses, with the given options
Clauses
List of clauses and/or directives
Options
List of compiler options

Description

Compiles the specified clause, or list of clauses, similar to compilation from a file. If the clauses are for a predicate that was undefined so far, a new static predicate will be created. If the clauses are for an existing static predicate, the new clauses will replace the old definition of the predicate. If the clauses are for an existing dynamic predicate, the new clauses will be added to the exiting ones for the dynamic predicate.

If Clause is a list, the list elements are interpreted as consecutive clauses. Otherwise, Clause will be taken as a single clause. Each clause may be a fact or a rule.

As with source files, the list may also contain directives (:- xxx) but their handling is slightly different: include/1, if/1, elif/1, else/0, endif/0 and module directives are not allowed. Pragmas are interpreted. All others, as well as file queries (?- xxx) are called as goals.

This predicate works almost as if all the clauses in the list were written into a file and this file was then compiled using compile/1. Unlike in earlier releases, clause and goal expansion is performed, according to the default compiler options. General macro-expansion is not performed, since this is normally the responsibility of the parser. If required, it must be done explicitly via expand_macros/2.

The difference between compile_term/1 and assert/1 is that the predicates for which clauses are compiled are not necessarily dynamic with compile_term/1, unless explicitly declared as such. Therefore clauses compiled with compile_term/1 usually replace the existing ones for the same predicate, moreover their source form is not available. Therefore, it can be used instead of assert/1 if the properties of dynamic procedures are not required.

Unlike compiling a file, when an event occurs which is not just a warning, the following clauses are not compiled, the compilation is aborted.

See compile/2 for a description of compiler options and a exceptions.

Modes and Determinism

Modules

This predicate is sensitive to its module context (tool predicate, see @/2).

Exceptions

(4) instantiation fault
Clause is a partial list.
(5) type error
Clause is a list whose tail is neither nil nor a variable.
(82) trying to access a locked module
The module in which the clauses should be compiled is locked.
(94) trying to redefine an existing imported procedure
There is already am imported predicate of the same name.
(130) syntax error: illegal head
The head of a clause is not an atom or a compound term.
(131) syntax error: illegal goal
A subgoal in the body of a clause is not an atom, a compound term or a variable.
(134) procedure clauses are not consecutive
The clauses of a procedure are not consecutive.
(136) trying to redefine a built-in predicate
Trying to redefine a built-in predicate without having declared it.
(137) trying to redefine a procedure with another type
A procedure which was previously referenced as built-in or external is now defined as a regular one, or vice versa.
(143) compiled query failed
One of the clauses was a query and it failed.

Examples

Success:
   % several facts for different predicates
   ?- compile_term([p(a), p(b), q(1), r("abc")]).

   % a single clause
   ?- compile_term(p(X) :- q(X)).

   % two clauses for the same predicate
   ?- compile_term([p([]), (p([X|Xs]) :- writeln(X), p(Xs))]).

   % a declaration and two clauses
   ?- compile_term([(:- export p/1), p(a), p(b)]).


Error:

   compile_term([p|X]).          (Error 4).
   compile_term([a|b]).          (Error 5).
   compile_term([[a]]).          (Error 94).
   compile_term([(p :- write(a)), write(b)]).      (Error 94).
   compile_term("a").          (Error 130).
   compile_term(["a" :- b]).   (Error 130).
   compile_term([p(X) :- 1]).    (Error 131).
   compile_term([a, b, a]).      (Error 134).
   compile_term(!).              (Error 135).
   compile_term(:- var(a)).      (Error 143).

See Also

compile / 1, compile / 2, . / 2, compile_stream / 1, compile_term / 2, compile_term_annotated / 3, assert / 1, expand_macros / 2, set_flag / 2, pragma / 1