upvar.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1993 The Regents of the University of California.
  3. '" Copyright (c) 1994-1997 Sun Microsystems, Inc.
  4. '"
  5. '" See the file "license.terms" for information on usage and redistribution
  6. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  7. '" 
  8. '" RCS: @(#) $Id: upvar.n,v 1.5.18.2 2004/11/12 09:02:30 das Exp $
  9. '" 
  10. .so man.macros
  11. .TH upvar n "" Tcl "Tcl Built-In Commands"
  12. .BS
  13. '" Note:  do not modify the .SH NAME line immediately below!
  14. .SH NAME
  15. upvar - Create link to variable in a different stack frame
  16. .SH SYNOPSIS
  17. fBupvar fR?fIlevelfR? fIotherVar myVar fR?fIotherVar myVar fR...?
  18. .BE
  19. .SH DESCRIPTION
  20. .PP
  21. This command arranges for one or more local variables in the current
  22. procedure to refer to variables in an enclosing procedure call or
  23. to global variables.
  24. fILevelfR may have any of the forms permitted for the fBuplevelfR
  25. command, and may be omitted if the first letter of the first fIotherVarfR
  26. isn't fB#fR or a digit (it defaults to fB1fR).
  27. For each fIotherVarfR argument, fBupvarfR makes the variable
  28. by that name in the procedure frame given by fIlevelfR (or at
  29. global level, if fIlevelfR is fB#0fR) accessible
  30. in the current procedure by the name given in the corresponding
  31. fImyVarfR argument.
  32. The variable named by fIotherVarfR need not exist at the time of the
  33. call;  it will be created the first time fImyVarfR is referenced, just like
  34. an ordinary variable.  There must not exist a variable by the
  35. name fImyVarfR at the time fBupvarfR is invoked.
  36. fIMyVarfR is always treated as the name of a variable, not an
  37. array element.  Even if the name looks like an array element,
  38. such as fBa(b)fR, a regular variable is created.
  39. fIOtherVarfR may refer to a scalar variable, an array,
  40. or an array element.
  41. fBUpvarfR returns an empty string.
  42. .PP
  43. The fBupvarfR command simplifies the implementation of call-by-name
  44. procedure calling and also makes it easier to build new control constructs
  45. as Tcl procedures.
  46. For example, consider the following procedure:
  47. .CS
  48. proc add2 name {
  49.    fBupvarfR $name x
  50.    set x [expr $x+2]
  51. }
  52. .CE
  53. fBadd2fR is invoked with an argument giving the name of a variable,
  54. and it adds two to the value of that variable.
  55. Although fBadd2fR could have been implemented using fBuplevelfR
  56. instead of fBupvarfR, fBupvarfR makes it simpler for fBadd2fR
  57. to access the variable in the caller's procedure frame.
  58. .PP
  59. fBnamespace evalfR is another way (besides procedure calls)
  60. that the Tcl naming context can change.
  61. It adds a call frame to the stack to represent the namespace context.
  62. This means each fBnamespace evalfR command
  63. counts as another call level for fBuplevelfR and fBupvarfR commands.
  64. For example, fBinfo level 1fR will return a list
  65. describing a command that is either
  66. the outermost procedure call or the outermost fBnamespace evalfR command.
  67. Also, fBuplevel #0fR evaluates a script
  68. at top-level in the outermost namespace (the global namespace).
  69. .PP
  70. .VS
  71. If an upvar variable is unset (e.g. fBxfR in fBadd2fR above), the
  72. fBunsetfR operation affects the variable it is linked to, not the
  73. upvar variable.  There is no way to unset an upvar variable except
  74. by exiting the procedure in which it is defined.  However, it is
  75. possible to retarget an upvar variable by executing another fBupvarfR
  76. command.
  77. .SH "TRACES AND UPVAR"
  78. .PP
  79. Upvar interacts with traces in a straightforward but possibly
  80. unexpected manner.  If a variable trace is defined on fIotherVarfR, that
  81. trace will be triggered by actions involving fImyVarfR.  However,
  82. the trace procedure will be passed the name of fImyVarfR, rather
  83. than the name of fIotherVarfR.  Thus, the output of the following code
  84. will be fBlocalVarfR rather than fBoriginalVarfR:
  85. .CS
  86. proc fBtraceprocfR { name index op } {
  87.    puts $name
  88. }
  89. proc fBsetByUpvarfR { name value } {
  90.    fBupvarfR $name localVar
  91.    set localVar $value
  92. }
  93. set originalVar 1
  94. trace variable originalVar w fBtraceprocfR
  95. fBsetByUpvarfR originalVar 2
  96. }
  97. .CE
  98. .PP
  99. If fIotherVarfR refers to an element of an array, then variable
  100. traces set for the entire array will not be invoked when fImyVarfR
  101. is accessed (but traces on the particular element will still be
  102. invoked).  In particular, if the array is fBenvfR, then changes
  103. made to fImyVarfR will not be passed to subprocesses correctly.
  104. .VE
  105. .SH EXAMPLE
  106. A fBdecrfR command that works like fBincrfR except it subtracts
  107. the value from the variable instead of adding it:
  108. .CS
  109. proc decr {varName {decrement 1}} {
  110.     fBupvarfR 1 $varName var
  111.     incr var [expr {-$decrement}]
  112. }
  113. .CE
  114. .SH "SEE ALSO"
  115. global(n), namespace(n), uplevel(n), variable(n)
  116. .SH KEYWORDS
  117. context, frame, global, level, namespace, procedure, variable