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

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1993-1997 Bell Labs Innovations for Lucent Technologies
  3. '" Copyright (c) 1997 Sun Microsystems, Inc.
  4. '" Copyright (c) 2000 Scriptics Corporation.
  5. '"
  6. '" See the file "license.terms" for information on usage and redistribution
  7. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  8. '" 
  9. '" RCS: @(#) $Id: namespace.n,v 1.9.2.2 2005/05/12 16:23:11 dgp Exp $
  10. '" 
  11. .so man.macros
  12. .TH namespace n 8.0 Tcl "Tcl Built-In Commands"
  13. .BS
  14. '" Note:  do not modify the .SH NAME line immediately below!
  15. .SH NAME
  16. namespace - create and manipulate contexts for commands and variables
  17. .SH SYNOPSIS
  18. fBnamespace fR?fIoptionfR? ?fIarg ...fR?
  19. .BE
  20. .SH DESCRIPTION
  21. .PP
  22. The fBnamespacefR command lets you create, access, and destroy
  23. separate contexts for commands and variables.
  24. See the section fBWHAT IS A NAMESPACE?fR below
  25. for a brief overview of namespaces.
  26. The legal values of fIoptionfR are listed below.
  27. Note that you can abbreviate the fIoptionfRs.
  28. .TP
  29. fBnamespace children fR?fInamespacefR? ?fIpatternfR?
  30. Returns a list of all child namespaces that belong to the
  31. namespace fInamespacefR.
  32. If fInamespacefR is not specified,
  33. then the children are returned for the current namespace.
  34. This command returns fully-qualified names,
  35. which start with a double colon (fB::fR).
  36. If the optional fIpatternfR is given,
  37. then this command returns only the names that match the glob-style pattern.
  38. The actual pattern used is determined as follows:
  39. a pattern that starts with double colon (fB::fR) is used directly,
  40. otherwise the namespace fInamespacefR
  41. (or the fully-qualified name of the current namespace)
  42. is prepended onto the pattern.
  43. .TP
  44. fBnamespace code fIscriptfR
  45. Captures the current namespace context for later execution
  46. of the script fIscriptfR.
  47. It returns a new script in which fIscriptfR has been wrapped
  48. in a fBnamespace inscopefR command.
  49. The new script has two important properties.
  50. First, it can be evaluated in any namespace and will cause
  51. fIscriptfR to be evaluated in the current namespace
  52. (the one where the fBnamespace codefR command was invoked).
  53. Second, additional arguments can be appended to the resulting script
  54. and they will be passed to fIscriptfR as additional arguments.
  55. For example, suppose the command
  56. fBset script [namespace code {foo bar}]fR
  57. is invoked in namespace fB::a::bfR.
  58. Then fBeval "$script x y"fR
  59. can be executed in any namespace (assuming the value of
  60. fBscriptfR has been passed in properly)
  61. and will have the same effect as the command
  62. fB::namespace eval ::a::b {foo bar x y}fR.
  63. This command is needed because
  64. extensions like Tk normally execute callback scripts
  65. in the global namespace.
  66. A scoped command captures a command together with its namespace context
  67. in a way that allows it to be executed properly later.
  68. See the section fBSCOPED SCRIPTSfR for some examples
  69. of how this is used to create callback scripts.
  70. .TP
  71. fBnamespace currentfR
  72. Returns the fully-qualified name for the current namespace.
  73. The actual name of the global namespace is ``''
  74. (i.e., an empty string),
  75. but this command returns fB::fR for the global namespace
  76. as a convenience to programmers.
  77. .TP
  78. fBnamespace delete fR?fInamespace namespace ...fR?
  79. Each namespace fInamespacefR is deleted
  80. and all variables, procedures, and child namespaces
  81. contained in the namespace are deleted.
  82. If a procedure is currently executing inside the namespace,
  83. the namespace will be kept alive until the procedure returns;
  84. however, the namespace is marked to prevent other code from
  85. looking it up by name.
  86. If a namespace doesn't exist, this command returns an error.
  87. If no namespace names are given, this command does nothing.
  88. .TP
  89. fBnamespace evalfR fInamespace argfR ?fIarg ...fR?
  90. Activates a namespace called fInamespacefR and evaluates some code
  91. in that context.
  92. If the namespace does not already exist, it is created.
  93. If more than one fIargfR argument is specified,
  94. the arguments are concatenated together with a space between each one
  95. in the same fashion as the fBevalfR command,
  96. and the result is evaluated.
  97. .br
  98. .sp
  99. If fInamespacefR has leading namespace qualifiers
  100. and any leading namespaces do not exist,
  101. they are automatically created.
  102. .TP
  103. fBnamespace existsfR fInamespacefR
  104. Returns fB1fR if fInamespacefR is a valid namespace in the current
  105. context, returns fB0fR otherwise.
  106. .TP
  107. fBnamespace export fR?-fBclearfR? ?fIpattern pattern ...fR?
  108. Specifies which commands are exported from a namespace.
  109. The exported commands are those that can be later imported
  110. into another namespace using a fBnamespace importfR command.
  111. Both commands defined in a namespace and
  112. commands the namespace has previously imported
  113. can be exported by a namespace.
  114. The commands do not have to be defined
  115. at the time the fBnamespace exportfR command is executed.
  116. Each fIpatternfR may contain glob-style special characters,
  117. but it may not include any namespace qualifiers.
  118. That is, the pattern can only specify commands
  119. in the current (exporting) namespace.
  120. Each fIpatternfR is appended onto the namespace's list of export patterns.
  121. If the -fBclearfR flag is given,
  122. the namespace's export pattern list is reset to empty before any
  123. fIpatternfR arguments are appended.
  124. If no fIpatternfRs are given and the -fBclearfR flag isn't given,
  125. this command returns the namespace's current export list.
  126. .TP
  127. fBnamespace forget fR?fIpattern pattern ...fR?
  128. Removes previously imported commands from a namespace.
  129. Each fIpatternfR is a simple or qualified name such as
  130. fBxfR, fBfoo::xfR or fBa::b::p*fR.
  131. Qualified names contain double colons (fB::fR) and qualify a name
  132. with the name of one or more namespaces.
  133. Each fIqualified patternfR is qualified with the name of an
  134. exporting namespace 
  135. and may have glob-style special characters in the command name
  136. at the end of the qualified name.
  137. Glob characters may not appear in a namespace name.
  138. For each fIsimple patternfR this command deletes the matching
  139. commands of the 
  140. current namespace that were imported from a different namespace.
  141. For fIqualified patternsfR, this command first finds the matching
  142. exported commands. 
  143. It then checks whether any of those commands
  144. were previously imported by the current namespace.
  145. If so, this command deletes the corresponding imported commands. 
  146. In effect, this un-does the action of a fBnamespace importfR command.
  147. .TP
  148. fBnamespace import fR?fB-forcefR? ?fIpatternfR fIpattern ...fR?
  149. Imports commands into a namespace.
  150. Each fIpatternfR is a qualified name like
  151. fBfoo::xfR or fBa::p*fR.
  152. That is, it includes the name of an exporting namespace
  153. and may have glob-style special characters in the command name
  154. at the end of the qualified name.
  155. Glob characters may not appear in a namespace name.
  156. All the commands that match a fIpatternfR string
  157. and which are currently exported from their namespace
  158. are added to the current namespace.
  159. This is done by creating a new command in the current namespace
  160. that points to the exported command in its original namespace;
  161. when the new imported command is called, it invokes the exported command.
  162. This command normally returns an error
  163. if an imported command conflicts with an existing command.
  164. However, if the -fBforcefR option is given,
  165. imported commands will silently replace existing commands.
  166. The fBnamespace importfR command has snapshot semantics:
  167. that is, only requested commands that are currently defined
  168. in the exporting namespace are imported.
  169. In other words, you can import only the commands that are in a namespace
  170. at the time when the fBnamespace importfR command is executed.
  171. If another command is defined and exported in this namespace later on,
  172. it will not be imported.
  173. .TP
  174. fBnamespace inscopefR fInamespacefR fIscriptfR ?fIarg ...fR?
  175. Executes a script in the context of the specified fInamespacefR.
  176. This command is not expected to be used directly by programmers;
  177. calls to it are generated implicitly when applications
  178. use fBnamespace codefR commands to create callback scripts
  179. that the applications then register with, e.g., Tk widgets.
  180. The fBnamespace inscopefR command is much like the fBnamespace evalfR
  181. command except that the fInamespacefR must already exist,
  182. and fBnamespace inscopefR appends additional fIargfRs
  183. as proper list elements.
  184. .br
  185. fBnamespace inscope ::foo $script $x $y $zfR
  186. is equivalent to
  187. fBnamespace eval ::foo [concat $script [list $x $y $z]]fR
  188. thus additional arguments will not undergo a second round of substitution,
  189. as is the case with fBnamespace evalfR.
  190. .TP
  191. fBnamespace origin fIcommandfR
  192. Returns the fully-qualified name of the original command
  193. to which the imported command fIcommandfR refers.
  194. When a command is imported into a namespace,
  195. a new command is created in that namespace
  196. that points to the actual command in the exporting namespace.
  197. If a command is imported into a sequence of namespaces
  198. fIa, b,...,nfR where each successive namespace
  199. just imports the command from the previous namespace,
  200. this command returns the fully-qualified name of the original command
  201. in the first namespace, fIafR.
  202. If fIcommandfR does not refer to an imported command,
  203. the command's own fully-qualified name is returned.
  204. .TP
  205. fBnamespace parentfR ?fInamespacefR?
  206. Returns the fully-qualified name of the parent namespace
  207. for namespace fInamespacefR.
  208. If fInamespacefR is not specified,
  209. the fully-qualified name of the current namespace's parent is returned.
  210. .TP
  211. fBnamespace qualifiersfR fIstringfR
  212. Returns any leading namespace qualifiers for fIstringfR.
  213. Qualifiers are namespace names separated by double colons (fB::fR).
  214. For the fIstringfR fB::foo::bar::xfR,
  215. this command returns fB::foo::barfR,
  216. and for fB::fR it returns an empty string.
  217. This command is the complement of the fBnamespace tailfR command.
  218. Note that it does not check whether the
  219. namespace names are, in fact,
  220. the names of currently defined namespaces.
  221. .TP
  222. fBnamespace tailfR fIstringfR
  223. Returns the simple name at the end of a qualified string.
  224. Qualifiers are namespace names separated by double colons (fB::fR).
  225. For the fIstringfR fB::foo::bar::xfR,
  226. this command returns fBxfR,
  227. and for fB::fR it returns an empty string.
  228. This command is the complement of the fBnamespace qualifiersfR command.
  229. It does not check whether the namespace names are, in fact,
  230. the names of currently defined namespaces.
  231. .TP
  232. fBnamespace whichfR ?-fBcommandfR? ?-fBvariablefR? fInamefR
  233. Looks up fInamefR as either a command or variable
  234. and returns its fully-qualified name.
  235. For example, if fInamefR does not exist in the current namespace
  236. but does exist in the global namespace,
  237. this command returns a fully-qualified name in the global namespace.
  238. If the command or variable does not exist,
  239. this command returns an empty string.  If the variable has been
  240. created but not defined, such as with the fBvariablefR command
  241. or through a fBtracefR on the variable, this command will return the 
  242. fully-qualified name of the variable.
  243. If no flag is given, fInamefR is treated as a command name.
  244. See the section fBNAME RESOLUTIONfR below for an explanation of
  245. the rules regarding name resolution.
  246. .SH "WHAT IS A NAMESPACE?"
  247. .PP
  248. A namespace is a collection of commands and variables.
  249. It encapsulates the commands and variables to ensure that they
  250. won't interfere with the commands and variables of other namespaces.
  251. Tcl has always had one such collection,
  252. which we refer to as the fIglobal namespacefR.
  253. The global namespace holds all global variables and commands.
  254. The fBnamespace evalfR command lets you create new namespaces.
  255. For example,
  256. .CS
  257. fBnamespace evalfR Counter {
  258.    fBnamespace exportfR bump
  259.    variable num 0
  260.    proc bump {} {
  261.       variable num
  262.       incr num
  263.    }
  264. }
  265. .CE
  266. creates a new namespace containing the variable fBnumfR and
  267. the procedure fBbumpfR.
  268. The commands and variables in this namespace are separate from
  269. other commands and variables in the same program.
  270. If there is a command named fBbumpfR in the global namespace,
  271. for example, it will be different from the command fBbumpfR
  272. in the fBCounterfR namespace.
  273. .PP
  274. Namespace variables resemble global variables in Tcl.
  275. They exist outside of the procedures in a namespace
  276. but can be accessed in a procedure via the fBvariablefR command,
  277. as shown in the example above.
  278. .PP
  279. Namespaces are dynamic.
  280. You can add and delete commands and variables at any time,
  281. so you can build up the contents of a
  282. namespace over time using a series of fBnamespace evalfR commands.
  283. For example, the following series of commands has the same effect
  284. as the namespace definition shown above:
  285. .CS
  286. fBnamespace evalfR Counter {
  287.    variable num 0
  288.    proc bump {} {
  289.       variable num
  290.       return [incr num]
  291.    }
  292. }
  293. fBnamespace evalfR Counter {
  294.    proc test {args} {
  295.       return $args
  296.    }
  297. }
  298. fBnamespace evalfR Counter {
  299.     rename test ""
  300. }
  301. .CE
  302. Note that the fBtestfR procedure is added to the fBCounterfR namespace,
  303. and later removed via the fBrenamefR command.
  304. .PP
  305. Namespaces can have other namespaces within them,
  306. so they nest hierarchically.
  307. A nested namespace is encapsulated inside its parent namespace
  308. and can not interfere with other namespaces.
  309. .SH "QUALIFIED NAMES"
  310. .PP
  311. Each namespace has a textual name such as
  312. fBhistoryfR or fB::safe::interpfR.
  313. Since namespaces may nest,
  314. qualified names are used to refer to
  315. commands, variables, and child namespaces contained inside namespaces.
  316. Qualified names are similar to the hierarchical path names for
  317. Unix files or Tk widgets,
  318. except that fB::fR is used as the separator
  319. instead of fB/fR or fB.fR.
  320. The topmost or global namespace has the name ``'' (i.e., an empty string),
  321. although fB::fR is a synonym.
  322. As an example, the name fB::safe::interp::createfR
  323. refers to the command fBcreatefR in the namespace fBinterpfR
  324. that is a child of namespace fB::safefR,
  325. which in turn is a child of the global namespace, fB::fR.
  326. .PP
  327. If you want to access commands and variables from another namespace,
  328. you must use some extra syntax.
  329. Names must be qualified by the namespace that contains them.
  330. From the global namespace,
  331. we might access the fBCounterfR procedures like this:
  332. .CS
  333. Counter::bump 5
  334. Counter::Reset
  335. .CE
  336. We could access the current count like this:
  337. .CS
  338. puts "count = $Counter::num"
  339. .CE
  340. When one namespace contains another, you may need more than one
  341. qualifier to reach its elements.
  342. If we had a namespace fBFoofR that contained the namespace fBCounterfR,
  343. you could invoke its fBbumpfR procedure
  344. from the global namespace like this:
  345. .CS
  346. Foo::Counter::bump 3
  347. .CE
  348. .PP
  349. You can also use qualified names when you create and rename commands.
  350. For example, you could add a procedure to the fBFoofR
  351. namespace like this:
  352. .CS
  353. proc Foo::Test {args} {return $args}
  354. .CE
  355. And you could move the same procedure to another namespace like this:
  356. .CS
  357. rename Foo::Test Bar::Test
  358. .CE
  359. .PP
  360. There are a few remaining points about qualified names
  361. that we should cover.
  362. Namespaces have nonempty names except for the global namespace.
  363. fB::fR is disallowed in simple command, variable, and namespace names
  364. except as a namespace separator.
  365. Extra colons in any separator part of a qualified name are ignored;
  366. i.e. two or more colons are treated as a namespace separator.
  367. A trailing fB::fR in a qualified variable or command name
  368. refers to the variable or command named {}.
  369. However, a trailing fB::fR in a qualified namespace name is ignored.
  370. .SH "NAME RESOLUTION"
  371. .PP
  372. In general, all Tcl commands that take variable and command names
  373. support qualified names.
  374. This means you can give qualified names to such commands as
  375. fBsetfR, fBprocfR, fBrenamefR, and fBinterp aliasfR.
  376. If you provide a fully-qualified name that starts with a fB::fR,
  377. there is no question about what command, variable, or namespace
  378. you mean.
  379. However, if the name does not start with a fB::fR
  380. (i.e., is fIrelativefR), 
  381. Tcl follows a fixed rule for looking it up:
  382. Command and variable names are always resolved
  383. by looking first in the current namespace,
  384. and then in the global namespace.
  385. Namespace names, on the other hand, are always resolved
  386. by looking in only the current namespace.
  387. .PP
  388. In the following example,
  389. .CS
  390. set traceLevel 0
  391. fBnamespace evalfR Debug {
  392.    printTrace $traceLevel
  393. }
  394. .CE
  395. Tcl looks for fBtraceLevelfR in the namespace fBDebugfR
  396. and then in the global namespace.
  397. It looks up the command fBprintTracefR in the same way.
  398. If a variable or command name is not found in either context,
  399. the name is undefined.
  400. To make this point absolutely clear, consider the following example:
  401. .CS
  402. set traceLevel 0
  403. fBnamespace evalfR Foo {
  404.    variable traceLevel 3
  405.    fBnamespace evalfR Debug {
  406.       printTrace $traceLevel
  407.    }
  408. }
  409. .CE
  410. Here Tcl looks for fBtraceLevelfR first in the namespace fBFoo::DebugfR.
  411. Since it is not found there, Tcl then looks for it 
  412. in the global namespace.
  413. The variable fBFoo::traceLevelfR is completely ignored
  414. during the name resolution process.
  415. .PP
  416. You can use the fBnamespace whichfR command to clear up any question
  417. about name resolution.
  418. For example, the command:
  419. .CS
  420. fBnamespace evalfR Foo::Debug {fBnamespace whichfR -variable traceLevel}
  421. .CE
  422. returns fB::traceLevelfR.
  423. On the other hand, the command,
  424. .CS
  425. fBnamespace evalfR Foo {fBnamespace whichfR -variable traceLevel}
  426. .CE
  427. returns fB::Foo::traceLevelfR.
  428. .PP
  429. As mentioned above,
  430. namespace names are looked up differently
  431. than the names of variables and commands.
  432. Namespace names are always resolved in the current namespace.
  433. This means, for example,
  434. that a fBnamespace evalfR command that creates a new namespace
  435. always creates a child of the current namespace
  436. unless the new namespace name begins with fB::fR.
  437. .PP
  438. Tcl has no access control to limit what variables, commands,
  439. or namespaces you can reference.
  440. If you provide a qualified name that resolves to an element
  441. by the name resolution rule above,
  442. you can access the element.
  443. .PP
  444. You can access a namespace variable
  445. from a procedure in the same namespace
  446. by using the fBvariablefR command.
  447. Much like the fBglobalfR command,
  448. this creates a local link to the namespace variable.
  449. If necessary, it also creates the variable in the current namespace
  450. and initializes it.
  451. Note that the fBglobalfR command only creates links
  452. to variables in the global namespace.
  453. It is not necessary to use a fBvariablefR command
  454. if you always refer to the namespace variable using an
  455. appropriate qualified name.
  456. .SH "IMPORTING COMMANDS"
  457. .PP
  458. Namespaces are often used to represent libraries.
  459. Some library commands are used so frequently
  460. that it is a nuisance to type their qualified names.
  461. For example, suppose that all of the commands in a package
  462. like BLT are contained in a namespace called fBBltfR.
  463. Then you might access these commands like this:
  464. .CS
  465. Blt::graph .g -background red
  466. Blt::table . .g 0,0
  467. .CE
  468. If you use the fBgraphfR and fBtablefR commands frequently,
  469. you may want to access them without the fBBlt::fR prefix.
  470. You can do this by importing the commands into the current namespace,
  471. like this:
  472. .CS
  473. fBnamespace importfR Blt::*
  474. .CE
  475. This adds all exported commands from the fBBltfR namespace
  476. into the current namespace context, so you can write code like this:
  477. .CS
  478. graph .g -background red
  479. table . .g 0,0
  480. .CE
  481. The fBnamespace importfR command only imports commands
  482. from a namespace that that namespace exported
  483. with a fBnamespace exportfR command.
  484. .PP
  485. Importing fIeveryfR command from a namespace is generally
  486. a bad idea since you don't know what you will get.
  487. It is better to import just the specific commands you need.
  488. For example, the command
  489. .CS
  490. fBnamespace importfR Blt::graph Blt::table
  491. .CE
  492. imports only the fBgraphfR and fBtablefR commands into the
  493. current context.
  494. .PP
  495. If you try to import a command that already exists, you will get an
  496. error.  This prevents you from importing the same command from two
  497. different packages.  But from time to time (perhaps when debugging),
  498. you may want to get around this restriction.  You may want to
  499. reissue the fBnamespace importfR command to pick up new commands
  500. that have appeared in a namespace.  In that case, you can use the
  501. fB-forcefR option, and existing commands will be silently overwritten:
  502. .CS
  503. fBnamespace importfR -force Blt::graph Blt::table
  504. .CE
  505. If for some reason, you want to stop using the imported commands,
  506. you can remove them with a fBnamespace forgetfR command, like this:
  507. .CS
  508. fBnamespace forgetfR Blt::*
  509. .CE
  510. This searches the current namespace for any commands imported from fBBltfR.
  511. If it finds any, it removes them.  Otherwise, it does nothing.
  512. After this, the fBBltfR commands must be accessed with the fBBlt::fR
  513. prefix.
  514. .PP
  515. When you delete a command from the exporting namespace like this:
  516. .CS
  517. rename Blt::graph ""
  518. .CE
  519. the command is automatically removed from all namespaces that import it.
  520. .SH "EXPORTING COMMANDS"
  521. You can export commands from a namespace like this:
  522. .CS
  523. fBnamespace evalfR Counter {
  524.    fBnamespace exportfR bump reset
  525.    variable Num 0
  526.    variable Max 100
  527.    proc bump {{by 1}} {
  528.       variable Num
  529.       incr Num $by
  530.       Check
  531.       return $Num
  532.    }
  533.    proc reset {} {
  534.       variable Num
  535.       set Num 0
  536.    }
  537.    proc Check {} {
  538.       variable Num
  539.       variable Max
  540.       if {$Num > $Max} {
  541.          error "too high!"
  542.       }
  543.    }
  544. }
  545. .CE
  546. The procedures fBbumpfR and fBresetfR are exported,
  547. so they are included when you import from the fBCounterfR namespace,
  548. like this:
  549. .CS
  550. fBnamespace importfR Counter::*
  551. .CE
  552. However, the fBCheckfR procedure is not exported,
  553. so it is ignored by the import operation.
  554. .PP
  555. The fBnamespace importfR command only imports commands
  556. that were declared as exported by their namespace.
  557. The fBnamespace exportfR command specifies what commands
  558. may be imported by other namespaces.
  559. If a fBnamespace importfR command specifies a command
  560. that is not exported, the command is not imported.
  561. .SH "SCOPED SCRIPTS"
  562. The fBnamespace codefR command is the means by which a script may be
  563. packaged for evaluation in a namespace other than the one in which it
  564. was created.  It is used most often to create event handlers, Tk bindings,
  565. and traces for evaluation in the global context.  For instance, the following
  566. code indicates how to direct a variable trace callback into the current
  567. namespace:
  568. .CS
  569. fBnamespace evalfR a {
  570.    variable b
  571.    proc theTraceCallback { n1 n2 op } {
  572.       upvar 1 $n1 var
  573.       puts "the value of $n1 has changed to $var"
  574.       return
  575.    }
  576.    trace variable b w [fBnamespace codefR theTraceCallback]
  577. }
  578. set a::b c
  579. .CE
  580. When executed, it prints the message:
  581. .CS
  582. the value of a::b has changed to c
  583. .CE
  584. .SH EXAMPLES
  585. Create a namespace containing a variable and an exported command:
  586. .CS
  587. fBnamespace evalfR foo {
  588.    variable bar 0
  589.    proc grill {} {
  590.       variable bar
  591.       puts "called [incr bar] times"
  592.    }
  593.    fBnamespace exportfR grill
  594. }
  595. .CE
  596. .PP
  597. Call the command defined in the previous example in various ways.
  598. .CS
  599. # Direct call
  600. foo::grill
  601. # Import into current namespace, then call local alias
  602. namespace import foo::grill
  603. grill
  604. .CE
  605. .PP
  606. Look up where the command imported in the previous example came from:
  607. .CS
  608. puts "grill came from [fBnamespace originfR grill]"
  609. .CE
  610. .SH "SEE ALSO"
  611. variable(n)
  612. .SH KEYWORDS
  613. exported, internal, variable