fork download
  1. proc get_location {} {
  2. set caller_framelevel [expr [info frame] - 1]
  3. set up [expr $caller_framelevel - 1]
  4. set fr [expr $caller_framelevel - 0]
  5. set location "[uplevel $up {info script}]:[dict get [info frame $fr] line]"
  6. return $location
  7. }
  8.  
  9. proc p1 {} {
  10. puts [get_location]
  11. }
  12.  
  13. puts [get_location]
  14.  
  15. if {true} {
  16. puts [get_location]
  17.  
  18. if {1} {
  19. puts [get_location]
  20. }
  21. }
  22.  
  23. proc p2 {} {
  24. p1
  25. }
  26.  
  27. proc p3 {} {
  28. eval "p1"
  29. }
  30.  
  31. proc p4 {} {
  32. uplevel 1 {p1}
  33. }
  34.  
  35. proc try {procname} {
  36. puts "== $procname =="
  37. catch {eval $procname} err
  38. if {$err!=""} {puts "$err\n"}
  39. }
  40.  
  41. try p1
  42. try p2
  43. try p3
  44. try p4
  45.  
Success #stdin #stdout 0s 15768KB
stdin
Standard input is empty
stdout
prog:13
prog:16
prog:19
== p1 ==
prog:10
== p2 ==
prog:10
== p3 ==
bad level "5"

== p4 ==
bad level "5"