ZetCode

Tcl uplevel Command

last modified April 3, 2025

The Tcl uplevel command evaluates a script in a different stack level. It's a powerful feature for controlling execution context. This command is essential for advanced Tcl programming techniques.

Basic Definition

The uplevel command executes a script in the variable context of a different stack level. It can access variables from higher stack frames.

Syntax: uplevel ?level? arg ?arg ...?. The level specifies which stack frame to use (default is 1). The args form the script to evaluate.

Simple uplevel Example

This demonstrates basic usage of uplevel to access variables from a higher stack level.

basic_uplevel.tcl
proc outer {} {
    set x 10
    inner
}

proc inner {} {
    uplevel {puts "x is $x"}
}

outer

The inner procedure uses uplevel to access the x variable from its caller's context. This prints "x is 10" when executed.

Modifying Variables with uplevel

uplevel can modify variables in the caller's context.

uplevel_modify.tcl
proc increment {} {
    uplevel {incr counter}
}

set counter 5
increment
puts "Counter is now $counter"

This example shows how uplevel can modify variables in the caller's scope. The increment procedure increases the counter variable from its caller's context.

Specifying Stack Levels

You can specify exactly which stack level to use with uplevel.

uplevel_levels.tcl
proc level1 {} {
    set x 100
    level2
}

proc level2 {} {
    set x 200
    level3
}

proc level3 {} {
    uplevel 1 {puts "Level1 x: $x"}
    uplevel 2 {puts "Level2 x: $x"}
}

level1

This demonstrates accessing different stack levels. The output shows values from different contexts: "Level1 x: 100" and "Level2 x: 200".

Creating Control Structures

uplevel is often used to create custom control structures.

uplevel_control.tcl
proc repeat {count script} {
    for {set i 0} {$i < $count} {incr i} {
        uplevel $script
    }
}

set x 0
repeat 3 {
    incr x
    puts "x is now $x"
}

This creates a repeat command that executes a script multiple times. The script runs in the caller's context, allowing it to modify variables.

Error Handling with uplevel

uplevel affects how errors propagate through the call stack.

uplevel_error.tcl
proc safe_eval {script} {
    if {[catch {uplevel $script} result]} {
        puts "Error: $result"
        return 0
    }
    return 1
}

safe_eval {error "Something went wrong"}
safe_eval {puts "This works fine"}

This shows how to handle errors when using uplevel. The catch command captures errors from the uplevel execution.

Combining uplevel with upvar

uplevel can be combined with upvar for more control.

uplevel_upvar.tcl
proc process_vars {} {
    upvar 1 a x
    uplevel 1 {
        set x [expr {$x * 2}]
        set y [expr {$x + 10}]
    }
    return $y
}

set a 5
set result [process_vars]
puts "a: $a, result: $result"

This combines upvar and uplevel to modify variables and create new ones in the caller's context. The output shows "a: 10, result: 20".

Best Practices

This tutorial covered the Tcl uplevel command with practical examples showing its usage in different scenarios.

Author

My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.

List all Tcl Tutorials.