Tcl eval Command
last modified October 20, 2026
The Tcl eval command evaluates one or more Tcl scripts. It's a
powerful command that allows dynamic execution of Tcl code. The command
concatenates its arguments and evaluates the result as a Tcl script.
Basic Definition
The eval command takes one or more arguments, joins them together
with spaces, and evaluates the result as a Tcl script. It's useful for
constructing and executing commands dynamically.
Syntax: eval arg ?arg ...?. The arguments are concatenated and
evaluated as a Tcl script. The return value is the result of the evaluation.
Basic eval Usage
This example shows the simplest usage of eval to execute a command.
set cmd "puts" set arg "\"Hello, Tcl!\"" eval $cmd $arg
Here we construct a command dynamically by storing the command name and its
argument in variables. The eval command then executes the complete
command.
Evaluating Multiple Commands
eval can evaluate multiple commands at once when they're combined
into a single script.
set script {
set x 10
set y 20
expr {$x + $y}
}
set result [eval $script]
puts "The result is $result"
This example demonstrates how eval can execute a block of Tcl code
stored in a variable. The script sets two variables and returns their sum.
Building Commands Dynamically
eval is particularly useful when you need to build commands
dynamically based on runtime conditions.
proc calculate {operation args} {
set cmd "expr {[join $args $operation]}"
eval $cmd
}
set sum [calculate + 5 10 15]
puts "Sum: $sum"
This creates a flexible calculator procedure that builds an expression based on
the provided operation. The eval command executes the dynamically
constructed expression.
Handling Command Substitution
eval properly handles command substitution and variable expansion
when building commands.
set name "John" set age 30 set cmd "puts" set args [list "Name: $name, Age: $age"] eval $cmd $args
The variables are substituted when the string for the list element is built.
The list command keeps the message as a single list element, so
eval passes it to puts as one argument even though it
contains spaces.
Evaluating Lists as Commands
eval can evaluate a properly formatted list as a command with its
arguments.
set command [list puts "Hello from a list!"] eval $command set math [list expr 10 + 20 * 2] set result [eval $math] puts "Math result: $result"
Here we construct complete commands as lists and execute them with eval.
This technique is useful for building commands programmatically while maintaining
proper argument separation.
Handling Errors from eval
The script given to eval may fail, so it is good practice to use
error handling.
set userInput "expr {10 / 0}" ;# Dangerous input
try {
set result [eval $userInput]
puts "Result: $result"
} trap {ARITH DIVZERO} {msg} {
puts "Error: Division by zero"
} on error {msg} {
puts "Evaluation error: $msg"
}
This demonstrates error handling around eval. The try
command catches arithmetic errors and other evaluation problems that might occur.
Catching errors does not make eval safe: a script from an untrusted
source can still run any command, so such input belongs in a safe interpreter
created with interp create -safe.
Best Practices
- Safety: Always validate input before evaluation.
- Lists: Use lists to build commands for proper quoting.
- Error handling: Use try/catch for robust error handling.
- Alternatives: Prefer
{*}$listexpansion overevalto pass list elements as arguments. - Scope: Be aware of variable scope during evaluation.
This tutorial covered the Tcl eval command with practical
examples showing its usage in different scenarios.
Author
List all Tcl Tutorials.