Drektz
Drektz

Reputation: 95

How to prevent tcl script from exiting?

I am running tclsh some.tcl and it exits after it hits eof. I want it not to exit and gives control to user for interaction. Note that we can do this by invoking shell and sourcing script but that doesn't solve my problem as it cannot be used in automation.

Upvotes: 2

Views: 755

Answers (1)

Donal Fellows
Donal Fellows

Reputation: 137767

If you can load the TclX package (old but still useful) then you can do:

package require Tclx; # Lower case at the end for historical reasons

# Your stuff here

commandloop

That's very much like how Tcl's own interactive command line works.


Otherwise, here's a scripted version that does most of what an interactive command session does:

if {![info exists tcl_prompt1]} {
    set tcl_prompt1 {puts -nonewline "% ";flush stdout}
}
if {![info exists tcl_prompt2]} {
    # Note that tclsh actually defaults to not printing anything for this prompt
    set tcl_prompt2 {puts -nonewline "> ";flush stdout}
}

set script ""
set prompt $tcl_prompt1
while {![eof stdin]} {
    eval $prompt;                        # Print the prompt by running its script
    if {[gets stdin line] >= 0} {
        append script $line "\n";        # The newline is important
        if {[info complete $script]} {   # Magic! Parse for syntactic completeness
            if {[catch $script msg]} {   # Evaluates the script and catches the result
                puts stderr $msg
            } elseif {$msg ne ""} {      # Don't print empty results
                puts stdout $msg
            }
            # Accumulate the next command
            set script ""
            set prompt $tcl_prompt1
        } else {
            # We have a continuation line
            set prompt $tcl_prompt2
        }
    }
}

Getting the remaining bits right (e.g., the interaction with the event loop when the Tk package is loaded) would require quite a bit more complexity...

Upvotes: 1

Related Questions