Run Goal on temporary loaded sources and discard the module and
loaded predicates after completion. This predicate performs the
following steps:
- If Module is unbound, create a unique identifier for it.
- Turn Module into a temporary module using set_module/1.
Note that this requires the module to be non-existent or
empty. If Module is specified, it should typically be set
to a unique value as obtained from e.g. uuid/1.
- Run Setup in the context of Module.
- If setup succeeded possible choice points are discarded
and Goal is started.
The logical result of this predicate is the same as
`(Setup@Module -> Goal@Module)`, i.e., both Setup and Goal are
resolved relative to the current module, but executed in the
context of Module. If Goal must be called in Module, use
call(Goal)
.
The module and all its predicates are destroyed after Goal
terminates, as defined by setup_call_cleanup/3.
Discussion This predicate is intended to load programs in an
isolated environment and reclaim all resources. This
unfortunately is incomplete:
- Running the code may leave side effects such as creating
records, flags, changing Prolog flags, etc. The system
has no provisions to track this.
- So called functors (name/arity pairs) are not yet subject
to garbage collection. Functors are both used to define
predicates and to create compound terms.
- See also
- - library(sandbox) determines whether unknown goals are safe
to call.
- - load_files/2 offers the option
sandboxed(true)
to load code
from unknown sources safely.