+ All Categories
Home > Documents > Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk...

Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk...

Date post: 12-Mar-2018
Category:
Upload: duonghuong
View: 226 times
Download: 3 times
Share this document with a friend
59
Tcl/Tk Tutorial January 23, 1996 1 Tcl/Tk Advanced Tutorial Stephen Uhler Brent Welch Sun Microsystems Laboratories (Tcl) http://www.sunlabs.com/research/tcl
Transcript
Page 1: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 1

Tcl/Tk Advanced Tutorial

Stephen UhlerBrent Welch

Sun Microsystems Laboratories

(Tcl)

http://www.sunlabs.com/research/tcl

Page 2: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 2

The Tcl Parser

z Grouping before substitutionz Lists and command structurez Why use eval?z eval concatenates its arguments

z $args and eval

Page 3: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 3

Grouping Before Substitution

z Substituted values don’t affect the parseone two three four ;# 4 words

{one two} {three four} ;# 2 words

set x "\$x y \[exit]" ;# 3 words

puts $x ;# 2 words

set ab"d ef" ;# 3 words

set file [pwd]/${ab”d} ;# 3 words

=> /usr/brent/ef”

Page 4: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 4

Weird Values are OK

set pat \[a-z]\$

regexp $pat [gets stdin]

proc Pat {chars} {

return \[$chars\]

}

regexp [Pat a-z] [gets stdin]

Page 5: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 5

Tcl Data Structures

z Strings» format scan» regexp regsub» split join append

z Lists» [info commands l*]

z Arrays» array

Page 6: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 6

Tcl Lists

z All strings are not valid Tcl lists» Same syntax rules as Tcl commands

z Do not treat arbitrary input as lists» Use regexp, scan, or split

z Get help building lists» list : builds list out of arguments» lappend : adds to the end of a list

Page 7: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 7

Why Use list ?

z Capture command in valid list structure» Safe button , after , send commands

set string "Hello, World!"

button .foo -command [list puts $string]

after 500 [list puts $string]

send logger [list Log $string]

» Compare with doing it yourselfbutton .foo -command "puts \"$string\""

Page 8: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 8

When Not to use Lists

z Lists can be slow to access» String representation is reparsed each time

z Use arrays, which have constant cost» If order matters, use two arrays

incr i

set array($key) $value

set order($i) $key

Page 9: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 9

Arrays

z Use to simulate other data structuresz Complex indices ok, variables can help

set tree(left,$x) $y

z Copy subsets with array set/getarray set sub [array get whole a,*]

z Iteration - just use foreachforeach x [array names whole a,*] { }

Page 10: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 10

Why Use eval ?

z eval causes a second round of parsing» Save commands and execute them later:

hooks and callbacks

z eval concatenates its arguments» Splices multiple lists into one command» eval often works well with $args

Page 11: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 11

Hooks and Callbacks

proc HtmlIterate {hook} {

global html

foreach htag $html(tags) {

eval $hook {$htag}

}

}

HtmlIterate [list puts $output]

=> puts $output {<a href=“...”>}

Number of parses2 1

Page 12: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 12

eval uses concat to join lists

set hook [list puts $output]

concat $hook {$htag}

=> puts $output $htag

set points “0 0 10 10 10 20 20 20 30 15”

eval {$canvas create polygon} $points

eval exec rm [glob *.o]

List

Page 13: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 13

eval and $args

z args is a list of extra arguments» The concat by eval passes $args throughproc MyButton {name t cmd args} {

eval {button $name -text $t} \

{-command $cmd} $args

pack $name -side left

}

Page 14: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 14

MyButton Examples

MyButton .foo "Foo" {puts foo}

=> button .foo -text "Foo" \

-command {puts foo}

MyButton .foo "Foo" {puts foo} -fg blue

=> button .foo -text "Foo" \

-command {puts foo} -fg blue

Page 15: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 15

Substitution without eval

z subst just does substitutionssubst puts $file $string

=> puts file4 Hello, World

z subst does not honor curly bracessubst puts $file {$string}

=> puts file4 {Hello, World}

z Use backslash to quote $,\ and [

Page 16: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 16

Quirks in expr

z expr does its own substitutionsexpr {$x + [llength $y]}

z expr converts strings to numbers firstexpr {"0xa" == "10"}

z May convert back to string, but uses %dexpr {"0xa" > "0xbx"}

=> "10" > "0xbx" => true!

Page 17: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 17

Trapping Errors

if [catch {open $file w} out] {

puts stderr $out

} else {

puts $out ...

close $out

}

Error result

Normal result

Page 18: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 18

A longer catch Phrase

if [catch {

cmd1 ; cmd2 ; cmd3 ...

} result] {

global errorInfo

# print stack trace, including $result

puts stderr "*Trace*\n$errorInfo"

} else {

# $result has normal result

}

Page 19: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 19

Extending catch

z Alternate return codesreturn -code value

value: return break continue integer

z Multiway catch phrasesswitch [catch { command} result] {

3: { # if return -code break }

4: { # if return -code continue }

5: { # if return -code 5 }

}

Page 20: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 20

Using Upvar

z Passing arrays to proceduresz Static procedure variables

z Local aliases

Page 21: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 21

Passing Arrays to Procedures

z Call-by-nameproc fruit {objectName} {

upvar $objectName obj

return $obj(fruit)

}

set object7(fruit) orange

fruit object7

=> orange

Page 22: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 22

Upvar:Static Procedure Variables

z Share state among package proceduresz Keep state “hidden” from package userproc my_proc {handle args} {

upvar #0 my$handle local

set local(something) ...

}

Page 23: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 23

Upvar: Local Aliases

z Use to avoid awkward indirect references°set result $$var (Wron g!)±set result [set $var] (Awkward )²upvar 0 $var alias

set result $alias

Page 24: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 24

Tcl is a Dynamic Language

z Define code at runtime» Map data into code that processes it

parse_html converts HTML to a Tcl program

» Rewrite procedure bodies for tracing

» Compute “hardwired” search procedures

Page 25: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 25

Tcl Regular Expressions

z Regular expressions - a reviewz Constructing regular expressionsz Using regexp

z Using regsub

Page 26: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 26

Regexp - Special Characters

* zero or more

+ one or more

? zero or one

. any character

^ beginning of string

$ end of string

| alternation

() grouping and sub-variable matching

[] Character classes

» - range indicator

» ^ negation operator

\ turns off special meaning

Page 27: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 27

Constructing Regular Expressions - the problem

z The regular expression parser and Tcl both use the same “special” characters

z The special characters have different meanings depending on the context

z Keeping track of who interprets which special character when can be confusing

Page 28: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 28

Using Regexp and Regsub

z Regexp» Searching for patterns

» Parsing structured text with submatchvar

z Regsub» String substitution» counting matches

» Converting structured text to Tcl programs

Page 29: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 29

Constructing Regular Expressions - Strategies

z {}» Use when no Tcl substitutions are required

z " "» Use sparingly for simple expressions

z format» Use when few Tcl substitutions are needed

z append» Use to build complex expressions

Page 30: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 30

Constructing Expressions

Eliminating redundant white spacez regsub -all expression $text { } new

» {[\t\n\r ]+} Wrong!» "[\t\n\r ]+" Wrong!» "\[\t\n\r ]+"

» [format {[%s]+} "\t\n\r "]

» append exp {[} "\t\n\r " {]}

Page 31: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 31

Regexp Example

z Parsing URLSset pat ^(\[^:]+): ;# Protocol

append pat //(\[^:/]+) ;# Server

append pat (:(\[0-9]+))? ;# Port

append pat (/.*\$) ;# Path

regexp $pat $url match \

proto server x port path

Page 32: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 32

Counting with Regsub

z Example - count words in $textset word "0-9a-zA-Z"

1 append exp {[} ^$word {]*[} $word {]+}

2 set exp [format {[^%1$s]*[%1$s]+} $word]

3 set exp "\[^$word\]*\[$word\]+"

set count [regsub -all $exp $text {} x]

Page 33: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 33

Converting Text to Tcl:Tcl un-cgi script

z Convert a=b&c=d... to {a} {b} {c} {d} ...

proc cgiDecode {data} {foreach i [split $data "&="] {

lappend result [cgiMap $i]}return $result

}

Page 34: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 34

Converting Text to Tcl:Tcl un-cgi script

z Convert "+" to " "

z Convert %xx to equivalent characterproc cgiMap {data} {

regsub -all {\+} $data " " dataregsub -all {[[$\\]} $data {\\&} data regsub -all {%([0-9a-zA-Z][0-9a-zA-Z])}\

$data {[format %c 0x\1]} datareturn [subst $data]

}

Page 35: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 35

Un-cgi Script in Action

z Sample Input textage=%3e+25&name=Stephen+A%2e+Uhler

z Split into a list{age} {%3e +25} {name} {Stephen +A%2e+Uhler}

z Convert "+" to " "{age} { %3e 25} {name} {Stephen A %2e Uhler}

Page 36: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 36

Un-cgi Script in Action

z Convert %xx to format command{age} { [format %c 0x3e] 25} {name}

{Stephen A [format %c 0x2e] Uhler}

z Use "subst" for the final result{age} {> 25} {name} {Stephen A. Uhler}

Page 37: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 37

Complete Tcl HTML Parser

proc htmlParse {html cmd start} {regsub -all \{ $html {\&ob;} htmlregsub -all \} $html {\&cb;} htmlregsub -all \\ $html {\&bsl;} htmlset ws " \t\r\n"append exp {<(/?)([^} $ws {>]+)[}append exp $ws {]*([^>]*)>set sub "\}\n$cmd {\\2} {\\1} {\\3} \{"regsub -all $exp $html $sub htmleval "$cmd $start {} {} \{ $html \}"

}

Page 38: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 38

HTML Parser at Work

z Sample HTML document<title>Tcl/Tk Project AtSun Microsystems Laboratories&copy;

{really!}</title><img src="images/tcltk.gif"><br><h1>The Tcl/Tk Project</h1>

Page 39: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 39

HTML Parser at Work

z Hide Tcl special characters<title>Tcl/Tk Project AtSun Microsystems Laboratories&copy;

&ob; really! &cb; </title><img src="images/tcltk.gif"><br><h1>The Tcl/Tk Project</h1>

Page 40: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 40

HTML Parser at Work

z After Command Substitutions}command {title} {} {} { Tcl/Tk Project AtSun Microsystems Laboratories&copy;

&ob;really!&cb; }command {title} {/} {} {}command {img} {} {src="images/tcltk.gif"}

{}command {br} {} {} {}command {h1} {} {} { The Tcl/Tk Project }command {h1} {/} {} {

Page 41: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 41

HTML Parser at Work

z Command sent to evalcommand {start} {} {} { }command {title} {} {} {Tcl/Tk Project AtSun Microsystems Laboratories&copy;

&ob;really!&cb;}command {title} {/} {} {}command {img} {} {src="images/tcltk.gif"} {}command {br} {} {} {}command {h1} {} {} {The Tcl/Tk Project}command {h1} {/} {} {}

Page 42: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 42

Interprocess Communication

z With exec command

» Blocks until commandcompletes

» Returns standard output of command

» Use only for short lived processes

z With exec command &

» Returns immediately with process id (pid)» Poll for completion using “exec kill -0 $pid”

» Use “send” to receive status

Page 43: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 43

Polling for Completion

proc watch {command callback {int 1000} {pid 0}} {

if {$pid == 0} {

set pid [eval exec $command &]

} elseif {[catch {exec csh -c "kill -0 $pid"}]} {

eval $callback

return

}

after $int \

[list watch $command $callback $int $pid]

return $pid

}

Page 44: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 44

Using Pipelines

z Starting the commandset fd [open "| command" w+]

z gets/puts handshaking» command must flush each line

puts $fd $stuff

flush $fd

gets $fd result

Page 45: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 45

Using Pipelines - fileevent

proc watch {command callback} {set fd [open " | $command"]fileevent $fd readable \

[list run_callback $fd $callback]return [pid $fd]

}

proc run_callback {fd callback args} {if {[gets $fd dummy] == -1} {

catch {close $fd}eval $callback

}}

Page 46: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 46

Tk Send Command

z Registry of Tk applicationswinfo interps

z Passing your name to a subprocessexec foobar [tk appname] &

z List warning: internal concat like evalsend $interp [list doit $arg1 $arg2]

Page 47: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 47

Tcl Introspection

z Rewriting Proceduresz Interactive command evaluation

z Looking at the execution stack

Page 48: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 48

Rewriting Tcl Procedures

proc rewrite {proc redo} {set args {}foreach arg [info args $proc] {

if {[info default $proc $arg default]} {lappend args [list $arg $default]

} else {lappend args $arg

}}proc $proc $args [$redo [info body $proc]]

}

Page 49: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 49

Read-Print-Eval Loop

proc get_command {{prompt "% "}} {

puts -nonewline $prompt

gets stdin line

while {![info command complete $line] {

puts -nonewline "? "

append line "\n[gets stdin]"

}

return $line

}

Page 50: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 50

Simple Debuggerproc breakpoint {show} {

set top [expr [info level] -1]set current $topwhile {1} {

set line [get_command #$current]switch -- $line {

+ {if $current < $top} {$show [incr current]}- {if $current > 0} {$show [incr current -1]}? {$show $current}C {return}default {

catch {uplevel #$current $line} resultputs stderr $result

}}

}}

Page 51: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 51

Print Stack Information

proc show {level} {if {$level > 0} {

set info [info level $level]set proc [lindex $info 0]set i 0puts stderr "$level: $proc"

foreach arg [info args $proc] {puts stderr "\t$arg = [lindex $info [incr i]]

}show [incr level -1]

} else {puts stderr "Top Level"

}}

Page 52: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 52

Managing Large Tcl Programs

z One module per filez Auto load modules via tclIndex

z Module prefix for proc namesz Global arrays for module state

» Use upvar #0 trick for instance data

Page 53: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 53

Extending Tcl/Tk

z Dynamic Loadingz Six ways to extend Tcl/Tkz "C" Calling conventions

z Tricks » Bypassing the parser with

Tcl_Invoke

» Faking new widget sub-commands

Page 54: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 54

Dynamic Loading

z Create new functionality in Cz Generate a shared libraryz Incorporate into “wish” with load

» load ./libfoo.so Foo

z No need for custom “wish”

Page 55: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 55

Six Ways to Extend Tcl

z New Tcl commandsz New Tk widgets

z New expr math functionsz New photo image handlersz New image types

z New canvas items

Page 56: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 56

"C" Calling Conventions

z Module Initialization#include <tcl.h>

static int newCmd _ANSI_ARGS_((ClientData clientData,Tcl_Interp *interp, int argc, char **argv));

intNew_Init(interp)

Tcl_Interp *interp;{

Tcl_CreateCommand(interp, "new", newCmd,(ClientData) 0,(Tcl_CmdDeleteProc *) NULL);

return TCL_OK;}

Page 57: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 57

"C" Calling Conventions

z Command Procedurestatic intnewCmd(data, interp, argc, argv)

ClientData data;Tcl_Interp *interp;int argc;char **argv;

{/* put command behavior here */Tcl_SetResult(interp,"The result", TCL_STATIC);return(TCL_OK);

}

Page 58: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 58

Bypassing the Parser

z Calling Command Procedures Directly

Tcl_CmdInfo info;

char *cmd;

Tcl_ResetResult(interp);

Tcl_GetCommandInfo(interp, cmd, &info)

return (*info.proc)(info.clientData, interp,

argc, argv);

Page 59: Tcl/Tk Advanced Tutorial - sau.homeip.netsau.homeip.net/presentations/tcl-tut.pdf · Tcl/Tk Tutorial January 23, 1996 2 The Tcl Parser z Grouping before substitution z Lists and command

Tcl/Tk Tutorial January 23, 1996 59

Faking sub-widget commands

z Extracting text widget dataTkText *GetTextData(Tcl_Interp *interp, char *widget)

Tcl_CmdInfo info;Tcl_GetCommandInfo(interp, widget, &info);Tcl_VarEval(interp, "winfo class ", widget,

NULL);if (strcmp(interp->result, "Text") == 0) {

return (TkText *)info.clientData;} else {

return NULL;}

}


Recommended