Table of Contents

_________________________________________________________________

Name

control - Procedures for control flow structures.

Synopsis

package require Tcl 8.2

package require control ?0.0?

control::control command option ?arg arg ...?

control::assert expr ?arg arg ...?

control::no-op ?arg arg ...?
_________________________________________________________________

Description

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

control::control command option ?arg arg ...? The control command is used as a configuration command for customizing the other public commands of the control package. The command argument names the command to be customized. The set of valid option and subsequent arguments are determined by the command being customized, and are documented with the command.

control::assert expr ?arg arg ...?
When disabled, the assert command behaves exactly like the no-op command.

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. % 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}
This capability is useful so that debugging efforts can be independently controlled module by module.

control::no-op ?arg arg ...?
The no-op command takes any number of arguments and does nothing. It returns an empty string.

See Also

expr, if, join, namespace, return, string

Keywords

control, flow, structure, no-op, assert


Table of Contents