Improved handling of case where child is killed by a signal
[tcl-tlc.git] / scripts / expression.itcl
blob13ff11f0c7eb455531c1008e8d6629a0732e2a49
1 # vim: foldmarker=<<<,>>>
3 class tlc::Expression {
4 inherit tlc::Signal
6 constructor {accessvar args} {
7 upvar $accessvar scopevar
8 eval tlc::Signal::constructor scopevar
9 } {}
11 public {
12 variable panic 0
14 method set_expression {rawexpr}
15 method reassess {args}
16 method add_term {var_ref}
19 private {
20 variable expression {}
21 variable dominos
26 body tlc::Expression::constructor {accessvar args} { #<<<1
27 array set dominos {}
29 tlc::Domino #auto dominos(need_reassess) -name "$name need_reassess"
30 $dominos(need_reassess) attach_output [code $this reassess]
32 eval configure $args
36 body tlc::Expression::set_expression {rawexpr} { #<<<1
37 set map {
38 [ \\[
39 ] \\]
40 $ \\$
41 %[ {\[code [list $this] }
42 %] {\]}
43 %< {\[set [list [scope }
44 %> {]]\]}
45 %( {[list [scope }
46 %) {]]}
48 set expression [string map $map $rawexpr]
49 debug trivia "processed first stage expression: ($expression)"
50 set expression [uplevel [list subst $expression]]
51 debug trivia "processed second stage expression: ($expression)"
52 reassess
56 body tlc::Expression::reassess {args} { #<<<1
57 if {[catch {
58 set_state [expr $expression]
59 debug debug "Reassessing ($name) == [state]\n$expression\n----------------\n[subst $expression]"
60 }]} {
61 debug debug "Error assessing expression ($name): ($::errorInfo)"
62 set_state 0
63 error "Error assessing expression ($name): ($::errorInfo)"
68 body tlc::Expression::add_term {var_ref} { #<<<1
69 tlc::Vardomino #auto dominos($var_ref) -name "$name term $var_ref" \
70 -textvariable $var_ref
71 $dominos(need_reassess) attach_input $dominos($var_ref)