control - Procedures for control flow structures.
SYNOPSIS
package require Tcl 8.2
package require control ?0.1?
|
The control package provides a variety of commands that provide
additional flow of control structures beyond the built-in ones
provided by Tcl. These are commands that in many programming
languages might be considered keywords, or a part of the
language itself. In Tcl, control flow structures are just commands
like everything else.
COMMANDS
When enabled, the assert command evaluates expr as an
expression (in the same way that expr evaluates its argument).
If evaluation reveals that expr is not a valid boolean
expression (according to [string is boolean -strict]),
an error is raised. If expr evaluates to a true boolean value
(as recognized by if), then assert returns an empty
string. Otherwise, the remaining arguments to assert are used
to construct a message string. If there are no arguments, the message
string is "assertion failed: $expr". If there are arguments, they are
joined by join to form the message string. The message string
is then appended as an argument to a callback command, and the
completed callback command is evaluated in the global namespace.
The assert command can be customized by the control
command in two ways:
[control::control assert enabled ?boolean?]
queries or sets whether control::assert is enabled. When called
without a boolean argument, a boolean value is returned
indicating whether the control::assert command is enabled. When
called with a valid boolean value as the boolean argument, the
control::assert command is enabled or disabled to match the
argument, and an empty string is returned.
[control::control assert callback ?command?]
queries or sets the callback command that will be called by an enabled
assert on assertion failure. When called without a
command argument, the current callback command is returned.
When called with a command argument, that argument becomes the
new assertion failure callback command. Note that an assertion
failure callback command is always defined, even when assert
is disabled. The default callback command is
[return -code error].
Note that control::assert has been written so that in
combination with [namespace import], it is possible to
use enabled assert commands in some namespaces and disabled
assert commands in other namespaces at the same time. This
capability is useful so that debugging efforts can be independently
controlled module by module.
% package require control
% control::control assert enabled 1
% namespace eval one namespace import ::control::assert
% control::control assert enabled 0
% namespace eval two namespace import ::control::assert
% one::assert {1 == 0}
assertion failed: 1 == 0
% two::assert {1 == 0}
% package require control % proc a {} {while 1 {return -code error a}} % proc b {} {control::do {return -code error b} while 1} % catch a 1 % catch b 0 |