Tcl Source Code

Hex Artifact Content
Login

Artifact f1ab1592fa151e3b08a52c2575a1805bb45fda70:

Attachment "td-3163961-3.patch" to ticket [3163961fff] added by twylite 2012-08-02 18:55:26.
0000: 49 6e 64 65 78 3a 20 64 6f 63 2f 64 69 63 74 2e  Index: doc/dict.
0010: 6e 0d 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  n..=============
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0050: 3d 3d 3d 3d 3d 0d 0a 2d 2d 2d 20 64 6f 63 2f 64  =====..--- doc/d
0060: 69 63 74 2e 6e 0d 0a 2b 2b 2b 20 64 6f 63 2f 64  ict.n..+++ doc/d
0070: 69 63 74 2e 6e 0d 0a 40 40 20 2d 31 34 34 2c 31  ict.n..@@ -144,1
0080: 30 20 2b 31 34 34 2c 32 38 20 40 40 0d 0a 20 74  0 +144,28 @@.. t
0090: 6f 20 69 6e 20 74 68 65 20 64 69 63 74 69 6f 6e  o in the diction
00a0: 61 72 79 20 76 61 6c 75 65 20 63 6f 6e 74 61 69  ary value contai
00b0: 6e 65 64 20 69 6e 20 74 68 65 20 67 69 76 65 6e  ned in the given
00c0: 20 76 61 72 69 61 62 6c 65 2c 20 77 72 69 74 69   variable, writi
00d0: 6e 67 0d 0a 20 74 68 65 20 72 65 73 75 6c 74 69  ng.. the resulti
00e0: 6e 67 20 64 69 63 74 69 6f 6e 61 72 79 20 76 61  ng dictionary va
00f0: 6c 75 65 20 62 61 63 6b 20 74 6f 20 74 68 61 74  lue back to that
0100: 20 76 61 72 69 61 62 6c 65 2e 20 4e 6f 6e 2d 65   variable. Non-e
0110: 78 69 73 74 65 6e 74 0d 0a 20 6b 65 79 73 20 61  xistent.. keys a
0120: 72 65 20 74 72 65 61 74 65 64 20 61 73 20 69 66  re treated as if
0130: 20 74 68 65 79 20 6d 61 70 20 74 6f 20 61 6e 20   they map to an 
0140: 65 6d 70 74 79 20 6c 69 73 74 2c 20 61 6e 64 20  empty list, and 
0150: 69 74 20 69 73 20 6c 65 67 61 6c 20 66 6f 72 0d  it is legal for.
0160: 0a 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  . there to be no
0170: 20 69 74 65 6d 73 20 74 6f 20 61 70 70 65 6e 64   items to append
0180: 20 74 6f 20 74 68 65 20 6c 69 73 74 2e 20 49 74   to the list. It
0190: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72   is an error for
01a0: 20 74 68 65 0d 0a 20 76 61 6c 75 65 20 74 68 61   the.. value tha
01b0: 74 20 74 68 65 20 6b 65 79 20 6d 61 70 73 20 74  t the key maps t
01c0: 6f 20 74 6f 20 6e 6f 74 20 62 65 20 72 65 70 72  o to not be repr
01d0: 65 73 65 6e 74 61 62 6c 65 20 61 73 20 61 20 6c  esentable as a l
01e0: 69 73 74 2e 0d 0a 2b 2e 54 50 0d 0a 2b 5c 66 42  ist...+.TP..+\fB
01f0: 64 69 63 74 20 6d 61 70 20 7b 5c 66 49 6b 65 79  dict map {\fIkey
0200: 56 61 72 20 76 61 6c 75 65 56 61 72 5c 66 42 7d  Var valueVar\fB}
0210: 20 5c 66 49 64 69 63 74 69 6f 6e 61 72 79 56 61   \fIdictionaryVa
0220: 6c 75 65 20 62 6f 64 79 5c 66 52 0d 0a 2b 2e 0d  lue body\fR..+..
0230: 0a 2b 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 74  .+This command t
0240: 61 6b 65 73 20 74 68 72 65 65 20 61 72 67 75 6d  akes three argum
0250: 65 6e 74 73 2c 20 74 68 65 20 66 69 72 73 74 20  ents, the first 
0260: 61 20 74 77 6f 2d 65 6c 65 6d 65 6e 74 20 6c 69  a two-element li
0270: 73 74 20 6f 66 0d 0a 2b 76 61 72 69 61 62 6c 65  st of..+variable
0280: 20 6e 61 6d 65 73 20 28 66 6f 72 20 74 68 65 20   names (for the 
0290: 6b 65 79 20 61 6e 64 20 76 61 6c 75 65 20 72 65  key and value re
02a0: 73 70 65 63 74 69 76 65 6c 79 20 6f 66 20 65 61  spectively of ea
02b0: 63 68 20 6d 61 70 70 69 6e 67 20 69 6e 0d 0a 2b  ch mapping in..+
02c0: 74 68 65 20 64 69 63 74 69 6f 6e 61 72 79 29 2c  the dictionary),
02d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20   the second the 
02e0: 64 69 63 74 69 6f 6e 61 72 79 20 76 61 6c 75 65  dictionary value
02f0: 20 74 6f 20 69 74 65 72 61 74 65 20 61 63 72 6f   to iterate acro
0300: 73 73 2c 0d 0a 2b 61 6e 64 20 74 68 65 20 74 68  ss,..+and the th
0310: 69 72 64 20 61 20 73 63 72 69 70 74 20 74 6f 20  ird a script to 
0320: 62 65 20 65 76 61 6c 75 61 74 65 64 20 66 6f 72  be evaluated for
0330: 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 77 69   each mapping wi
0340: 74 68 20 74 68 65 20 6b 65 79 0d 0a 2b 61 6e 64  th the key..+and
0350: 20 76 61 6c 75 65 20 76 61 72 69 61 62 6c 65 73   value variables
0360: 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74 65   set appropriate
0370: 6c 79 20 28 69 6e 20 74 68 65 20 6d 61 6e 6e 65  ly (in the manne
0380: 72 20 6f 66 20 5c 66 42 6d 61 70 65 61 63 68 5c  r of \fBmapeach\
0390: 66 52 2e 29 0d 0a 2b 49 6e 20 61 6e 20 69 74 65  fR.)..+In an ite
03a0: 72 61 74 69 6f 6e 20 77 68 65 72 65 20 74 68 65  ration where the
03b0: 20 65 76 61 6c 75 61 74 65 64 20 73 63 72 69 70   evaluated scrip
03c0: 74 20 63 6f 6d 70 6c 65 74 65 73 20 6e 6f 72 6d  t completes norm
03d0: 61 6c 6c 79 20 0d 0a 2b 28 5c 66 42 54 43 4c 5f  ally ..+(\fBTCL_
03e0: 4f 4b 5c 66 52 29 20 74 68 65 20 73 63 72 69 70  OK\fR) the scrip
03f0: 74 20 72 65 73 75 6c 74 20 69 73 20 61 70 70 65  t result is appe
0400: 6e 64 65 64 20 74 6f 20 61 6e 20 61 63 63 75 6d  nded to an accum
0410: 75 6c 61 74 6f 72 20 6c 69 73 74 2e 0d 0a 2b 54  ulator list...+T
0420: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
0430: 20 5c 66 42 64 69 63 74 20 6d 61 70 5c 66 42 20   \fBdict map\fB 
0440: 63 6f 6d 6d 61 6e 64 20 69 73 20 74 68 65 20 61  command is the a
0450: 63 63 75 6d 75 6c 61 74 6f 72 20 6c 69 73 74 2e  ccumulator list.
0460: 0d 0a 2b 49 66 20 61 6e 79 20 65 76 61 6c 75 61  ..+If any evalua
0470: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 6f 64 79  tion of the body
0480: 20 67 65 6e 65 72 61 74 65 73 20 61 20 5c 66 42   generates a \fB
0490: 54 43 4c 5f 42 52 45 41 4b 5c 66 52 20 72 65 73  TCL_BREAK\fR res
04a0: 75 6c 74 2c 20 6e 6f 20 0d 0a 2b 66 75 72 74 68  ult, no ..+furth
04b0: 65 72 20 70 61 69 72 73 20 66 72 6f 6d 20 74 68  er pairs from th
04c0: 65 20 64 69 63 74 69 6f 6e 61 72 79 20 77 69 6c  e dictionary wil
04d0: 6c 20 62 65 20 69 74 65 72 61 74 65 64 20 6f 76  l be iterated ov
04e0: 65 72 20 61 6e 64 20 74 68 65 20 0d 0a 2b 5c 66  er and the ..+\f
04f0: 42 64 69 63 74 20 6d 61 70 5c 66 52 20 63 6f 6d  Bdict map\fR com
0500: 6d 61 6e 64 20 77 69 6c 6c 20 74 65 72 6d 69 6e  mand will termin
0510: 61 74 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ate successfully
0520: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 66   immediately. If
0530: 20 61 6e 79 0d 0a 2b 65 76 61 6c 75 61 74 69 6f   any..+evaluatio
0540: 6e 20 6f 66 20 74 68 65 20 62 6f 64 79 20 67 65  n of the body ge
0550: 6e 65 72 61 74 65 73 20 61 20 5c 66 42 54 43 4c  nerates a \fBTCL
0560: 5f 43 4f 4e 54 49 4e 55 45 5c 66 52 20 72 65 73  _CONTINUE\fR res
0570: 75 6c 74 2c 20 74 68 65 0d 0a 2b 63 75 72 72 65  ult, the..+curre
0580: 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20  nt iteration is 
0590: 61 62 6f 72 74 65 64 20 61 6e 64 20 74 68 65 20  aborted and the 
05a0: 61 63 63 75 6d 75 6c 61 74 6f 72 20 6c 69 73 74  accumulator list
05b0: 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
05c0: 2e 0d 0a 2b 54 68 65 20 6f 72 64 65 72 20 6f 66  ...+The order of
05d0: 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 74 68   iteration is th
05e0: 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
05f0: 20 74 68 65 20 6b 65 79 73 20 77 65 72 65 20 69   the keys were i
0600: 6e 73 65 72 74 65 64 20 69 6e 74 6f 0d 0a 2b 74  nserted into..+t
0610: 68 65 20 64 69 63 74 69 6f 6e 61 72 79 2e 0d 0a  he dictionary...
0620: 20 2e 54 50 0d 0a 20 5c 66 42 64 69 63 74 20 6d   .TP.. \fBdict m
0630: 65 72 67 65 20 5c 66 52 3f 5c 66 49 64 69 63 74  erge \fR?\fIdict
0640: 69 6f 6e 61 72 79 56 61 6c 75 65 20 2e 2e 2e 5c  ionaryValue ...\
0650: 66 52 3f 0d 0a 20 2e 0d 0a 20 52 65 74 75 72 6e  fR?.. ... Return
0660: 20 61 20 64 69 63 74 69 6f 6e 61 72 79 20 74 68   a dictionary th
0670: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
0680: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 65 61 63 68  contents of each
0690: 20 6f 66 20 74 68 65 0d 0a 20 5c 66 49 64 69 63   of the.. \fIdic
06a0: 74 69 6f 6e 61 72 79 56 61 6c 75 65 5c 66 52 20  tionaryValue\fR 
06b0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 57 68 65 72  arguments.  Wher
06c0: 65 20 74 77 6f 20 28 6f 72 20 6d 6f 72 65 29 20  e two (or more) 
06d0: 64 69 63 74 69 6f 6e 61 72 69 65 73 0d 0a 40 40  dictionaries..@@
06e0: 20 2d 34 30 36 2c 31 31 20 2b 34 32 34 2c 31 31   -406,11 +424,11
06f0: 20 40 40 0d 0a 20 5c 66 42 64 69 63 74 20 77 69   @@.. \fBdict wi
0700: 74 68 5c 66 52 20 66 6f 6f 20 7b 7d 0d 0a 20 70  th\fR foo {}.. p
0710: 75 74 73 20 24 66 6f 6f 0d 0a 20 23 20 20 20 20  uts $foo.. #    
0720: 70 72 69 6e 74 73 3a 20 5c 66 49 61 20 62 20 66  prints: \fIa b f
0730: 6f 6f 20 7b 61 20 62 7d 20 62 61 72 20 32 20 62  oo {a b} bar 2 b
0740: 61 7a 20 33 5c 66 52 0d 0a 20 2e 43 45 0d 0a 20  az 3\fR.. .CE.. 
0750: 2e 53 48 20 22 53 45 45 20 41 4c 53 4f 22 0d 0a  .SH "SEE ALSO"..
0760: 2d 61 70 70 65 6e 64 28 6e 29 2c 20 61 72 72 61  -append(n), arra
0770: 79 28 6e 29 2c 20 66 6f 72 65 61 63 68 28 6e 29  y(n), foreach(n)
0780: 2c 20 69 6e 63 72 28 6e 29 2c 20 6c 69 73 74 28  , incr(n), list(
0790: 6e 29 2c 20 6c 61 70 70 65 6e 64 28 6e 29 2c 20  n), lappend(n), 
07a0: 73 65 74 28 6e 29 0d 0a 2b 61 70 70 65 6e 64 28  set(n)..+append(
07b0: 6e 29 2c 20 61 72 72 61 79 28 6e 29 2c 20 66 6f  n), array(n), fo
07c0: 72 65 61 63 68 28 6e 29 2c 20 6d 61 70 65 61 63  reach(n), mapeac
07d0: 68 28 6e 29 2c 20 69 6e 63 72 28 6e 29 2c 20 6c  h(n), incr(n), l
07e0: 69 73 74 28 6e 29 2c 20 6c 61 70 70 65 6e 64 28  ist(n), lappend(
07f0: 6e 29 2c 20 73 65 74 28 6e 29 0d 0a 20 2e 53 48  n), set(n).. .SH
0800: 20 4b 45 59 57 4f 52 44 53 0d 0a 2d 64 69 63 74   KEYWORDS..-dict
0810: 69 6f 6e 61 72 79 2c 20 63 72 65 61 74 65 2c 20  ionary, create, 
0820: 75 70 64 61 74 65 2c 20 6c 6f 6f 6b 75 70 2c 20  update, lookup, 
0830: 69 74 65 72 61 74 65 2c 20 66 69 6c 74 65 72 0d  iterate, filter.
0840: 0a 2b 64 69 63 74 69 6f 6e 61 72 79 2c 20 63 72  .+dictionary, cr
0850: 65 61 74 65 2c 20 75 70 64 61 74 65 2c 20 6c 6f  eate, update, lo
0860: 6f 6b 75 70 2c 20 69 74 65 72 61 74 65 2c 20 66  okup, iterate, f
0870: 69 6c 74 65 72 2c 20 6d 61 70 0d 0a 20 27 5c 22  ilter, map.. '\"
0880: 20 4c 6f 63 61 6c 20 56 61 72 69 61 62 6c 65 73   Local Variables
0890: 3a 0d 0a 20 27 5c 22 20 6d 6f 64 65 3a 20 6e 72  :.. '\" mode: nr
08a0: 6f 66 66 0d 0a 20 27 5c 22 20 45 6e 64 3a 0d 0a  off.. '\" End:..
08b0: 0d 0a 41 44 44 45 44 5f 42 59 5f 4d 45 52 47 45  ..ADDED_BY_MERGE
08c0: 20 64 6f 63 2f 6d 61 70 65 61 63 68 2e 6e 0d 0a   doc/mapeach.n..
08d0: 49 6e 64 65 78 3a 20 64 6f 63 2f 6d 61 70 65 61  Index: doc/mapea
08e0: 63 68 2e 6e 0d 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ch.n..==========
08f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0920: 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a 2d 2d 2d 20 64 6f  ========..--- do
0930: 63 2f 6d 61 70 65 61 63 68 2e 6e 0d 0a 2b 2b 2b  c/mapeach.n..+++
0940: 20 64 6f 63 2f 6d 61 70 65 61 63 68 2e 6e 0d 0a   doc/mapeach.n..
0950: 40 40 20 2d 30 2c 30 20 2b 31 2c 39 31 20 40 40  @@ -0,0 +1,91 @@
0960: 0d 0a 2b 27 5c 22 0d 0a 2b 27 5c 22 20 43 6f 70  ..+'\"..+'\" Cop
0970: 79 72 69 67 68 74 20 28 63 29 20 32 30 31 32 20  yright (c) 2012 
0980: 54 72 65 76 6f 72 20 44 61 76 65 6c 0d 0a 2b 27  Trevor Davel..+'
0990: 5c 22 0d 0a 2b 27 5c 22 20 53 65 65 20 74 68 65  \"..+'\" See the
09a0: 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74   file "license.t
09b0: 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d  erms" for inform
09c0: 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61  ation on usage a
09d0: 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f  nd redistributio
09e0: 6e 0d 0a 2b 27 5c 22 20 6f 66 20 74 68 69 73 20  n..+'\" of this 
09f0: 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20  file, and for a 
0a00: 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c  DISCLAIMER OF AL
0a10: 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0d 0a 2b  L WARRANTIES...+
0a20: 27 5c 22 20 0d 0a 2b 2e 73 6f 20 6d 61 6e 2e 6d  '\" ..+.so man.m
0a30: 61 63 72 6f 73 0d 0a 2b 2e 54 48 20 6d 61 70 65  acros..+.TH mape
0a40: 61 63 68 20 6e 20 22 22 20 54 63 6c 20 22 54 63  ach n "" Tcl "Tc
0a50: 6c 20 42 75 69 6c 74 2d 49 6e 20 43 6f 6d 6d 61  l Built-In Comma
0a60: 6e 64 73 22 0d 0a 2b 2e 42 53 0d 0a 2b 27 5c 22  nds"..+.BS..+'\"
0a70: 20 4e 6f 74 65 3a 20 20 64 6f 20 6e 6f 74 20 6d   Note:  do not m
0a80: 6f 64 69 66 79 20 74 68 65 20 2e 53 48 20 4e 41  odify the .SH NA
0a90: 4d 45 20 6c 69 6e 65 20 69 6d 6d 65 64 69 61 74  ME line immediat
0aa0: 65 6c 79 20 62 65 6c 6f 77 21 0d 0a 2b 2e 53 48  ely below!..+.SH
0ab0: 20 4e 41 4d 45 0d 0a 2b 6d 61 70 65 61 63 68 20   NAME..+mapeach 
0ac0: 5c 2d 20 49 74 65 72 61 74 65 20 6f 76 65 72 20  \- Iterate over 
0ad0: 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  all elements in 
0ae0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6c 69 73 74  one or more list
0af0: 73 20 61 6e 64 20 63 6f 6c 6c 65 63 74 20 72 65  s and collect re
0b00: 73 75 6c 74 73 0d 0a 2b 2e 53 48 20 53 59 4e 4f  sults..+.SH SYNO
0b10: 50 53 49 53 0d 0a 2b 5c 66 42 6d 61 70 65 61 63  PSIS..+\fBmapeac
0b20: 68 20 5c 66 49 76 61 72 6e 61 6d 65 20 6c 69 73  h \fIvarname lis
0b30: 74 20 62 6f 64 79 5c 66 52 0d 0a 2b 2e 62 72 0d  t body\fR..+.br.
0b40: 0a 2b 5c 66 42 6d 61 70 65 61 63 68 20 5c 66 49  .+\fBmapeach \fI
0b50: 76 61 72 6c 69 73 74 31 20 6c 69 73 74 31 5c 66  varlist1 list1\f
0b60: 52 20 3f 5c 66 49 76 61 72 6c 69 73 74 32 20 6c  R ?\fIvarlist2 l
0b70: 69 73 74 32 20 2e 2e 2e 5c 66 52 3f 20 5c 66 49  ist2 ...\fR? \fI
0b80: 62 6f 64 79 5c 66 52 0d 0a 2b 2e 42 45 0d 0a 2b  body\fR..+.BE..+
0b90: 0d 0a 2b 2e 53 48 20 44 45 53 43 52 49 50 54 49  ..+.SH DESCRIPTI
0ba0: 4f 4e 0d 0a 2b 2e 50 50 0d 0a 2b 54 68 65 20 5c  ON..+.PP..+The \
0bb0: 66 42 6d 61 70 65 61 63 68 5c 66 52 20 63 6f 6d  fBmapeach\fR com
0bc0: 6d 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 73 20  mand implements 
0bd0: 61 20 6c 6f 6f 70 20 77 68 65 72 65 20 74 68 65  a loop where the
0be0: 20 6c 6f 6f 70 0d 0a 2b 76 61 72 69 61 62 6c 65   loop..+variable
0bf0: 28 73 29 20 74 61 6b 65 20 6f 6e 20 76 61 6c 75  (s) take on valu
0c00: 65 73 20 66 72 6f 6d 20 6f 6e 65 20 6f 72 20 6d  es from one or m
0c10: 6f 72 65 20 6c 69 73 74 73 2c 20 61 6e 64 20 74  ore lists, and t
0c20: 68 65 20 6c 6f 6f 70 20 72 65 74 75 72 6e 73 20  he loop returns 
0c30: 61 20 6c 69 73 74 0d 0a 2b 6f 66 20 72 65 73 75  a list..+of resu
0c40: 6c 74 73 20 63 6f 6c 6c 65 63 74 65 64 20 66 72  lts collected fr
0c50: 6f 6d 20 65 61 63 68 20 69 74 65 72 61 74 69 6f  om each iteratio
0c60: 6e 2e 0d 0a 2b 2e 50 50 0d 0a 2b 49 6e 20 74 68  n...+.PP..+In th
0c70: 65 20 73 69 6d 70 6c 65 73 74 20 63 61 73 65 20  e simplest case 
0c80: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 6f  there is one loo
0c90: 70 20 76 61 72 69 61 62 6c 65 2c 20 5c 66 49 76  p variable, \fIv
0ca0: 61 72 6e 61 6d 65 5c 66 52 2c 0d 0a 2b 61 6e 64  arname\fR,..+and
0cb0: 20 6f 6e 65 20 6c 69 73 74 2c 20 5c 66 49 6c 69   one list, \fIli
0cc0: 73 74 5c 66 52 2c 20 74 68 61 74 20 69 73 20 61  st\fR, that is a
0cd0: 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   list of values 
0ce0: 74 6f 20 61 73 73 69 67 6e 20 74 6f 20 5c 66 49  to assign to \fI
0cf0: 76 61 72 6e 61 6d 65 5c 66 52 2e 0d 0a 2b 54 68  varname\fR...+Th
0d00: 65 20 5c 66 49 62 6f 64 79 5c 66 52 20 61 72 67  e \fIbody\fR arg
0d10: 75 6d 65 6e 74 20 69 73 20 61 20 54 63 6c 20 73  ument is a Tcl s
0d20: 63 72 69 70 74 2e 0d 0a 2b 46 6f 72 20 65 61 63  cript...+For eac
0d30: 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 5c 66 49  h element of \fI
0d40: 6c 69 73 74 5c 66 52 20 28 69 6e 20 6f 72 64 65  list\fR (in orde
0d50: 72 0d 0a 2b 66 72 6f 6d 20 66 69 72 73 74 20 74  r..+from first t
0d60: 6f 20 6c 61 73 74 29 2c 20 5c 66 42 6d 61 70 65  o last), \fBmape
0d70: 61 63 68 5c 66 52 20 61 73 73 69 67 6e 73 20 74  ach\fR assigns t
0d80: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
0d90: 68 65 0d 0a 2b 65 6c 65 6d 65 6e 74 20 74 6f 20  he..+element to 
0da0: 5c 66 49 76 61 72 6e 61 6d 65 5c 66 52 20 61 73  \fIvarname\fR as
0db0: 20 69 66 20 74 68 65 20 5c 66 42 6c 69 6e 64 65   if the \fBlinde
0dc0: 78 5c 66 52 20 63 6f 6d 6d 61 6e 64 20 68 61 64  x\fR command had
0dd0: 20 62 65 65 6e 20 75 73 65 64 0d 0a 2b 74 6f 20   been used..+to 
0de0: 65 78 74 72 61 63 74 20 74 68 65 20 65 6c 65 6d  extract the elem
0df0: 65 6e 74 2c 20 74 68 65 6e 20 63 61 6c 6c 73 20  ent, then calls 
0e00: 74 68 65 20 54 63 6c 20 69 6e 74 65 72 70 72 65  the Tcl interpre
0e10: 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 0d 0a  ter to execute..
0e20: 2b 5c 66 49 62 6f 64 79 5c 66 52 2e 20 20 49 66  +\fIbody\fR.  If
0e30: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
0e40: 65 20 62 6f 64 79 20 63 6f 6d 70 6c 65 74 65 73  e body completes
0e50: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 6e 20 74   normally then t
0e60: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
0e70: 0d 0a 2b 62 6f 64 79 20 69 73 20 61 70 70 65 6e  ..+body is appen
0e80: 64 65 64 20 74 6f 20 61 6e 20 61 63 63 75 6d 75  ded to an accumu
0e90: 6c 61 74 6f 72 20 6c 69 73 74 2e 20 5c 66 42 6d  lator list. \fBm
0ea0: 61 70 65 61 63 68 5c 66 52 20 72 65 74 75 72 6e  apeach\fR return
0eb0: 73 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  s the accumulato
0ec0: 72 0d 0a 2b 6c 69 73 74 2e 0d 0a 2b 0d 0a 2b 2e  r..+list...+..+.
0ed0: 50 50 0d 0a 2b 49 6e 20 74 68 65 20 67 65 6e 65  PP..+In the gene
0ee0: 72 61 6c 20 63 61 73 65 20 74 68 65 72 65 20 63  ral case there c
0ef0: 61 6e 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  an be more than 
0f00: 6f 6e 65 20 76 61 6c 75 65 20 6c 69 73 74 0d 0a  one value list..
0f10: 2b 28 65 2e 67 2e 2c 20 5c 66 49 6c 69 73 74 31  +(e.g., \fIlist1
0f20: 5c 66 52 20 61 6e 64 20 5c 66 49 6c 69 73 74 32  \fR and \fIlist2
0f30: 5c 66 52 29 2c 0d 0a 2b 61 6e 64 20 65 61 63 68  \fR),..+and each
0f40: 20 76 61 6c 75 65 20 6c 69 73 74 20 63 61 6e 20   value list can 
0f50: 62 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  be associated wi
0f60: 74 68 20 61 20 6c 69 73 74 20 6f 66 20 6c 6f 6f  th a list of loo
0f70: 70 20 76 61 72 69 61 62 6c 65 73 0d 0a 2b 28 65  p variables..+(e
0f80: 2e 67 2e 2c 20 5c 66 49 76 61 72 6c 69 73 74 31  .g., \fIvarlist1
0f90: 5c 66 52 20 61 6e 64 20 5c 66 49 76 61 72 6c 69  \fR and \fIvarli
0fa0: 73 74 32 5c 66 52 29 2e 0d 0a 2b 44 75 72 69 6e  st2\fR)...+Durin
0fb0: 67 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e  g each iteration
0fc0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0d 0a 2b 74   of the loop..+t
0fd0: 68 65 20 76 61 72 69 61 62 6c 65 73 20 6f 66 20  he variables of 
0fe0: 65 61 63 68 20 5c 66 49 76 61 72 6c 69 73 74 5c  each \fIvarlist\
0ff0: 66 52 20 61 72 65 20 61 73 73 69 67 6e 65 64 0d  fR are assigned.
1000: 0a 2b 63 6f 6e 73 65 63 75 74 69 76 65 20 76 61  .+consecutive va
1010: 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  lues from the co
1020: 72 72 65 73 70 6f 6e 64 69 6e 67 20 5c 66 49 6c  rresponding \fIl
1030: 69 73 74 5c 66 52 2e 0d 0a 2b 56 61 6c 75 65 73  ist\fR...+Values
1040: 20 69 6e 20 65 61 63 68 20 5c 66 49 6c 69 73 74   in each \fIlist
1050: 5c 66 52 20 61 72 65 20 75 73 65 64 20 69 6e 20  \fR are used in 
1060: 6f 72 64 65 72 20 66 72 6f 6d 20 66 69 72 73 74  order from first
1070: 20 74 6f 20 6c 61 73 74 2c 0d 0a 2b 61 6e 64 20   to last,..+and 
1080: 65 61 63 68 20 76 61 6c 75 65 20 69 73 20 75 73  each value is us
1090: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e  ed exactly once.
10a0: 0d 0a 2b 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ..+The total num
10b0: 62 65 72 20 6f 66 20 6c 6f 6f 70 20 69 74 65 72  ber of loop iter
10c0: 61 74 69 6f 6e 73 20 69 73 20 6c 61 72 67 65 20  ations is large 
10d0: 65 6e 6f 75 67 68 20 74 6f 20 75 73 65 0d 0a 2b  enough to use..+
10e0: 75 70 20 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  up all the value
10f0: 73 20 66 72 6f 6d 20 61 6c 6c 20 74 68 65 20 76  s from all the v
1100: 61 6c 75 65 20 6c 69 73 74 73 2e 0d 0a 2b 49 66  alue lists...+If
1110: 20 61 20 76 61 6c 75 65 20 6c 69 73 74 20 64 6f   a value list do
1120: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 65  es not contain e
1130: 6e 6f 75 67 68 0d 0a 2b 65 6c 65 6d 65 6e 74 73  nough..+elements
1140: 20 66 6f 72 20 65 61 63 68 20 6f 66 20 69 74 73   for each of its
1150: 20 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 73 20   loop variables 
1160: 69 6e 20 65 61 63 68 20 69 74 65 72 61 74 69 6f  in each iteratio
1170: 6e 2c 0d 0a 2b 65 6d 70 74 79 20 76 61 6c 75 65  n,..+empty value
1180: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
1190: 68 65 20 6d 69 73 73 69 6e 67 20 65 6c 65 6d 65  he missing eleme
11a0: 6e 74 73 2e 0d 0a 2b 2e 50 50 0d 0a 2b 54 68 65  nts...+.PP..+The
11b0: 20 5c 66 42 62 72 65 61 6b 5c 66 52 20 61 6e 64   \fBbreak\fR and
11c0: 20 5c 66 42 63 6f 6e 74 69 6e 75 65 5c 66 52 20   \fBcontinue\fR 
11d0: 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 79 20 62  statements may b
11e0: 65 0d 0a 2b 69 6e 76 6f 6b 65 64 20 69 6e 73 69  e..+invoked insi
11f0: 64 65 20 5c 66 49 62 6f 64 79 5c 66 52 2c 20 77  de \fIbody\fR, w
1200: 69 74 68 20 74 68 65 20 73 61 6d 65 20 65 66 66  ith the same eff
1210: 65 63 74 20 61 73 20 69 6e 20 74 68 65 20 5c 66  ect as in the \f
1220: 42 66 6f 72 5c 66 52 0d 0a 2b 61 6e 64 20 5c 66  Bfor\fR..+and \f
1230: 42 66 6f 72 65 61 63 68 5c 66 52 20 63 6f 6d 6d  Bforeach\fR comm
1240: 61 6e 64 73 2e 20 49 6e 20 74 68 65 73 65 20 63  ands. In these c
1250: 61 73 65 73 20 74 68 65 20 62 6f 64 79 20 64 6f  ases the body do
1260: 65 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  es not complete 
1270: 6e 6f 72 6d 61 6c 6c 79 0d 0a 2b 61 6e 64 20 74  normally..+and t
1280: 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74  he result is not
1290: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
12a0: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6c 69 73   accumulator lis
12b0: 74 2e 0d 0a 2b 2e 53 48 20 45 58 41 4d 50 4c 45  t...+.SH EXAMPLE
12c0: 53 0d 0a 2b 2e 50 50 0d 0a 2b 5a 69 70 20 6c 69  S..+.PP..+Zip li
12d0: 73 74 73 20 74 6f 67 65 74 68 65 72 3a 0d 0a 2b  sts together:..+
12e0: 2e 50 50 0d 0a 2b 2e 43 53 0d 0a 2b 27 5c 22 20  .PP..+.CS..+'\" 
12f0: 4d 61 69 6e 74 61 69 6e 65 72 73 3a 20 6e 6f 74  Maintainers: not
1300: 69 63 65 20 74 68 65 20 74 61 62 20 68 61 63 6b  ice the tab hack
1310: 69 6e 67 20 62 65 6c 6f 77 21 0d 0a 2b 2e 74 61  ing below!..+.ta
1320: 20 33 69 0d 0a 2b 73 65 74 20 6c 69 73 74 31 20   3i..+set list1 
1330: 7b 61 20 62 20 63 20 64 7d 0d 0a 2b 73 65 74 20  {a b c d}..+set 
1340: 6c 69 73 74 32 20 7b 31 20 32 20 33 20 34 7d 0d  list2 {1 2 3 4}.
1350: 0a 2b 73 65 74 20 7a 69 70 70 65 64 20 5b 5c 66  .+set zipped [\f
1360: 42 6d 61 70 65 61 63 68 5c 66 52 20 61 20 24 6c  Bmapeach\fR a $l
1370: 69 73 74 31 20 62 20 24 6c 69 73 74 32 20 7b 6c  ist1 b $list2 {l
1380: 69 73 74 20 24 61 20 24 62 7d 5d 20 0d 0a 2b 23  ist $a $b}] ..+#
1390: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 7a 69   The value of zi
13a0: 70 70 65 64 20 69 73 20 22 7b 61 20 31 7d 20 7b  pped is "{a 1} {
13b0: 62 20 32 7d 20 7b 63 20 33 7d 20 7b 64 20 34 7d  b 2} {c 3} {d 4}
13c0: 22 0d 0a 2b 2e 43 45 0d 0a 2b 2e 50 50 0d 0a 2b  "..+.CE..+.PP..+
13d0: 46 69 6c 74 65 72 20 61 20 6c 69 73 74 3a 0d 0a  Filter a list:..
13e0: 2b 2e 50 50 0d 0a 2b 2e 43 53 0d 0a 2b 73 65 74  +.PP..+.CS..+set
13f0: 20 76 61 6c 75 65 73 20 7b 31 20 32 20 33 20 34   values {1 2 3 4
1400: 20 35 20 36 20 37 20 38 7d 0d 0a 2b 70 72 6f 63   5 6 7 8}..+proc
1410: 20 69 73 47 6f 6f 64 20 7b 6e 7d 20 7b 20 65 78   isGood {n} { ex
1420: 70 72 20 7b 20 28 24 6e 20 25 20 32 29 20 3d 3d  pr { ($n % 2) ==
1430: 20 30 20 7d 20 7d 0d 0a 2b 73 65 74 20 67 6f 6f   0 } }..+set goo
1440: 64 4f 6e 65 73 20 5b 5c 66 42 6d 61 70 65 61 63  dOnes [\fBmapeac
1450: 68 5c 66 52 20 78 20 24 76 61 6c 75 65 73 20 7b  h\fR x $values {
1460: 65 78 70 72 20 7b 5b 69 73 47 6f 6f 64 20 24 78  expr {[isGood $x
1470: 5d 20 3f 20 24 78 20 3a 20 5b 63 6f 6e 74 69 6e  ] ? $x : [contin
1480: 75 65 5d 7d 7d 5d 0d 0a 2b 23 20 54 68 65 20 76  ue]}}]..+# The v
1490: 61 6c 75 65 20 6f 66 20 67 6f 6f 64 4f 6e 65 73  alue of goodOnes
14a0: 20 69 73 20 22 32 20 34 20 36 20 38 22 0d 0a 2b   is "2 4 6 8"..+
14b0: 2e 43 45 0d 0a 2b 2e 50 50 0d 0a 2b 54 61 6b 65  .CE..+.PP..+Take
14c0: 20 61 20 70 72 65 66 69 78 20 66 72 6f 6d 20 61   a prefix from a
14d0: 20 6c 69 73 74 3a 0d 0a 2b 2e 50 50 0d 0a 2b 2e   list:..+.PP..+.
14e0: 43 53 0d 0a 2b 73 65 74 20 76 61 6c 75 65 73 20  CS..+set values 
14f0: 7b 38 20 37 20 36 20 35 20 34 20 33 20 32 20 31  {8 7 6 5 4 3 2 1
1500: 7d 0d 0a 2b 70 72 6f 63 20 69 73 47 6f 6f 64 20  }..+proc isGood 
1510: 7b 6e 7d 20 7b 20 65 78 70 72 20 7b 20 24 6e 20  {n} { expr { $n 
1520: 3e 20 33 20 7d 20 7d 0d 0a 2b 73 65 74 20 70 72  > 3 } }..+set pr
1530: 65 66 69 78 20 5b 5c 66 42 6d 61 70 65 61 63 68  efix [\fBmapeach
1540: 5c 66 52 20 78 20 24 76 61 6c 75 65 73 20 7b 65  \fR x $values {e
1550: 78 70 72 20 7b 5b 69 73 47 6f 6f 64 20 24 78 5d  xpr {[isGood $x]
1560: 20 3f 20 24 78 20 3a 20 5b 62 72 65 61 6b 5d 7d   ? $x : [break]}
1570: 7d 5d 20 0d 0a 2b 23 20 54 68 65 20 76 61 6c 75  }] ..+# The valu
1580: 65 20 6f 66 20 70 72 65 66 69 78 20 69 73 20 22  e of prefix is "
1590: 38 20 37 20 36 20 35 20 34 22 0d 0a 2b 2e 43 45  8 7 6 5 4"..+.CE
15a0: 0d 0a 2b 0d 0a 2b 2e 53 48 20 22 53 45 45 20 41  ..+..+.SH "SEE A
15b0: 4c 53 4f 22 0d 0a 2b 66 6f 72 28 6e 29 2c 20 77  LSO"..+for(n), w
15c0: 68 69 6c 65 28 6e 29 2c 20 62 72 65 61 6b 28 6e  hile(n), break(n
15d0: 29 2c 20 63 6f 6e 74 69 6e 75 65 28 6e 29 2c 20  ), continue(n), 
15e0: 66 6f 72 65 61 63 68 28 6e 29 0d 0a 2b 0d 0a 2b  foreach(n)..+..+
15f0: 2e 53 48 20 4b 45 59 57 4f 52 44 53 0d 0a 2b 66  .SH KEYWORDS..+f
1600: 6f 72 65 61 63 68 2c 20 69 74 65 72 61 74 69 6f  oreach, iteratio
1610: 6e 2c 20 6c 69 73 74 2c 20 6c 6f 6f 70 2c 20 6d  n, list, loop, m
1620: 61 70 0d 0a 0d 0a 49 6e 64 65 78 3a 20 67 65 6e  ap....Index: gen
1630: 65 72 69 63 2f 74 63 6c 2e 68 0d 0a 3d 3d 3d 3d  eric/tcl.h..====
1640: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1650: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a  ==============..
1680: 2d 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c 2e  --- generic/tcl.
1690: 68 0d 0a 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74  h..+++ generic/t
16a0: 63 6c 2e 68 0d 0a 40 40 20 2d 31 33 35 37 2c 31  cl.h..@@ -1357,1
16b0: 30 20 2b 31 33 35 37 2c 31 31 20 40 40 0d 0a 20  0 +1357,11 @@.. 
16c0: 20 20 20 20 76 6f 69 64 20 2a 6e 65 78 74 3b 09      void *next;.
16d0: 09 09 2f 2a 20 53 65 61 72 63 68 20 70 6f 73 69  ../* Search posi
16e0: 74 69 6f 6e 20 66 6f 72 20 75 6e 64 65 72 6c 79  tion for underly
16f0: 69 6e 67 20 68 61 73 68 0d 0a 20 09 09 09 09 20  ing hash.. .... 
1700: 2a 20 74 61 62 6c 65 2e 20 2a 2f 0d 0a 20 20 20  * table. */..   
1710: 20 20 69 6e 74 20 65 70 6f 63 68 3b 09 09 09 2f    int epoch;.../
1720: 2a 20 45 70 6f 63 68 20 6d 61 72 6b 65 72 20 66  * Epoch marker f
1730: 6f 72 20 64 69 63 74 69 6f 6e 61 72 79 20 62 65  or dictionary be
1740: 69 6e 67 20 73 65 61 72 63 68 65 64 2c 0d 0a 20  ing searched,.. 
1750: 09 09 09 09 20 2a 20 6f 72 20 2d 31 20 69 66 20  .... * or -1 if 
1760: 73 65 61 72 63 68 20 68 61 73 20 74 65 72 6d 69  search has termi
1770: 6e 61 74 65 64 2e 20 2a 2f 0d 0a 20 20 20 20 20  nated. */..     
1780: 54 63 6c 5f 44 69 63 74 20 64 69 63 74 69 6f 6e  Tcl_Dict diction
1790: 61 72 79 50 74 72 3b 09 2f 2a 20 52 65 66 65 72  aryPtr;./* Refer
17a0: 65 6e 63 65 20 74 6f 20 64 69 63 74 69 6f 6e 61  ence to dictiona
17b0: 72 79 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ry being searche
17c0: 64 2e 20 2a 2f 0d 0a 2b 20 20 20 20 54 63 6c 5f  d. */..+    Tcl_
17d0: 4f 62 6a 20 2a 72 65 73 75 6c 74 4c 69 73 74 3b  Obj *resultList;
17e0: 09 2f 2a 20 4c 69 73 74 20 6f 66 20 72 65 73 75  ./* List of resu
17f0: 6c 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74  lt values from t
1800: 68 65 20 6c 6f 6f 70 20 62 6f 64 79 2e 20 2a 2f  he loop body. */
1810: 0d 0a 20 7d 20 54 63 6c 5f 44 69 63 74 53 65 61  .. } Tcl_DictSea
1820: 72 63 68 3b 0d 0a 20 0c 0d 0a 20 2f 2a 0d 0a 20  rch;.. ... /*.. 
1830: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a  --------------..
1880: 20 20 2a 20 46 6c 61 67 20 76 61 6c 75 65 73 20    * Flag values 
1890: 74 6f 20 70 61 73 73 20 74 6f 20 54 63 6c 5f 44  to pass to Tcl_D
18a0: 6f 4f 6e 65 45 76 65 6e 74 20 74 6f 20 64 69 73  oOneEvent to dis
18b0: 61 62 6c 65 20 73 65 61 72 63 68 65 73 20 66 6f  able searches fo
18c0: 72 20 73 6f 6d 65 20 6b 69 6e 64 73 20 6f 66 0d  r some kinds of.
18d0: 0a 0d 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 69  ...Index: generi
18e0: 63 2f 74 63 6c 42 61 73 69 63 2e 63 0d 0a 3d 3d  c/tclBasic.c..==
18f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1920: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1930: 0d 0a 2d 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63  ..--- generic/tc
1940: 6c 42 61 73 69 63 2e 63 0d 0a 2b 2b 2b 20 67 65  lBasic.c..+++ ge
1950: 6e 65 72 69 63 2f 74 63 6c 42 61 73 69 63 2e 63  neric/tclBasic.c
1960: 0d 0a 40 40 20 2d 32 33 35 2c 31 30 20 2b 32 33  ..@@ -235,10 +23
1970: 35 2c 31 31 20 40 40 0d 0a 20 20 20 20 20 7b 22  5,11 @@..     {"
1980: 6c 72 65 70 6c 61 63 65 22 2c 09 54 63 6c 5f 4c  lreplace",.Tcl_L
1990: 72 65 70 6c 61 63 65 4f 62 6a 43 6d 64 2c 09 54  replaceObjCmd,.T
19a0: 63 6c 43 6f 6d 70 69 6c 65 4c 72 65 70 6c 61 63  clCompileLreplac
19b0: 65 43 6d 64 2c 09 4e 55 4c 4c 2c 09 31 7d 2c 0d  eCmd,.NULL,.1},.
19c0: 0a 20 20 20 20 20 7b 22 6c 72 65 76 65 72 73 65  .     {"lreverse
19d0: 22 2c 09 54 63 6c 5f 4c 72 65 76 65 72 73 65 4f  ",.Tcl_LreverseO
19e0: 62 6a 43 6d 64 2c 09 4e 55 4c 4c 2c 09 09 09 4e  bjCmd,.NULL,...N
19f0: 55 4c 4c 2c 09 31 7d 2c 0d 0a 20 20 20 20 20 7b  ULL,.1},..     {
1a00: 22 6c 73 65 61 72 63 68 22 2c 09 09 54 63 6c 5f  "lsearch",..Tcl_
1a10: 4c 73 65 61 72 63 68 4f 62 6a 43 6d 64 2c 09 4e  LsearchObjCmd,.N
1a20: 55 4c 4c 2c 09 09 09 4e 55 4c 4c 2c 09 31 7d 2c  ULL,...NULL,.1},
1a30: 0d 0a 20 20 20 20 20 7b 22 6c 73 65 74 22 2c 09  ..     {"lset",.
1a40: 09 54 63 6c 5f 4c 73 65 74 4f 62 6a 43 6d 64 2c  .Tcl_LsetObjCmd,
1a50: 09 09 54 63 6c 43 6f 6d 70 69 6c 65 4c 73 65 74  ..TclCompileLset
1a60: 43 6d 64 2c 09 4e 55 4c 4c 2c 09 31 7d 2c 0d 0a  Cmd,.NULL,.1},..
1a70: 20 20 20 20 20 7b 22 6c 73 6f 72 74 22 2c 09 09       {"lsort",..
1a80: 54 63 6c 5f 4c 73 6f 72 74 4f 62 6a 43 6d 64 2c  Tcl_LsortObjCmd,
1a90: 09 4e 55 4c 4c 2c 09 09 09 4e 55 4c 4c 2c 09 31  .NULL,...NULL,.1
1aa0: 7d 2c 0d 0a 2b 20 20 20 20 7b 22 6d 61 70 65 61  },..+    {"mapea
1ab0: 63 68 22 2c 09 09 54 63 6c 5f 4d 61 70 65 61 63  ch",..Tcl_Mapeac
1ac0: 68 4f 62 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d 70  hObjCmd,.TclComp
1ad0: 69 6c 65 4d 61 70 65 61 63 68 43 6d 64 2c 09 54  ileMapeachCmd,.T
1ae0: 63 6c 4e 52 4d 61 70 65 61 63 68 43 6d 64 2c 09  clNRMapeachCmd,.
1af0: 31 7d 2c 0d 0a 20 20 20 20 20 7b 22 70 61 63 6b  1},..     {"pack
1b00: 61 67 65 22 2c 09 09 54 63 6c 5f 50 61 63 6b 61  age",..Tcl_Packa
1b10: 67 65 4f 62 6a 43 6d 64 2c 09 4e 55 4c 4c 2c 09  geObjCmd,.NULL,.
1b20: 09 09 4e 55 4c 4c 2c 09 31 7d 2c 0d 0a 20 20 20  ..NULL,.1},..   
1b30: 20 20 7b 22 70 72 6f 63 22 2c 09 09 54 63 6c 5f    {"proc",..Tcl_
1b40: 50 72 6f 63 4f 62 6a 43 6d 64 2c 09 09 4e 55 4c  ProcObjCmd,..NUL
1b50: 4c 2c 09 09 09 4e 55 4c 4c 2c 09 31 7d 2c 0d 0a  L,...NULL,.1},..
1b60: 20 20 20 20 20 7b 22 72 65 67 65 78 70 22 2c 09       {"regexp",.
1b70: 09 54 63 6c 5f 52 65 67 65 78 70 4f 62 6a 43 6d  .Tcl_RegexpObjCm
1b80: 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 52 65 67  d,.TclCompileReg
1b90: 65 78 70 43 6d 64 2c 09 4e 55 4c 4c 2c 09 31 7d  expCmd,.NULL,.1}
1ba0: 2c 0d 0a 20 20 20 20 20 7b 22 72 65 67 73 75 62  ,..     {"regsub
1bb0: 22 2c 09 09 54 63 6c 5f 52 65 67 73 75 62 4f 62  ",..Tcl_RegsubOb
1bc0: 6a 43 6d 64 2c 09 4e 55 4c 4c 2c 09 09 09 4e 55  jCmd,.NULL,...NU
1bd0: 4c 4c 2c 09 31 7d 2c 0d 0a 20 20 20 20 20 7b 22  LL,.1},..     {"
1be0: 72 65 6e 61 6d 65 22 2c 09 09 54 63 6c 5f 52 65  rename",..Tcl_Re
1bf0: 6e 61 6d 65 4f 62 6a 43 6d 64 2c 09 4e 55 4c 4c  nameObjCmd,.NULL
1c00: 2c 09 09 09 4e 55 4c 4c 2c 09 31 7d 2c 0d 0a 40  ,...NULL,.1},..@
1c10: 40 20 2d 38 38 34 37 2c 31 31 20 2b 38 38 34 38  @ -8847,11 +8848
1c20: 2c 31 31 20 40 40 0d 0a 20 20 20 20 20 54 63 6c  ,11 @@..     Tcl
1c30: 4e 52 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  NREvalObjEx(inte
1c40: 72 70 2c 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  rp, Tcl_NewListO
1c50: 62 6a 28 6f 62 6a 63 2d 32 2c 20 6f 62 6a 76 2b  bj(objc-2, objv+
1c60: 32 29 2c 20 30 2c 20 4e 55 4c 4c 2c 20 49 4e 54  2), 0, NULL, INT
1c70: 5f 4d 49 4e 29 3b 0d 0a 20 20 20 20 20 69 50 74  _MIN);..     iPt
1c80: 72 2d 3e 65 78 65 63 45 6e 76 50 74 72 20 3d 20  r->execEnvPtr = 
1c90: 73 61 76 65 64 45 45 50 74 72 3b 0d 0a 20 0d 0a  savedEEPtr;.. ..
1ca0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
1cb0: 4f 4b 3b 0d 0a 20 7d 0d 0a 2d 0d 0a 2b 0c 0d 0a  OK;.. }..-..+...
1cc0: 20 69 6e 74 0d 0a 20 54 63 6c 4e 52 49 6e 74 65   int.. TclNRInte
1cd0: 72 70 43 6f 72 6f 75 74 69 6e 65 28 0d 0a 20 20  rpCoroutine(..  
1ce0: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c     ClientData cl
1cf0: 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20  ientData,..     
1d00: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d10: 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  rp,../* Current 
1d20: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0d  interpreter. */.
1d30: 0a 20 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09  .     int objc,.
1d40: 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61  ../* Number of a
1d50: 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0d 0a 0d 0a  rguments. */....
1d60: 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74  Index: generic/t
1d70: 63 6c 43 6d 64 41 48 2e 63 0d 0a 3d 3d 3d 3d 3d  clCmdAH.c..=====
1d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1da0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1db0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a 2d  =============..-
1dc0: 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c 43 6d  -- generic/tclCm
1dd0: 64 41 48 2e 63 0d 0a 2b 2b 2b 20 67 65 6e 65 72  dAH.c..+++ gener
1de0: 69 63 2f 74 63 6c 43 6d 64 41 48 2e 63 0d 0a 40  ic/tclCmdAH.c..@
1df0: 40 20 2d 33 30 2c 31 30 20 2b 33 30 2c 31 31 20  @ -30,10 +30,11 
1e00: 40 40 0d 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a  @@..     Tcl_Obj
1e10: 20 2a 2a 2a 76 61 72 76 4c 69 73 74 3b 09 2f 2a   ***varvList;./*
1e20: 20 41 72 72 61 79 20 6f 66 20 76 61 72 20 6e 61   Array of var na
1e30: 6d 65 20 6c 69 73 74 73 2e 20 2a 2f 0d 0a 20 20  me lists. */..  
1e40: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 76 43 6f     Tcl_Obj **vCo
1e50: 70 79 4c 69 73 74 3b 09 2f 2a 20 43 6f 70 69 65  pyList;./* Copie
1e60: 73 20 6f 66 20 76 61 72 20 6e 61 6d 65 20 6c 69  s of var name li
1e70: 73 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f  st arguments. */
1e80: 0d 0a 20 20 20 20 20 69 6e 74 20 2a 61 72 67 63  ..     int *argc
1e90: 4c 69 73 74 3b 09 09 2f 2a 20 41 72 72 61 79 20  List;../* Array 
1ea0: 6f 66 20 76 61 6c 75 65 20 6c 69 73 74 20 73 69  of value list si
1eb0: 7a 65 73 2e 20 2a 2f 0d 0a 20 20 20 20 20 54 63  zes. */..     Tc
1ec0: 6c 5f 4f 62 6a 20 2a 2a 2a 61 72 67 76 4c 69 73  l_Obj ***argvLis
1ed0: 74 3b 09 2f 2a 20 41 72 72 61 79 20 6f 66 20 76  t;./* Array of v
1ee0: 61 6c 75 65 20 6c 69 73 74 73 2e 20 2a 2f 0d 0a  alue lists. */..
1ef0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61       Tcl_Obj **a
1f00: 43 6f 70 79 4c 69 73 74 3b 09 2f 2a 20 43 6f 70  CopyList;./* Cop
1f10: 69 65 73 20 6f 66 20 76 61 6c 75 65 20 6c 69 73  ies of value lis
1f20: 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0d  t arguments. */.
1f30: 0a 2b 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72  .+    Tcl_Obj *r
1f40: 65 73 75 6c 74 4c 69 73 74 3b 09 2f 2a 20 4c 69  esultList;./* Li
1f50: 73 74 20 6f 66 20 72 65 73 75 6c 74 20 76 61 6c  st of result val
1f60: 75 65 73 20 66 72 6f 6d 20 74 68 65 20 6c 6f 6f  ues from the loo
1f70: 70 20 62 6f 64 79 2e 20 2a 2f 0d 0a 20 7d 3b 0d  p body. */.. };.
1f80: 0a 20 0d 0a 20 2f 2a 0d 0a 20 20 2a 20 50 72 6f  . .. /*..  * Pro
1f90: 74 6f 74 79 70 65 73 20 66 6f 72 20 6c 6f 63 61  totypes for loca
1fa0: 6c 20 70 72 6f 63 65 64 75 72 65 73 20 64 65 66  l procedures def
1fb0: 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c  ined in this fil
1fc0: 65 3a 0d 0a 20 20 2a 2f 0d 0a 40 40 20 2d 35 30  e:..  */..@@ -50
1fd0: 2c 31 30 20 2b 35 31 2c 31 32 20 40 40 0d 0a 20  ,10 +51,12 @@.. 
1fe0: 73 74 61 74 69 63 20 69 6e 74 09 09 47 65 74 53  static int..GetS
1ff0: 74 61 74 42 75 66 28 54 63 6c 5f 49 6e 74 65 72  tatBuf(Tcl_Inter
2000: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
2010: 62 6a 20 2a 70 61 74 68 50 74 72 2c 0d 0a 20 09  bj *pathPtr,.. .
2020: 09 09 20 20 20 20 54 63 6c 5f 46 53 53 74 61 74  ..    Tcl_FSStat
2030: 50 72 6f 63 20 2a 73 74 61 74 50 72 6f 63 2c 20  Proc *statProc, 
2040: 54 63 6c 5f 53 74 61 74 42 75 66 20 2a 73 74 61  Tcl_StatBuf *sta
2050: 74 50 74 72 29 3b 0d 0a 20 73 74 61 74 69 63 20  tPtr);.. static 
2060: 63 6f 6e 73 74 20 63 68 61 72 20 2a 09 47 65 74  const char *.Get
2070: 54 79 70 65 46 72 6f 6d 4d 6f 64 65 28 69 6e 74  TypeFromMode(int
2080: 20 6d 6f 64 65 29 3b 0d 0a 20 73 74 61 74 69 63   mode);.. static
2090: 20 69 6e 74 09 09 53 74 6f 72 65 53 74 61 74 44   int..StoreStatD
20a0: 61 74 61 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ata(Tcl_Interp *
20b0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20  interp, Tcl_Obj 
20c0: 2a 76 61 72 4e 61 6d 65 2c 0d 0a 20 09 09 09 20  *varName,.. ... 
20d0: 20 20 20 54 63 6c 5f 53 74 61 74 42 75 66 20 2a     Tcl_StatBuf *
20e0: 73 74 61 74 50 74 72 29 3b 0d 0a 2b 73 74 61 74  statPtr);..+stat
20f0: 69 63 20 69 6e 74 09 09 54 63 6c 4e 52 45 61 63  ic int..TclNREac
2100: 68 6c 6f 6f 70 43 6d 64 28 43 6c 69 65 6e 74 44  hloopCmd(ClientD
2110: 61 74 61 20 64 75 6d 6d 79 2c 20 54 63 6c 5f 49  ata dummy, Tcl_I
2120: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a  nterp *interp,..
2130: 2b 09 09 09 20 20 20 20 69 6e 74 20 6f 62 6a 63  +...    int objc
2140: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
2150: 20 6f 62 6a 76 5b 5d 2c 20 69 6e 74 20 63 6f 6c   objv[], int col
2160: 6c 65 63 74 29 3b 0d 0a 20 73 74 61 74 69 63 20  lect);.. static 
2170: 54 63 6c 5f 4e 52 50 6f 73 74 50 72 6f 63 09 43  Tcl_NRPostProc.C
2180: 61 74 63 68 4f 62 6a 43 6d 64 43 61 6c 6c 62 61  atchObjCmdCallba
2190: 63 6b 3b 0d 0a 20 73 74 61 74 69 63 20 54 63 6c  ck;.. static Tcl
21a0: 5f 4e 52 50 6f 73 74 50 72 6f 63 09 45 78 70 72  _NRPostProc.Expr
21b0: 43 61 6c 6c 62 61 63 6b 3b 0d 0a 20 73 74 61 74  Callback;.. stat
21c0: 69 63 20 54 63 6c 5f 4e 52 50 6f 73 74 50 72 6f  ic Tcl_NRPostPro
21d0: 63 09 46 6f 72 53 65 74 75 70 43 61 6c 6c 62 61  c.ForSetupCallba
21e0: 63 6b 3b 0d 0a 20 73 74 61 74 69 63 20 54 63 6c  ck;.. static Tcl
21f0: 5f 4e 52 50 6f 73 74 50 72 6f 63 09 46 6f 72 43  _NRPostProc.ForC
2200: 6f 6e 64 43 61 6c 6c 62 61 63 6b 3b 0d 0a 20 73  ondCallback;.. s
2210: 74 61 74 69 63 20 54 63 6c 5f 4e 52 50 6f 73 74  tatic Tcl_NRPost
2220: 50 72 6f 63 09 46 6f 72 4e 65 78 74 43 61 6c 6c  Proc.ForNextCall
2230: 62 61 63 6b 3b 0d 0a 40 40 20 2d 32 35 35 38 2c  back;..@@ -2558,
2240: 31 31 20 2b 32 35 36 31 2c 31 31 20 40 40 0d 0a  11 +2561,11 @@..
2250: 20 7d 0d 0a 20 0c 0d 0a 20 2f 2a 0d 0a 20 20 2a   }.. ... /*..  *
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 0d 0a 20 20 2a 0d 0a 2d 20 2a  ------..  *..- *
22b0: 20 54 63 6c 5f 46 6f 72 65 61 63 68 4f 62 6a 43   Tcl_ForeachObjC
22c0: 6d 64 2c 20 54 63 6c 4e 52 46 6f 72 65 61 63 68  md, TclNRForeach
22d0: 43 6d 64 20 2d 2d 0d 0a 2b 20 2a 20 54 63 6c 5f  Cmd --..+ * Tcl_
22e0: 46 6f 72 65 61 63 68 4f 62 6a 43 6d 64 2c 20 54  ForeachObjCmd, T
22f0: 63 6c 4e 52 46 6f 72 65 61 63 68 43 6d 64 2c 20  clNRForeachCmd, 
2300: 54 63 6c 4e 52 45 61 63 68 6c 6f 6f 70 43 6d 64  TclNREachloopCmd
2310: 20 2d 2d 0d 0a 20 20 2a 0d 0a 20 20 2a 09 54 68   --..  *..  *.Th
2320: 69 73 20 6f 62 6a 65 63 74 2d 62 61 73 65 64 20  is object-based 
2330: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
2340: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
2350: 74 68 65 20 22 66 6f 72 65 61 63 68 22 20 54 63  the "foreach" Tc
2360: 6c 0d 0a 20 20 2a 09 63 6f 6d 6d 61 6e 64 2e 20  l..  *.command. 
2370: 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63  See the user doc
2380: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64  umentation for d
2390: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69  etails on what i
23a0: 74 20 64 6f 65 73 2e 0d 0a 20 20 2a 0d 0a 20 20  t does...  *..  
23b0: 2a 20 52 65 73 75 6c 74 73 3a 0d 0a 40 40 20 2d  * Results:..@@ -
23c0: 32 35 39 30 2c 31 30 20 2b 32 35 39 33 2c 34 32  2590,10 +2593,42
23d0: 20 40 40 0d 0a 20 20 20 20 20 43 6c 69 65 6e 74   @@..     Client
23e0: 44 61 74 61 20 64 75 6d 6d 79 2c 0d 0a 20 20 20  Data dummy,..   
23f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2400: 74 65 72 70 2c 0d 0a 20 20 20 20 20 69 6e 74 20  terp,..     int 
2410: 6f 62 6a 63 2c 0d 0a 20 20 20 20 20 54 63 6c 5f  objc,..     Tcl_
2420: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
2430: 5d 29 0d 0a 20 7b 0d 0a 2b 20 20 20 20 72 65 74  ]).. {..+    ret
2440: 75 72 6e 20 54 63 6c 4e 52 45 61 63 68 6c 6f 6f  urn TclNREachloo
2450: 70 43 6d 64 28 64 75 6d 6d 79 2c 20 69 6e 74 65  pCmd(dummy, inte
2460: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20  rp, objc, objv, 
2470: 30 29 3b 0d 0a 2b 7d 0d 0a 2b 0d 0a 2b 69 6e 74  0);..+}..+..+int
2480: 0d 0a 2b 54 63 6c 5f 4d 61 70 65 61 63 68 4f 62  ..+Tcl_MapeachOb
2490: 6a 43 6d 64 28 0d 0a 2b 20 20 20 20 43 6c 69 65  jCmd(..+    Clie
24a0: 6e 74 44 61 74 61 20 64 75 6d 6d 79 2c 09 09 2f  ntData dummy,../
24b0: 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0d 0a  * Not used. */..
24c0: 2b 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  +    Tcl_Interp 
24d0: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72  *interp,../* Cur
24e0: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
24f0: 2e 20 2a 2f 0d 0a 2b 20 20 20 20 69 6e 74 20 6f  . */..+    int o
2500: 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72  bjc,.../* Number
2510: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a   of arguments. *
2520: 2f 0d 0a 2b 20 20 20 20 54 63 6c 5f 4f 62 6a 20  /..+    Tcl_Obj 
2530: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f  *const objv[])./
2540: 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63  * Argument objec
2550: 74 73 2e 20 2a 2f 0d 0a 2b 7b 0d 0a 2b 20 20 20  ts. */..+{..+   
2560: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43 61   return Tcl_NRCa
2570: 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72 70  llObjProc(interp
2580: 2c 20 54 63 6c 4e 52 4d 61 70 65 61 63 68 43 6d  , TclNRMapeachCm
2590: 64 2c 20 64 75 6d 6d 79 2c 20 6f 62 6a 63 2c 20  d, dummy, objc, 
25a0: 6f 62 6a 76 29 3b 0d 0a 2b 7d 0d 0a 2b 0d 0a 2b  objv);..+}..+..+
25b0: 69 6e 74 0d 0a 2b 54 63 6c 4e 52 4d 61 70 65 61  int..+TclNRMapea
25c0: 63 68 43 6d 64 28 0d 0a 2b 20 20 20 20 43 6c 69  chCmd(..+    Cli
25d0: 65 6e 74 44 61 74 61 20 64 75 6d 6d 79 2c 0d 0a  entData dummy,..
25e0: 2b 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  +    Tcl_Interp 
25f0: 2a 69 6e 74 65 72 70 2c 0d 0a 2b 20 20 20 20 69  *interp,..+    i
2600: 6e 74 20 6f 62 6a 63 2c 0d 0a 2b 20 20 20 20 54  nt objc,..+    T
2610: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
2620: 6a 76 5b 5d 29 0d 0a 2b 7b 0d 0a 2b 20 20 20 20  jv[])..+{..+    
2630: 72 65 74 75 72 6e 20 54 63 6c 4e 52 45 61 63 68  return TclNREach
2640: 6c 6f 6f 70 43 6d 64 28 64 75 6d 6d 79 2c 20 69  loopCmd(dummy, i
2650: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
2660: 76 2c 20 31 29 3b 0d 0a 2b 7d 0d 0a 2b 0d 0a 2b  v, 1);..+}..+..+
2670: 69 6e 74 0d 0a 2b 54 63 6c 4e 52 45 61 63 68 6c  int..+TclNREachl
2680: 6f 6f 70 43 6d 64 28 0d 0a 2b 20 20 20 20 43 6c  oopCmd(..+    Cl
2690: 69 65 6e 74 44 61 74 61 20 64 75 6d 6d 79 2c 0d  ientData dummy,.
26a0: 0a 2b 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  .+    Tcl_Interp
26b0: 20 2a 69 6e 74 65 72 70 2c 0d 0a 2b 20 20 20 20   *interp,..+    
26c0: 69 6e 74 20 6f 62 6a 63 2c 0d 0a 2b 20 20 20 20  int objc,..+    
26d0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
26e0: 62 6a 76 5b 5d 2c 0d 0a 2b 20 20 20 20 69 6e 74  bjv[],..+    int
26f0: 20 63 6f 6c 6c 65 63 74 29 09 09 2f 2a 20 46 6c   collect)../* Fl
2700: 61 67 20 3d 3d 20 31 20 74 6f 20 63 6f 6c 6c 65  ag == 1 to colle
2710: 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 6c 6f  ct and return lo
2720: 6f 70 20 62 6f 64 79 20 72 65 73 75 6c 74 2e 20  op body result. 
2730: 2a 2f 0d 0a 2b 7b 0d 0a 2b 0d 0a 20 20 20 20 20  */..+{..+..     
2740: 69 6e 74 20 6e 75 6d 4c 69 73 74 73 20 3d 20 28  int numLists = (
2750: 6f 62 6a 63 2d 32 29 20 2f 20 32 3b 0d 0a 20 20  objc-2) / 2;..  
2760: 20 20 20 72 65 67 69 73 74 65 72 20 73 74 72 75     register stru
2770: 63 74 20 46 6f 72 65 61 63 68 53 74 61 74 65 20  ct ForeachState 
2780: 2a 73 74 61 74 65 50 74 72 3b 0d 0a 20 20 20 20  *statePtr;..    
2790: 20 69 6e 74 20 69 2c 20 6a 2c 20 72 65 73 75 6c   int i, j, resul
27a0: 74 3b 0d 0a 20 0d 0a 20 20 20 20 20 69 66 20 28  t;.. ..     if (
27b0: 6f 62 6a 63 20 3c 20 34 20 7c 7c 20 28 6f 62 6a  objc < 4 || (obj
27c0: 63 25 32 20 21 3d 20 30 29 29 20 7b 0d 0a 40 40  c%2 != 0)) {..@@
27d0: 20 2d 32 36 33 32 2c 31 30 20 2b 32 36 36 37 2c   -2632,10 +2667,
27e0: 31 32 20 40 40 0d 0a 20 20 20 20 20 73 74 61 74  12 @@..     stat
27f0: 65 50 74 72 2d 3e 61 72 67 63 4c 69 73 74 20 3d  ePtr->argcList =
2800: 20 73 74 61 74 65 50 74 72 2d 3e 76 61 72 63 4c   statePtr->varcL
2810: 69 73 74 20 2b 20 6e 75 6d 4c 69 73 74 73 3b 0d  ist + numLists;.
2820: 0a 20 0d 0a 20 20 20 20 20 73 74 61 74 65 50 74  . ..     statePt
2830: 72 2d 3e 6e 75 6d 4c 69 73 74 73 20 3d 20 6e 75  r->numLists = nu
2840: 6d 4c 69 73 74 73 3b 0d 0a 20 20 20 20 20 73 74  mLists;..     st
2850: 61 74 65 50 74 72 2d 3e 62 6f 64 79 50 74 72 20  atePtr->bodyPtr 
2860: 3d 20 6f 62 6a 76 5b 6f 62 6a 63 20 2d 20 31 5d  = objv[objc - 1]
2870: 3b 0d 0a 20 20 20 20 20 73 74 61 74 65 50 74 72  ;..     statePtr
2880: 2d 3e 62 6f 64 79 49 64 78 20 3d 20 6f 62 6a 63  ->bodyIdx = objc
2890: 20 2d 20 31 3b 0d 0a 2b 0d 0a 2b 20 20 20 20 73   - 1;..+..+    s
28a0: 74 61 74 65 50 74 72 2d 3e 72 65 73 75 6c 74 4c  tatePtr->resultL
28b0: 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  ist = Tcl_NewLis
28c0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0d 0a  tObj(0, NULL);..
28d0: 20 0d 0a 20 20 20 20 20 2f 2a 0d 0a 20 20 20 20   ..     /*..    
28e0: 20 20 2a 20 42 72 65 61 6b 20 75 70 20 74 68 65    * Break up the
28f0: 20 76 61 6c 75 65 20 6c 69 73 74 73 20 61 6e 64   value lists and
2900: 20 76 61 72 69 61 62 6c 65 20 6c 69 73 74 73 20   variable lists 
2910: 69 6e 74 6f 20 65 6c 65 6d 65 6e 74 73 2e 0d 0a  into elements...
2920: 20 20 20 20 20 20 2a 2f 0d 0a 20 0d 0a 40 40 20        */.. ..@@ 
2930: 2d 32 36 38 31 2c 31 31 20 2b 32 37 31 38 2c 31  -2681,11 +2718,1
2940: 31 20 40 40 0d 0a 20 09 72 65 73 75 6c 74 20 3d  1 @@.. .result =
2950: 20 46 6f 72 65 61 63 68 41 73 73 69 67 6e 6d 65   ForeachAssignme
2960: 6e 74 73 28 69 6e 74 65 72 70 2c 20 73 74 61 74  nts(interp, stat
2970: 65 50 74 72 29 3b 0d 0a 20 09 69 66 20 28 72 65  ePtr);.. .if (re
2980: 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 45 52 52 4f  sult == TCL_ERRO
2990: 52 29 20 7b 0d 0a 20 09 20 20 20 20 67 6f 74 6f  R) {.. .    goto
29a0: 20 64 6f 6e 65 3b 0d 0a 20 09 7d 0d 0a 20 0d 0a   done;.. .}.. ..
29b0: 2d 09 54 63 6c 4e 52 41 64 64 43 61 6c 6c 62 61  -.TclNRAddCallba
29c0: 63 6b 28 69 6e 74 65 72 70 2c 20 46 6f 72 65 61  ck(interp, Forea
29d0: 63 68 4c 6f 6f 70 53 74 65 70 2c 20 73 74 61 74  chLoopStep, stat
29e0: 65 50 74 72 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ePtr, NULL, NULL
29f0: 2c 20 4e 55 4c 4c 29 3b 0d 0a 2b 09 54 63 6c 4e  , NULL);..+.TclN
2a00: 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74  RAddCallback(int
2a10: 65 72 70 2c 20 46 6f 72 65 61 63 68 4c 6f 6f 70  erp, ForeachLoop
2a20: 53 74 65 70 2c 20 73 74 61 74 65 50 74 72 2c 20  Step, statePtr, 
2a30: 63 6f 6c 6c 65 63 74 2c 20 4e 55 4c 4c 2c 20 4e  collect, NULL, N
2a40: 55 4c 4c 29 3b 0d 0a 20 09 72 65 74 75 72 6e 20  ULL);.. .return 
2a50: 54 63 6c 4e 52 45 76 61 6c 4f 62 6a 45 78 28 69  TclNREvalObjEx(i
2a60: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63  nterp, objv[objc
2a70: 2d 31 5d 2c 20 30 2c 0d 0a 20 09 09 28 28 49 6e  -1], 0,.. ..((In
2a80: 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70 29 2d  terp *) interp)-
2a90: 3e 63 6d 64 46 72 61 6d 65 50 74 72 2c 20 6f 62  >cmdFramePtr, ob
2aa0: 6a 63 2d 31 29 3b 0d 0a 20 20 20 20 20 7d 0d 0a  jc-1);..     }..
2ab0: 20 0d 0a 20 20 20 20 20 2f 2a 0d 0a 40 40 20 2d   ..     /*..@@ -
2ac0: 32 37 30 38 2c 32 34 20 2b 32 37 34 35 2c 32 39  2708,24 +2745,29
2ad0: 20 40 40 0d 0a 20 20 20 20 20 43 6c 69 65 6e 74   @@..     Client
2ae0: 44 61 74 61 20 64 61 74 61 5b 5d 2c 0d 0a 20 20  Data data[],..  
2af0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
2b00: 6e 74 65 72 70 2c 0d 0a 20 20 20 20 20 69 6e 74  nterp,..     int
2b10: 20 72 65 73 75 6c 74 29 0d 0a 20 7b 0d 0a 20 20   result).. {..  
2b20: 20 20 20 72 65 67 69 73 74 65 72 20 73 74 72 75     register stru
2b30: 63 74 20 46 6f 72 65 61 63 68 53 74 61 74 65 20  ct ForeachState 
2b40: 2a 73 74 61 74 65 50 74 72 20 3d 20 64 61 74 61  *statePtr = data
2b50: 5b 30 5d 3b 0d 0a 2b 20 20 20 20 69 6e 74 20 63  [0];..+    int c
2b60: 6f 6c 6c 65 63 74 20 3d 20 28 69 6e 74 29 64 61  ollect = (int)da
2b70: 74 61 5b 31 5d 3b 0d 0a 20 0d 0a 20 20 20 20 20  ta[1];.. ..     
2b80: 2f 2a 0d 0a 20 20 20 20 20 20 2a 20 50 72 6f 63  /*..      * Proc
2b90: 65 73 73 20 74 68 65 20 72 65 73 75 6c 74 20 63  ess the result c
2ba0: 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 72 75  ode from this ru
2bb0: 6e 20 6f 66 20 74 68 65 20 5b 66 6f 72 65 61 63  n of the [foreac
2bc0: 68 5d 20 62 6f 64 79 2e 20 4e 6f 74 65 20 74 68  h] body. Note th
2bd0: 61 74 0d 0a 20 20 20 20 20 20 2a 20 74 68 69 73  at..      * this
2be0: 20 73 77 69 74 63 68 20 75 73 65 73 20 66 61 6c   switch uses fal
2bf0: 6c 74 68 72 6f 75 67 68 73 20 69 6e 20 73 65 76  lthroughs in sev
2c00: 65 72 61 6c 20 70 6c 61 63 65 73 2e 20 4d 61 69  eral places. Mai
2c10: 6e 74 61 69 6e 65 72 20 61 77 61 72 65 21 0d 0a  ntainer aware!..
2c20: 20 20 20 20 20 20 2a 2f 0d 0a 20 0d 0a 20 20 20        */.. ..   
2c30: 20 20 73 77 69 74 63 68 20 28 72 65 73 75 6c 74    switch (result
2c40: 29 20 7b 0d 0a 20 20 20 20 20 63 61 73 65 20 54  ) {..     case T
2c50: 43 4c 5f 43 4f 4e 54 49 4e 55 45 3a 0d 0a 20 09  CL_CONTINUE:.. .
2c60: 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b 3b  result = TCL_OK;
2c70: 0d 0a 2b 09 62 72 65 61 6b 3b 0d 0a 20 20 20 20  ..+.break;..    
2c80: 20 63 61 73 65 20 54 43 4c 5f 4f 4b 3a 0d 0a 2b   case TCL_OK:..+
2c90: 09 69 66 20 28 63 6f 6c 6c 65 63 74 20 3d 3d 20  .if (collect == 
2ca0: 31 29 20 7b 0d 0a 2b 09 20 20 54 63 6c 5f 4c 69  1) {..+.  Tcl_Li
2cb0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2cc0: 6e 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  nt(interp, state
2cd0: 50 74 72 2d 3e 72 65 73 75 6c 74 4c 69 73 74 2c  Ptr->resultList,
2ce0: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
2cf0: 74 28 69 6e 74 65 72 70 29 29 3b 0d 0a 2b 09 7d  t(interp));..+.}
2d00: 0d 0a 20 09 62 72 65 61 6b 3b 0d 0a 20 20 20 20  .. .break;..    
2d10: 20 63 61 73 65 20 54 43 4c 5f 42 52 45 41 4b 3a   case TCL_BREAK:
2d20: 0d 0a 20 09 72 65 73 75 6c 74 20 3d 20 54 43 4c  .. .result = TCL
2d30: 5f 4f 4b 3b 0d 0a 2d 09 67 6f 74 6f 20 64 6f 6e  _OK;..-.goto don
2d40: 65 3b 0d 0a 2b 09 67 6f 74 6f 20 66 69 6e 69 73  e;..+.goto finis
2d50: 68 3b 0d 0a 20 20 20 20 20 63 61 73 65 20 54 43  h;..     case TC
2d60: 4c 5f 45 52 52 4f 52 3a 0d 0a 20 09 54 63 6c 5f  L_ERROR:.. .Tcl_
2d70: 41 70 70 65 6e 64 4f 62 6a 54 6f 45 72 72 6f 72  AppendObjToError
2d80: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c  Info(interp, Tcl
2d90: 5f 4f 62 6a 50 72 69 6e 74 66 28 0d 0a 20 09 09  _ObjPrintf(.. ..
2da0: 22 5c 6e 20 20 20 20 28 5c 22 66 6f 72 65 61 63  "\n    (\"foreac
2db0: 68 5c 22 20 62 6f 64 79 20 6c 69 6e 65 20 25 64  h\" body line %d
2dc0: 29 22 2c 20 54 63 6c 5f 47 65 74 45 72 72 6f 72  )", Tcl_GetError
2dd0: 4c 69 6e 65 28 69 6e 74 65 72 70 29 29 29 3b 0d  Line(interp)));.
2de0: 0a 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a  .     default:..
2df0: 20 09 67 6f 74 6f 20 64 6f 6e 65 3b 0d 0a 40 40   .goto done;..@@
2e00: 20 2d 32 37 34 30 2c 32 30 20 2b 32 37 38 32 2c   -2740,20 +2782,
2e10: 32 31 20 40 40 0d 0a 20 09 72 65 73 75 6c 74 20  21 @@.. .result 
2e20: 3d 20 46 6f 72 65 61 63 68 41 73 73 69 67 6e 6d  = ForeachAssignm
2e30: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 73 74 61  ents(interp, sta
2e40: 74 65 50 74 72 29 3b 0d 0a 20 09 69 66 20 28 72  tePtr);.. .if (r
2e50: 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 45 52 52  esult == TCL_ERR
2e60: 4f 52 29 20 7b 0d 0a 20 09 20 20 20 20 67 6f 74  OR) {.. .    got
2e70: 6f 20 64 6f 6e 65 3b 0d 0a 20 09 7d 0d 0a 20 0d  o done;.. .}.. .
2e80: 0a 2d 09 54 63 6c 4e 52 41 64 64 43 61 6c 6c 62  .-.TclNRAddCallb
2e90: 61 63 6b 28 69 6e 74 65 72 70 2c 20 46 6f 72 65  ack(interp, Fore
2ea0: 61 63 68 4c 6f 6f 70 53 74 65 70 2c 20 73 74 61  achLoopStep, sta
2eb0: 74 65 50 74 72 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  tePtr, NULL, NUL
2ec0: 4c 2c 20 4e 55 4c 4c 29 3b 0d 0a 2b 09 54 63 6c  L, NULL);..+.Tcl
2ed0: 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e  NRAddCallback(in
2ee0: 74 65 72 70 2c 20 46 6f 72 65 61 63 68 4c 6f 6f  terp, ForeachLoo
2ef0: 70 53 74 65 70 2c 20 73 74 61 74 65 50 74 72 2c  pStep, statePtr,
2f00: 20 63 6f 6c 6c 65 63 74 2c 20 4e 55 4c 4c 2c 20   collect, NULL, 
2f10: 4e 55 4c 4c 29 3b 0d 0a 20 09 72 65 74 75 72 6e  NULL);.. .return
2f20: 20 54 63 6c 4e 52 45 76 61 6c 4f 62 6a 45 78 28   TclNREvalObjEx(
2f30: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
2f40: 2d 3e 62 6f 64 79 50 74 72 2c 20 30 2c 0d 0a 20  ->bodyPtr, 0,.. 
2f50: 09 09 28 28 49 6e 74 65 72 70 20 2a 29 20 69 6e  ..((Interp *) in
2f60: 74 65 72 70 29 2d 3e 63 6d 64 46 72 61 6d 65 50  terp)->cmdFrameP
2f70: 74 72 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 6f  tr, statePtr->bo
2f80: 64 79 49 64 78 29 3b 0d 0a 20 20 20 20 20 7d 0d  dyIdx);..     }.
2f90: 0a 20 0d 0a 20 20 20 20 20 2f 2a 0d 0a 20 20 20  . ..     /*..   
2fa0: 20 20 20 2a 20 57 65 27 72 65 20 64 6f 6e 65 2e     * We're done.
2fb0: 20 54 69 64 79 20 75 70 20 6f 75 72 20 77 6f 72   Tidy up our wor
2fc0: 6b 20 73 70 61 63 65 20 61 6e 64 20 66 69 6e 69  k space and fini
2fd0: 73 68 20 6f 66 66 2e 0d 0a 20 20 20 20 20 20 2a  sh off...      *
2fe0: 2f 0d 0a 2d 0d 0a 2d 20 20 20 20 54 63 6c 5f 52  /..-..-    Tcl_R
2ff0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
3000: 70 29 3b 0d 0a 2b 20 20 66 69 6e 69 73 68 3a 0d  p);..+  finish:.
3010: 0a 2b 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  .+    Tcl_SetObj
3020: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
3030: 74 61 74 65 50 74 72 2d 3e 72 65 73 75 6c 74 4c  tatePtr->resultL
3040: 69 73 74 29 3b 0d 0a 2b 20 20 20 20 73 74 61 74  ist);..+    stat
3050: 65 50 74 72 2d 3e 72 65 73 75 6c 74 4c 69 73 74  ePtr->resultList
3060: 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 44 6f 6e 27   = NULL; /* Don'
3070: 74 20 63 6c 65 61 6e 20 69 74 20 75 70 20 2a 2f  t clean it up */
3080: 0d 0a 20 20 20 64 6f 6e 65 3a 0d 0a 20 20 20 20  ..   done:..    
3090: 20 46 6f 72 65 61 63 68 43 6c 65 61 6e 75 70 28   ForeachCleanup(
30a0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
30b0: 29 3b 0d 0a 20 20 20 20 20 72 65 74 75 72 6e 20  );..     return 
30c0: 72 65 73 75 6c 74 3b 0d 0a 20 7d 0d 0a 20 0d 0a  result;.. }.. ..
30d0: 40 40 20 2d 32 38 31 30 2c 31 30 20 2b 32 38 35  @@ -2810,10 +285
30e0: 33 2c 31 33 20 40 40 0d 0a 20 09 20 20 20 20 54  3,13 @@.. .    T
30f0: 63 6c 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  clDecrRefCount(s
3100: 74 61 74 65 50 74 72 2d 3e 76 43 6f 70 79 4c 69  tatePtr->vCopyLi
3110: 73 74 5b 69 5d 29 3b 0d 0a 20 09 7d 0d 0a 20 09  st[i]);.. .}.. .
3120: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 61 43  if (statePtr->aC
3130: 6f 70 79 4c 69 73 74 5b 69 5d 29 20 7b 0d 0a 20  opyList[i]) {.. 
3140: 09 20 20 20 20 54 63 6c 44 65 63 72 52 65 66 43  .    TclDecrRefC
3150: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 61  ount(statePtr->a
3160: 43 6f 70 79 4c 69 73 74 5b 69 5d 29 3b 0d 0a 20  CopyList[i]);.. 
3170: 09 7d 0d 0a 2b 09 69 66 20 28 73 74 61 74 65 50  .}..+.if (stateP
3180: 74 72 2d 3e 72 65 73 75 6c 74 4c 69 73 74 29 20  tr->resultList) 
3190: 7b 0d 0a 2b 09 20 20 20 20 54 63 6c 44 65 63 72  {..+.    TclDecr
31a0: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
31b0: 72 2d 3e 72 65 73 75 6c 74 4c 69 73 74 29 3b 0d  r->resultList);.
31c0: 0a 2b 09 7d 0d 0a 20 20 20 20 20 7d 0d 0a 20 20  .+.}..     }..  
31d0: 20 20 20 54 63 6c 53 74 61 63 6b 46 72 65 65 28     TclStackFree(
31e0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
31f0: 29 3b 0d 0a 20 7d 0d 0a 20 0c 0d 0a 20 2f 2a 0d  );.. }.. ... /*.
3200: 0a 0d 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 69  ...Index: generi
3210: 63 2f 74 63 6c 43 6f 6d 70 43 6d 64 73 2e 63 0d  c/tclCompCmds.c.
3220: 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .===============
3230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3260: 3d 3d 3d 0d 0a 2d 2d 2d 20 67 65 6e 65 72 69 63  ===..--- generic
3270: 2f 74 63 6c 43 6f 6d 70 43 6d 64 73 2e 63 0d 0a  /tclCompCmds.c..
3280: 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 43  +++ generic/tclC
3290: 6f 6d 70 43 6d 64 73 2e 63 0d 0a 40 40 20 2d 33  ompCmds.c..@@ -3
32a0: 38 2c 31 30 20 2b 33 38 2c 31 37 20 40 40 0d 0a  8,10 +38,17 @@..
32b0: 20 73 74 61 74 69 63 20 69 6e 74 09 09 50 75 73   static int..Pus
32c0: 68 56 61 72 4e 61 6d 65 28 54 63 6c 5f 49 6e 74  hVarName(Tcl_Int
32d0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 20 09  erp *interp,.. .
32e0: 09 09 20 20 20 20 54 63 6c 5f 54 6f 6b 65 6e 20  ..    Tcl_Token 
32f0: 2a 76 61 72 54 6f 6b 65 6e 50 74 72 2c 20 43 6f  *varTokenPtr, Co
3300: 6d 70 69 6c 65 45 6e 76 20 2a 65 6e 76 50 74 72  mpileEnv *envPtr
3310: 2c 0d 0a 20 09 09 09 20 20 20 20 69 6e 74 20 66  ,.. ...    int f
3320: 6c 61 67 73 2c 20 69 6e 74 20 2a 6c 6f 63 61 6c  lags, int *local
3330: 49 6e 64 65 78 50 74 72 2c 0d 0a 20 09 09 09 20  IndexPtr,.. ... 
3340: 20 20 20 69 6e 74 20 2a 73 69 6d 70 6c 65 56 61     int *simpleVa
3350: 72 4e 61 6d 65 50 74 72 2c 20 69 6e 74 20 2a 69  rNamePtr, int *i
3360: 73 53 63 61 6c 61 72 50 74 72 2c 0d 0a 20 09 09  sScalarPtr,.. ..
3370: 09 20 20 20 20 69 6e 74 20 6c 69 6e 65 2c 20 69  .    int line, i
3380: 6e 74 20 2a 63 6c 4e 65 78 74 29 3b 0d 0a 2b 73  nt *clNext);..+s
3390: 74 61 74 69 63 20 69 6e 74 20 20 20 20 20 20 54  tatic int      T
33a0: 63 6c 43 6f 6d 70 69 6c 65 45 61 63 68 6c 6f 6f  clCompileEachloo
33b0: 70 43 6d 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  pCmd(Tcl_Interp 
33c0: 2a 69 6e 74 65 72 70 2c 0d 0a 2b 20 20 20 20 20  *interp,..+     
33d0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 50             Tcl_P
33e0: 61 72 73 65 20 2a 70 61 72 73 65 50 74 72 2c 20  arse *parsePtr, 
33f0: 43 6f 6d 6d 61 6e 64 20 2a 63 6d 64 50 74 72 2c  Command *cmdPtr,
3400: 20 20 20 20 43 6f 6d 70 69 6c 65 45 6e 76 20 2a      CompileEnv *
3410: 65 6e 76 50 74 72 2c 0d 0a 2b 20 20 20 20 20 20  envPtr,..+      
3420: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f            int co
3430: 6c 6c 65 63 74 29 3b 0d 0a 2b 73 74 61 74 69 63  llect);..+static
3440: 20 69 6e 74 09 09 54 63 6c 43 6f 6d 70 69 6c 65   int..TclCompile
3450: 44 69 63 74 45 61 63 68 43 6d 64 28 54 63 6c 5f  DictEachCmd(Tcl_
3460: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d  Interp *interp,.
3470: 0a 2b 09 09 09 20 20 20 20 54 63 6c 5f 50 61 72  .+...    Tcl_Par
3480: 73 65 20 2a 70 61 72 73 65 50 74 72 2c 20 43 6f  se *parsePtr, Co
3490: 6d 6d 61 6e 64 20 2a 63 6d 64 50 74 72 2c 0d 0a  mmand *cmdPtr,..
34a0: 2b 09 09 09 20 20 20 20 73 74 72 75 63 74 20 43  +...    struct C
34b0: 6f 6d 70 69 6c 65 45 6e 76 20 2a 65 6e 76 50 74  ompileEnv *envPt
34c0: 72 2c 20 69 6e 74 20 63 6f 6c 6c 65 63 74 29 3b  r, int collect);
34d0: 0d 0a 2b 0d 0a 20 0d 0a 20 2f 2a 0d 0a 20 20 2a  ..+.. .. /*..  *
34e0: 20 4d 61 63 72 6f 20 74 68 61 74 20 65 6e 63 61   Macro that enca
34f0: 70 73 75 6c 61 74 65 73 20 61 6e 20 65 66 66 69  psulates an effi
3500: 63 69 65 6e 63 79 20 74 72 69 63 6b 20 74 68 61  ciency trick tha
3510: 74 20 61 76 6f 69 64 73 20 61 20 66 75 6e 63 74  t avoids a funct
3520: 69 6f 6e 20 63 61 6c 6c 20 66 6f 72 0d 0a 20 20  ion call for..  
3530: 2a 20 74 68 65 20 73 69 6d 70 6c 65 73 74 20 6f  * the simplest o
3540: 66 20 63 6f 6d 70 69 6c 65 73 2e 20 54 68 65 20  f compiles. The 
3550: 41 4e 53 49 20 43 20 22 70 72 6f 74 6f 74 79 70  ANSI C "prototyp
3560: 65 22 20 66 6f 72 20 74 68 69 73 20 6d 61 63 72  e" for this macr
3570: 6f 20 69 73 3a 0d 0a 20 20 2a 0d 0a 40 40 20 2d  o is:..  *..@@ -
3580: 35 38 34 2c 31 30 20 2b 35 39 31 2c 31 31 20 40  584,10 +591,11 @
3590: 40 0d 0a 20 20 2a 09 09 64 69 63 74 20 66 6f 72  @..  *..dict for
35a0: 0d 0a 20 20 2a 09 09 64 69 63 74 20 67 65 74 09  ..  *..dict get.
35b0: 5b 2a 5d 0d 0a 20 20 2a 09 09 64 69 63 74 20 69  [*]..  *..dict i
35c0: 6e 63 72 0d 0a 20 20 2a 09 09 64 69 63 74 20 6b  ncr..  *..dict k
35d0: 65 79 73 09 5b 2a 5d 0d 0a 20 20 2a 09 09 64 69  eys.[*]..  *..di
35e0: 63 74 20 6c 61 70 70 65 6e 64 0d 0a 2b 20 2a 09  ct lappend..+ *.
35f0: 09 64 69 63 74 20 6d 61 70 0d 0a 20 20 2a 09 09  .dict map..  *..
3600: 64 69 63 74 20 73 65 74 0d 0a 20 20 2a 09 09 64  dict set..  *..d
3610: 69 63 74 20 75 6e 73 65 74 0d 0a 20 20 2a 0d 0a  ict unset..  *..
3620: 20 20 2a 09 49 6e 20 70 72 61 63 74 69 63 65 2c    *.In practice,
3630: 20 74 68 6f 73 65 20 74 68 61 74 20 61 72 65 20   those that are 
3640: 70 75 72 65 2d 76 61 6c 75 65 20 6f 70 65 72 61  pure-value opera
3650: 74 6f 72 73 20 28 6d 61 72 6b 65 64 20 77 69 74  tors (marked wit
3660: 68 20 5b 2a 5d 29 20 63 61 6e 0d 0a 20 20 2a 09  h [*]) can..  *.
3670: 70 72 6f 62 61 62 6c 79 20 62 65 20 6c 65 66 74  probably be left
3680: 20 61 6c 6f 6e 65 20 28 65 78 63 65 70 74 20 70   alone (except p
3690: 65 72 68 61 70 73 20 5b 64 69 63 74 20 67 65 74  erhaps [dict get
36a0: 5d 20 77 68 69 63 68 20 69 73 20 76 65 72 79 20  ] which is very 
36b0: 76 65 72 79 0d 0a 40 40 20 2d 37 38 35 2c 31 35  very..@@ -785,15
36c0: 20 2b 37 39 33 2c 34 31 20 40 40 0d 0a 20 09 09   +793,41 @@.. ..
36d0: 09 09 20 2a 20 63 72 65 61 74 65 64 20 62 79 20  .. * created by 
36e0: 54 63 6c 5f 50 61 72 73 65 43 6f 6d 6d 61 6e 64  Tcl_ParseCommand
36f0: 2e 20 2a 2f 0d 0a 20 20 20 20 20 43 6f 6d 6d 61  . */..     Comma
3700: 6e 64 20 2a 63 6d 64 50 74 72 2c 09 09 2f 2a 20  nd *cmdPtr,../* 
3710: 50 6f 69 6e 74 73 20 74 6f 20 64 65 66 69 6e 74  Points to defint
3720: 69 6f 6e 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 62  ion of command b
3730: 65 69 6e 67 0d 0a 20 09 09 09 09 20 2a 20 63 6f  eing.. .... * co
3740: 6d 70 69 6c 65 64 2e 20 2a 2f 0d 0a 20 20 20 20  mpiled. */..    
3750: 20 43 6f 6d 70 69 6c 65 45 6e 76 20 2a 65 6e 76   CompileEnv *env
3760: 50 74 72 29 09 09 2f 2a 20 48 6f 6c 64 73 20 72  Ptr)../* Holds r
3770: 65 73 75 6c 74 69 6e 67 20 69 6e 73 74 72 75 63  esulting instruc
3780: 74 69 6f 6e 73 2e 20 2a 2f 0d 0a 20 7b 0d 0a 2b  tions. */.. {..+
3790: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 43 6f      return TclCo
37a0: 6d 70 69 6c 65 44 69 63 74 45 61 63 68 43 6d 64  mpileDictEachCmd
37b0: 28 69 6e 74 65 72 70 2c 20 70 61 72 73 65 50 74  (interp, parsePt
37c0: 72 2c 20 63 6d 64 50 74 72 2c 20 65 6e 76 50 74  r, cmdPtr, envPt
37d0: 72 2c 20 30 29 3b 0d 0a 2b 7d 0d 0a 2b 0d 0a 2b  r, 0);..+}..+..+
37e0: 69 6e 74 0d 0a 2b 54 63 6c 43 6f 6d 70 69 6c 65  int..+TclCompile
37f0: 44 69 63 74 4d 61 70 43 6d 64 28 0d 0a 2b 20 20  DictMapCmd(..+  
3800: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3810: 74 65 72 70 2c 20 20 20 20 20 2f 2a 20 55 73 65  terp,     /* Use
3820: 64 20 66 6f 72 20 6c 6f 6f 6b 69 6e 67 20 75 70  d for looking up
3830: 20 73 74 75 66 66 2e 20 2a 2f 0d 0a 2b 20 20 20   stuff. */..+   
3840: 20 54 63 6c 5f 50 61 72 73 65 20 2a 70 61 72 73   Tcl_Parse *pars
3850: 65 50 74 72 2c 20 20 20 20 2f 2a 20 50 6f 69 6e  ePtr,    /* Poin
3860: 74 73 20 74 6f 20 61 20 70 61 72 73 65 20 73 74  ts to a parse st
3870: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
3880: 63 6f 6d 6d 61 6e 64 0d 0a 2b 20 20 20 20 20 20  command..+      
3890: 20 20 20 20 20 20 20 20 20 20 20 2a 20 63 72 65             * cre
38a0: 61 74 65 64 20 62 79 20 54 63 6c 5f 50 61 72 73  ated by Tcl_Pars
38b0: 65 43 6f 6d 6d 61 6e 64 2e 20 2a 2f 0d 0a 2b 20  eCommand. */..+ 
38c0: 20 20 20 43 6f 6d 6d 61 6e 64 20 2a 63 6d 64 50     Command *cmdP
38d0: 74 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  tr,        /* Po
38e0: 69 6e 74 73 20 74 6f 20 64 65 66 69 6e 74 69 6f  ints to defintio
38f0: 6e 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 62 65 69  n of command bei
3900: 6e 67 0d 0a 2b 20 20 20 20 20 20 20 20 20 20 20  ng..+           
3910: 20 20 20 20 20 20 2a 20 63 6f 6d 70 69 6c 65 64        * compiled
3920: 2e 20 2a 2f 0d 0a 2b 20 20 20 20 43 6f 6d 70 69  . */..+    Compi
3930: 6c 65 45 6e 76 20 2a 65 6e 76 50 74 72 29 20 20  leEnv *envPtr)  
3940: 20 20 20 2f 2a 20 48 6f 6c 64 73 20 72 65 73 75     /* Holds resu
3950: 6c 74 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f  lting instructio
3960: 6e 73 2e 20 2a 2f 0d 0a 2b 7b 0d 0a 2b 20 20 20  ns. */..+{..+   
3970: 20 72 65 74 75 72 6e 20 54 63 6c 43 6f 6d 70 69   return TclCompi
3980: 6c 65 44 69 63 74 45 61 63 68 43 6d 64 28 69 6e  leDictEachCmd(in
3990: 74 65 72 70 2c 20 70 61 72 73 65 50 74 72 2c 20  terp, parsePtr, 
39a0: 63 6d 64 50 74 72 2c 20 65 6e 76 50 74 72 2c 20  cmdPtr, envPtr, 
39b0: 31 29 3b 0d 0a 2b 7d 0d 0a 2b 0d 0a 2b 69 6e 74  1);..+}..+..+int
39c0: 0d 0a 2b 54 63 6c 43 6f 6d 70 69 6c 65 44 69 63  ..+TclCompileDic
39d0: 74 45 61 63 68 43 6d 64 28 0d 0a 2b 20 20 20 20  tEachCmd(..+    
39e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
39f0: 72 70 2c 20 20 20 20 20 2f 2a 20 55 73 65 64 20  rp,     /* Used 
3a00: 66 6f 72 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 73  for looking up s
3a10: 74 75 66 66 2e 20 2a 2f 0d 0a 2b 20 20 20 20 54  tuff. */..+    T
3a20: 63 6c 5f 50 61 72 73 65 20 2a 70 61 72 73 65 50  cl_Parse *parseP
3a30: 74 72 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74 73  tr,    /* Points
3a40: 20 74 6f 20 61 20 70 61 72 73 65 20 73 74 72 75   to a parse stru
3a50: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 63 6f  cture for the co
3a60: 6d 6d 61 6e 64 0d 0a 2b 20 20 20 20 20 20 20 20  mmand..+        
3a70: 20 20 20 20 20 20 20 20 20 2a 20 63 72 65 61 74           * creat
3a80: 65 64 20 62 79 20 54 63 6c 5f 50 61 72 73 65 43  ed by Tcl_ParseC
3a90: 6f 6d 6d 61 6e 64 2e 20 2a 2f 0d 0a 2b 20 20 20  ommand. */..+   
3aa0: 20 43 6f 6d 6d 61 6e 64 20 2a 63 6d 64 50 74 72   Command *cmdPtr
3ab0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
3ac0: 74 73 20 74 6f 20 64 65 66 69 6e 74 69 6f 6e 20  ts to defintion 
3ad0: 6f 66 20 63 6f 6d 6d 61 6e 64 20 62 65 69 6e 67  of command being
3ae0: 0d 0a 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ..+             
3af0: 20 20 20 20 2a 20 63 6f 6d 70 69 6c 65 64 2e 20      * compiled. 
3b00: 2a 2f 0d 0a 2b 20 20 20 20 43 6f 6d 70 69 6c 65  */..+    Compile
3b10: 45 6e 76 20 2a 65 6e 76 50 74 72 2c 20 20 20 20  Env *envPtr,    
3b20: 20 2f 2a 20 48 6f 6c 64 73 20 72 65 73 75 6c 74   /* Holds result
3b30: 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ing instructions
3b40: 2e 20 2a 2f 0d 0a 2b 20 20 20 20 69 6e 74 20 63  . */..+    int c
3b50: 6f 6c 6c 65 63 74 29 09 20 20 20 20 2f 2a 20 46  ollect).    /* F
3b60: 6c 61 67 20 3d 3d 20 31 20 74 6f 20 63 6f 6c 6c  lag == 1 to coll
3b70: 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 6c  ect and return l
3b80: 6f 6f 70 20 62 6f 64 79 20 72 65 73 75 6c 74 2e  oop body result.
3b90: 20 2a 2f 0d 0a 2b 7b 0d 0a 20 20 20 20 20 44 65   */..+{..     De
3ba0: 66 69 6e 65 4c 69 6e 65 49 6e 66 6f 72 6d 61 74  fineLineInformat
3bb0: 69 6f 6e 3b 09 2f 2a 20 54 49 50 20 23 32 38 30  ion;./* TIP #280
3bc0: 20 2a 2f 0d 0a 20 20 20 20 20 54 63 6c 5f 54 6f   */..     Tcl_To
3bd0: 6b 65 6e 20 2a 76 61 72 73 54 6f 6b 65 6e 50 74  ken *varsTokenPt
3be0: 72 2c 20 2a 64 69 63 74 54 6f 6b 65 6e 50 74 72  r, *dictTokenPtr
3bf0: 2c 20 2a 62 6f 64 79 54 6f 6b 65 6e 50 74 72 3b  , *bodyTokenPtr;
3c00: 0d 0a 20 20 20 20 20 69 6e 74 20 6b 65 79 56 61  ..     int keyVa
3c10: 72 49 6e 64 65 78 2c 20 76 61 6c 75 65 56 61 72  rIndex, valueVar
3c20: 49 6e 64 65 78 2c 20 6e 61 6d 65 43 68 61 72 73  Index, nameChars
3c30: 2c 20 6c 6f 6f 70 52 61 6e 67 65 2c 20 63 61 74  , loopRange, cat
3c40: 63 68 52 61 6e 67 65 3b 0d 0a 20 20 20 20 20 69  chRange;..     i
3c50: 6e 74 20 69 6e 66 6f 49 6e 64 65 78 2c 20 6a 75  nt infoIndex, ju
3c60: 6d 70 44 69 73 70 6c 61 63 65 6d 65 6e 74 2c 20  mpDisplacement, 
3c70: 62 6f 64 79 54 61 72 67 65 74 4f 66 66 73 65 74  bodyTargetOffset
3c80: 2c 20 65 6d 70 74 79 54 61 72 67 65 74 4f 66 66  , emptyTargetOff
3c90: 73 65 74 3b 0d 0a 20 20 20 20 20 69 6e 74 20 6e  set;..     int n
3ca0: 75 6d 56 61 72 73 2c 20 65 6e 64 54 61 72 67 65  umVars, endTarge
3cb0: 74 4f 66 66 73 65 74 3b 0d 0a 2b 20 20 20 20 69  tOffset;..+    i
3cc0: 6e 74 20 63 6f 6c 6c 65 63 74 54 65 6d 70 3b 20  nt collectTemp; 
3cd0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 65 6d 70  /* Index of temp
3ce0: 20 76 61 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   var holding the
3cf0: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 20 2a 2f   result list. */
3d00: 0d 0a 20 20 20 20 20 69 6e 74 20 73 61 76 65 64  ..     int saved
3d10: 53 74 61 63 6b 44 65 70 74 68 20 3d 20 65 6e 76  StackDepth = env
3d20: 50 74 72 2d 3e 63 75 72 72 53 74 61 63 6b 44 65  Ptr->currStackDe
3d30: 70 74 68 3b 0d 0a 20 09 09 09 09 2f 2a 20 4e 65  pth;.. ..../* Ne
3d40: 65 64 65 64 20 62 65 63 61 75 73 65 20 6a 75 6d  eded because jum
3d50: 70 73 20 63 6f 6e 66 75 73 65 20 74 68 65 20 73  ps confuse the s
3d60: 74 61 63 6b 0d 0a 20 09 09 09 09 20 2a 20 73 70  tack.. .... * sp
3d70: 61 63 65 20 63 61 6c 63 75 6c 61 74 6f 72 2e 20  ace calculator. 
3d80: 2a 2f 0d 0a 20 20 20 20 20 63 6f 6e 73 74 20 63  */..     const c
3d90: 68 61 72 20 2a 2a 61 72 67 76 3b 0d 0a 20 20 20  har **argv;..   
3da0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 62 75    Tcl_DString bu
3db0: 66 66 65 72 3b 0d 0a 40 40 20 2d 38 36 30 2c 31  ffer;..@@ -860,1
3dc0: 30 20 2b 38 39 34 2c 32 36 20 40 40 0d 0a 20 0d  0 +894,26 @@.. .
3dd0: 0a 20 20 20 20 20 69 6e 66 6f 49 6e 64 65 78 20  .     infoIndex 
3de0: 3d 20 54 63 6c 46 69 6e 64 43 6f 6d 70 69 6c 65  = TclFindCompile
3df0: 64 4c 6f 63 61 6c 28 4e 55 4c 4c 2c 20 30 2c 20  dLocal(NULL, 0, 
3e00: 31 2c 20 65 6e 76 50 74 72 29 3b 0d 0a 20 20 20  1, envPtr);..   
3e10: 20 20 69 66 20 28 69 6e 66 6f 49 6e 64 65 78 20    if (infoIndex 
3e20: 3c 20 30 29 20 7b 0d 0a 20 09 72 65 74 75 72 6e  < 0) {.. .return
3e30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 20   TCL_ERROR;..   
3e40: 20 20 7d 0d 0a 2b 0d 0a 2b 20 20 20 20 2f 2a 0d    }..+..+    /*.
3e50: 0a 2b 20 20 20 20 20 2a 20 43 72 65 61 74 65 20  .+     * Create 
3e60: 74 65 6d 70 6f 72 61 72 79 20 76 61 72 69 61 62  temporary variab
3e70: 6c 65 20 74 6f 20 63 61 70 74 75 72 65 20 72 65  le to capture re
3e80: 74 75 72 6e 20 76 61 6c 75 65 73 20 66 72 6f 6d  turn values from
3e90: 20 6c 6f 6f 70 20 62 6f 64 79 2e 0d 0a 2b 20 20   loop body...+  
3ea0: 20 20 20 2a 2f 0d 0a 2b 0d 0a 2b 20 20 20 20 69     */..+..+    i
3eb0: 66 20 28 63 6f 6c 6c 65 63 74 20 3d 3d 20 31 29  f (collect == 1)
3ec0: 20 7b 0d 0a 2b 09 63 6f 6c 6c 65 63 74 54 65 6d   {..+.collectTem
3ed0: 70 20 3d 20 54 63 6c 46 69 6e 64 43 6f 6d 70 69  p = TclFindCompi
3ee0: 6c 65 64 4c 6f 63 61 6c 28 4e 55 4c 4c 2c 20 2f  ledLocal(NULL, /
3ef0: 2a 6e 61 6d 65 43 68 61 72 73 2a 2f 20 30 2c 20  *nameChars*/ 0, 
3f00: 2f 2a 63 72 65 61 74 65 2a 2f 20 31 2c 20 65 6e  /*create*/ 1, en
3f10: 76 50 74 72 29 3b 0d 0a 2b 0d 0a 2b 09 50 75 73  vPtr);..+..+.Pus
3f20: 68 4c 69 74 65 72 61 6c 28 65 6e 76 50 74 72 2c  hLiteral(envPtr,
3f30: 20 22 22 2c 20 30 29 3b 0d 0a 2b 09 69 66 20 28   "", 0);..+.if (
3f40: 63 6f 6c 6c 65 63 74 54 65 6d 70 20 3c 3d 20 32  collectTemp <= 2
3f50: 35 35 29 20 7b 0d 0a 2b 09 20 20 20 20 54 63 6c  55) {..+.    Tcl
3f60: 45 6d 69 74 49 6e 73 74 49 6e 74 31 28 49 4e 53  EmitInstInt1(INS
3f70: 54 5f 53 54 4f 52 45 5f 53 43 41 4c 41 52 31 2c  T_STORE_SCALAR1,
3f80: 20 63 6f 6c 6c 65 63 74 54 65 6d 70 2c 20 65 6e   collectTemp, en
3f90: 76 50 74 72 29 3b 0d 0a 2b 09 7d 20 65 6c 73 65  vPtr);..+.} else
3fa0: 20 7b 0d 0a 2b 09 20 20 20 20 54 63 6c 45 6d 69   {..+.    TclEmi
3fb0: 74 49 6e 73 74 49 6e 74 34 28 49 4e 53 54 5f 53  tInstInt4(INST_S
3fc0: 54 4f 52 45 5f 53 43 41 4c 41 52 34 2c 20 63 6f  TORE_SCALAR4, co
3fd0: 6c 6c 65 63 74 54 65 6d 70 2c 20 65 6e 76 50 74  llectTemp, envPt
3fe0: 72 29 3b 0d 0a 2b 09 7d 0d 0a 2b 09 54 63 6c 45  r);..+.}..+.TclE
3ff0: 6d 69 74 4f 70 63 6f 64 65 28 49 4e 53 54 5f 50  mitOpcode(INST_P
4000: 4f 50 2c 20 65 6e 76 50 74 72 29 3b 0d 0a 2b 20  OP, envPtr);..+ 
4010: 20 20 20 7d 0d 0a 20 0d 0a 20 20 20 20 20 2f 2a     }.. ..     /*
4020: 0d 0a 20 20 20 20 20 20 2a 20 50 72 65 70 61 72  ..      * Prepar
4030: 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 3b 20  ation complete; 
4040: 69 73 73 75 65 20 69 6e 73 74 72 75 63 74 69 6f  issue instructio
4050: 6e 73 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ns. Note that th
4060: 69 73 20 63 6f 64 65 20 69 73 73 75 65 73 0d 0a  is code issues..
4070: 20 20 20 20 20 20 2a 20 66 69 78 65 64 2d 73 69        * fixed-si
4080: 7a 65 64 20 6a 75 6d 70 73 2e 20 54 68 61 74 20  zed jumps. That 
4090: 73 69 6d 70 6c 69 66 69 65 73 20 74 68 69 6e 67  simplifies thing
40a0: 73 20 61 20 6c 6f 74 21 0d 0a 20 20 20 20 20 20  s a lot!..      
40b0: 2a 0d 0a 40 40 20 2d 39 30 36 2c 31 30 20 2b 39  *..@@ -906,10 +9
40c0: 35 36 2c 31 37 20 40 40 0d 0a 20 20 20 20 20 20  56,17 @@..      
40d0: 2a 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 6c 6f  * Compile the lo
40e0: 6f 70 20 62 6f 64 79 20 69 74 73 65 6c 66 2e 20  op body itself. 
40f0: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 73 74 61  It should be sta
4100: 63 6b 2d 6e 65 75 74 72 61 6c 2e 0d 0a 20 20 20  ck-neutral...   
4110: 20 20 20 2a 2f 0d 0a 20 0d 0a 20 20 20 20 20 53     */.. ..     S
4120: 65 74 4c 69 6e 65 49 6e 66 6f 72 6d 61 74 69 6f  etLineInformatio
4130: 6e 28 33 29 3b 0d 0a 20 20 20 20 20 43 6f 6d 70  n(3);..     Comp
4140: 69 6c 65 42 6f 64 79 28 65 6e 76 50 74 72 2c 20  ileBody(envPtr, 
4150: 62 6f 64 79 54 6f 6b 65 6e 50 74 72 2c 20 69 6e  bodyTokenPtr, in
4160: 74 65 72 70 29 3b 0d 0a 2b 20 20 20 20 69 66 20  terp);..+    if 
4170: 28 63 6f 6c 6c 65 63 74 20 3d 3d 20 31 29 20 7b  (collect == 1) {
4180: 0d 0a 2b 09 69 66 20 28 63 6f 6c 6c 65 63 74 54  ..+.if (collectT
4190: 65 6d 70 20 3c 3d 20 32 35 35 29 20 7b 0d 0a 2b  emp <= 255) {..+
41a0: 09 20 20 20 20 54 63 6c 45 6d 69 74 49 6e 73 74  .    TclEmitInst
41b0: 49 6e 74 31 28 49 4e 53 54 5f 4c 41 50 50 45 4e  Int1(INST_LAPPEN
41c0: 44 5f 53 43 41 4c 41 52 31 2c 20 63 6f 6c 6c 65  D_SCALAR1, colle
41d0: 63 74 54 65 6d 70 2c 20 65 6e 76 50 74 72 29 3b  ctTemp, envPtr);
41e0: 0d 0a 2b 09 7d 20 65 6c 73 65 20 7b 0d 0a 2b 09  ..+.} else {..+.
41f0: 20 20 20 20 54 63 6c 45 6d 69 74 49 6e 73 74 49      TclEmitInstI
4200: 6e 74 34 28 49 4e 53 54 5f 4c 41 50 50 45 4e 44  nt4(INST_LAPPEND
4210: 5f 53 43 41 4c 41 52 34 2c 20 63 6f 6c 6c 65 63  _SCALAR4, collec
4220: 74 54 65 6d 70 2c 20 65 6e 76 50 74 72 29 3b 0d  tTemp, envPtr);.
4230: 0a 2b 09 7d 0d 0a 2b 20 20 20 20 7d 0d 0a 20 20  .+.}..+    }..  
4240: 20 20 20 54 63 6c 45 6d 69 74 4f 70 63 6f 64 65     TclEmitOpcode
4250: 28 09 49 4e 53 54 5f 50 4f 50 2c 09 09 09 09 65  (.INST_POP,....e
4260: 6e 76 50 74 72 29 3b 0d 0a 20 0d 0a 20 20 20 20  nvPtr);.. ..    
4270: 20 2f 2a 0d 0a 20 20 20 20 20 20 2a 20 42 6f 74   /*..      * Bot
4280: 68 20 65 78 63 65 70 74 69 6f 6e 20 74 61 72 67  h exception targ
4290: 65 74 20 72 61 6e 67 65 73 20 28 65 72 72 6f 72  et ranges (error
42a0: 20 61 6e 64 20 6c 6f 6f 70 29 20 65 6e 64 20 68   and loop) end h
42b0: 65 72 65 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a  ere...      */..
42c0: 40 40 20 2d 39 37 33 2c 31 38 20 2b 31 30 33 30  @@ -973,18 +1030
42d0: 2c 32 36 20 40 40 0d 0a 20 20 20 20 20 54 63 6c  ,26 @@..     Tcl
42e0: 45 6d 69 74 49 6e 73 74 49 6e 74 31 28 09 49 4e  EmitInstInt1(.IN
42f0: 53 54 5f 55 4e 53 45 54 5f 53 43 41 4c 41 52 2c  ST_UNSET_SCALAR,
4300: 20 30 2c 09 09 09 65 6e 76 50 74 72 29 3b 0d 0a   0,...envPtr);..
4310: 20 20 20 20 20 54 63 6c 45 6d 69 74 49 6e 74 34       TclEmitInt4
4320: 28 09 69 6e 66 6f 49 6e 64 65 78 2c 09 09 09 09  (.infoIndex,....
4330: 65 6e 76 50 74 72 29 3b 0d 0a 20 0d 0a 20 20 20  envPtr);.. ..   
4340: 20 20 2f 2a 0d 0a 20 20 20 20 20 20 2a 20 46 69    /*..      * Fi
4350: 6e 61 6c 20 73 74 61 67 65 20 6f 66 20 74 68 65  nal stage of the
4360: 20 63 6f 6d 6d 61 6e 64 20 28 6e 6f 72 6d 61 6c   command (normal
4370: 20 63 61 73 65 29 20 69 73 20 74 68 61 74 20 77   case) is that w
4380: 65 20 70 75 73 68 20 61 6e 20 65 6d 70 74 79 0d  e push an empty.
4390: 0a 2d 20 20 20 20 20 2a 20 6f 62 6a 65 63 74 2e  .-     * object.
43a0: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 6c 61   This is done la
43b0: 73 74 20 74 6f 20 70 72 6f 6d 6f 74 65 20 70 65  st to promote pe
43c0: 65 70 68 6f 6c 65 20 6f 70 74 69 6d 69 7a 61 74  ephole optimizat
43d0: 69 6f 6e 20 77 68 65 6e 20 69 74 27 73 0d 0a 2d  ion when it's..-
43e0: 20 20 20 20 20 2a 20 64 72 6f 70 70 65 64 20 69       * dropped i
43f0: 6d 6d 65 64 69 61 74 65 6c 79 2e 0d 0a 2b 20 20  mmediately...+  
4400: 20 20 20 2a 20 6f 62 6a 65 63 74 20 28 6f 72 20     * object (or 
4410: 70 75 73 68 20 74 68 65 20 61 63 63 75 6d 75 6c  push the accumul
4420: 61 74 6f 72 20 61 73 20 74 68 65 20 72 65 73 75  ator as the resu
4430: 6c 74 20 6f 62 6a 65 63 74 29 2e 20 54 68 69 73  lt object). This
4440: 20 69 73 20 64 6f 6e 65 0d 0a 2b 20 20 20 20 20   is done..+     
4450: 2a 20 6c 61 73 74 20 74 6f 20 70 72 6f 6d 6f 74  * last to promot
4460: 65 20 70 65 65 70 68 6f 6c 65 20 6f 70 74 69 6d  e peephole optim
4470: 69 7a 61 74 69 6f 6e 20 77 68 65 6e 20 69 74 27  ization when it'
4480: 73 20 64 72 6f 70 70 65 64 20 69 6d 6d 65 64 69  s dropped immedi
4490: 61 74 65 6c 79 2e 0d 0a 20 20 20 20 20 20 2a 2f  ately...      */
44a0: 0d 0a 20 0d 0a 20 20 20 20 20 6a 75 6d 70 44 69  .. ..     jumpDi
44b0: 73 70 6c 61 63 65 6d 65 6e 74 20 3d 20 43 75 72  splacement = Cur
44c0: 72 65 6e 74 4f 66 66 73 65 74 28 65 6e 76 50 74  rentOffset(envPt
44d0: 72 29 20 2d 20 65 6e 64 54 61 72 67 65 74 4f 66  r) - endTargetOf
44e0: 66 73 65 74 3b 0d 0a 20 20 20 20 20 54 63 6c 55  fset;..     TclU
44f0: 70 64 61 74 65 49 6e 73 74 49 6e 74 34 41 74 50  pdateInstInt4AtP
4500: 63 28 49 4e 53 54 5f 4a 55 4d 50 34 2c 20 6a 75  c(INST_JUMP4, ju
4510: 6d 70 44 69 73 70 6c 61 63 65 6d 65 6e 74 2c 0d  mpDisplacement,.
4520: 0a 20 09 20 20 20 20 65 6e 76 50 74 72 2d 3e 63  . .    envPtr->c
4530: 6f 64 65 53 74 61 72 74 20 2b 20 65 6e 64 54 61  odeStart + endTa
4540: 72 67 65 74 4f 66 66 73 65 74 29 3b 0d 0a 2d 20  rgetOffset);..- 
4550: 20 20 20 50 75 73 68 4c 69 74 65 72 61 6c 28 65     PushLiteral(e
4560: 6e 76 50 74 72 2c 20 22 22 2c 20 30 29 3b 0d 0a  nvPtr, "", 0);..
4570: 2b 20 20 20 20 69 66 20 28 63 6f 6c 6c 65 63 74  +    if (collect
4580: 20 3d 3d 20 31 29 20 7b 0d 0a 2b 09 69 66 20 28   == 1) {..+.if (
4590: 63 6f 6c 6c 65 63 74 54 65 6d 70 20 3c 3d 20 32  collectTemp <= 2
45a0: 35 35 29 20 7b 0d 0a 2b 09 20 20 20 20 54 63 6c  55) {..+.    Tcl
45b0: 45 6d 69 74 49 6e 73 74 49 6e 74 31 28 49 4e 53  EmitInstInt1(INS
45c0: 54 5f 4c 4f 41 44 5f 53 43 41 4c 41 52 31 2c 20  T_LOAD_SCALAR1, 
45d0: 63 6f 6c 6c 65 63 74 54 65 6d 70 2c 20 65 6e 76  collectTemp, env
45e0: 50 74 72 29 3b 0d 0a 2b 09 7d 20 65 6c 73 65 20  Ptr);..+.} else 
45f0: 7b 0d 0a 2b 09 20 20 20 20 54 63 6c 45 6d 69 74  {..+.    TclEmit
4600: 49 6e 73 74 49 6e 74 34 28 49 4e 53 54 5f 4c 4f  InstInt4(INST_LO
4610: 41 44 5f 53 43 41 4c 41 52 34 2c 20 63 6f 6c 6c  AD_SCALAR4, coll
4620: 65 63 74 54 65 6d 70 2c 20 65 6e 76 50 74 72 29  ectTemp, envPtr)
4630: 3b 0d 0a 2b 09 7d 0d 0a 2b 20 20 20 20 7d 20 65  ;..+.}..+    } e
4640: 6c 73 65 20 7b 0d 0a 2b 09 50 75 73 68 4c 69 74  lse {..+.PushLit
4650: 65 72 61 6c 28 65 6e 76 50 74 72 2c 20 22 22 2c  eral(envPtr, "",
4660: 20 30 29 3b 0d 0a 2b 20 20 20 20 7d 0d 0a 20 20   0);..+    }..  
4670: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
4680: 3b 0d 0a 20 7d 0d 0a 20 0d 0a 20 69 6e 74 0d 0a  ;.. }.. .. int..
4690: 20 54 63 6c 43 6f 6d 70 69 6c 65 44 69 63 74 55   TclCompileDictU
46a0: 70 64 61 74 65 43 6d 64 28 0d 0a 40 40 20 2d 31  pdateCmd(..@@ -1
46b0: 38 36 38 2c 31 38 20 2b 31 39 33 33 2c 35 31 20  868,18 +1933,51 
46c0: 40 40 0d 0a 20 09 09 09 09 20 2a 20 63 72 65 61  @@.. .... * crea
46d0: 74 65 64 20 62 79 20 54 63 6c 5f 50 61 72 73 65  ted by Tcl_Parse
46e0: 43 6f 6d 6d 61 6e 64 2e 20 2a 2f 0d 0a 20 20 20  Command. */..   
46f0: 20 20 43 6f 6d 6d 61 6e 64 20 2a 63 6d 64 50 74    Command *cmdPt
4700: 72 2c 09 09 2f 2a 20 50 6f 69 6e 74 73 20 74 6f  r,../* Points to
4710: 20 64 65 66 69 6e 74 69 6f 6e 20 6f 66 20 63 6f   defintion of co
4720: 6d 6d 61 6e 64 20 62 65 69 6e 67 0d 0a 20 09 09  mmand being.. ..
4730: 09 09 20 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 2a  .. * compiled. *
4740: 2f 0d 0a 20 20 20 20 20 43 6f 6d 70 69 6c 65 45  /..     CompileE
4750: 6e 76 20 2a 65 6e 76 50 74 72 29 09 09 2f 2a 20  nv *envPtr)../* 
4760: 48 6f 6c 64 73 20 72 65 73 75 6c 74 69 6e 67 20  Holds resulting 
4770: 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 2a 2f  instructions. */
4780: 0d 0a 20 7b 0d 0a 2b 20 20 72 65 74 75 72 6e 20  .. {..+  return 
4790: 54 63 6c 43 6f 6d 70 69 6c 65 45 61 63 68 6c 6f  TclCompileEachlo
47a0: 6f 70 43 6d 64 28 69 6e 74 65 72 70 2c 20 70 61  opCmd(interp, pa
47b0: 72 73 65 50 74 72 2c 20 63 6d 64 50 74 72 2c 20  rsePtr, cmdPtr, 
47c0: 65 6e 76 50 74 72 2c 20 30 29 3b 0d 0a 2b 7d 0d  envPtr, 0);..+}.
47d0: 0a 2b 0c 0d 0a 2b 2f 2a 0d 0a 2b 20 2a 2d 2d 2d  .+...+/*..+ *---
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4820: 2d 2d 2d 0d 0a 2b 20 2a 0d 0a 2b 20 2a 20 54 63  ---..+ *..+ * Tc
4830: 6c 43 6f 6d 70 69 6c 65 45 61 63 68 6c 6f 6f 70  lCompileEachloop
4840: 43 6d 64 20 2d 2d 0d 0a 2b 20 2a 0d 0a 2b 20 2a  Cmd --..+ *..+ *
4850: 09 50 72 6f 63 65 64 75 72 65 20 63 61 6c 6c 65  .Procedure calle
4860: 64 20 74 6f 20 63 6f 6d 70 69 6c 65 20 74 68 65  d to compile the
4870: 20 22 66 6f 72 65 61 63 68 22 20 61 6e 64 20 22   "foreach" and "
4880: 6d 61 70 65 61 63 68 22 20 63 6f 6d 6d 61 6e 64  mapeach" command
4890: 73 2e 0d 0a 2b 20 2a 0d 0a 2b 20 2a 20 52 65 73  s...+ *..+ * Res
48a0: 75 6c 74 73 3a 0d 0a 2b 20 2a 09 52 65 74 75 72  ults:..+ *.Retur
48b0: 6e 73 20 54 43 4c 5f 4f 4b 20 66 6f 72 20 61 20  ns TCL_OK for a 
48c0: 73 75 63 63 65 73 73 66 75 6c 20 63 6f 6d 70 69  successful compi
48d0: 6c 65 2e 20 52 65 74 75 72 6e 73 20 54 43 4c 5f  le. Returns TCL_
48e0: 45 52 52 4f 52 20 74 6f 20 64 65 66 65 72 0d 0a  ERROR to defer..
48f0: 2b 20 2a 09 65 76 61 6c 75 61 74 69 6f 6e 20 74  + *.evaluation t
4900: 6f 20 72 75 6e 74 69 6d 65 2e 0d 0a 2b 20 2a 0d  o runtime...+ *.
4910: 0a 2b 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  .+ * Side effect
4920: 73 3a 0d 0a 2b 20 2a 09 49 6e 73 74 72 75 63 74  s:..+ *.Instruct
4930: 69 6f 6e 73 20 61 72 65 20 61 64 64 65 64 20 74  ions are added t
4940: 6f 20 65 6e 76 50 74 72 20 74 6f 20 65 78 65 63  o envPtr to exec
4950: 75 74 65 20 74 68 65 20 22 66 6f 72 65 61 63 68  ute the "foreach
4960: 22 20 63 6f 6d 6d 61 6e 64 20 61 74 0d 0a 2b 20  " command at..+ 
4970: 2a 09 72 75 6e 74 69 6d 65 2e 0d 0a 2b 20 2a 0d  *.runtime...+ *.
4980: 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .+ *------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 2b 20 2a 2f  ----------..+ */
49d0: 0d 0a 2b 0d 0a 2b 73 74 61 74 69 63 20 69 6e 74  ..+..+static int
49e0: 0d 0a 2b 54 63 6c 43 6f 6d 70 69 6c 65 45 61 63  ..+TclCompileEac
49f0: 68 6c 6f 6f 70 43 6d 64 28 0d 0a 2b 20 20 20 20  hloopCmd(..+    
4a00: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4a10: 72 70 2c 09 09 2f 2a 20 55 73 65 64 20 66 6f 72  rp,../* Used for
4a20: 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67   error reporting
4a30: 2e 20 2a 2f 0d 0a 2b 20 20 20 20 54 63 6c 5f 50  . */..+    Tcl_P
4a40: 61 72 73 65 20 2a 70 61 72 73 65 50 74 72 2c 09  arse *parsePtr,.
4a50: 2f 2a 20 50 6f 69 6e 74 73 20 74 6f 20 61 20 70  /* Points to a p
4a60: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 66  arse structure f
4a70: 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 0d 0a  or the command..
4a80: 2b 09 09 09 09 20 2a 20 63 72 65 61 74 65 64 20  +.... * created 
4a90: 62 79 20 54 63 6c 5f 50 61 72 73 65 43 6f 6d 6d  by Tcl_ParseComm
4aa0: 61 6e 64 2e 20 2a 2f 0d 0a 2b 20 20 20 20 43 6f  and. */..+    Co
4ab0: 6d 6d 61 6e 64 20 2a 63 6d 64 50 74 72 2c 09 09  mmand *cmdPtr,..
4ac0: 2f 2a 20 50 6f 69 6e 74 73 20 74 6f 20 64 65 66  /* Points to def
4ad0: 69 6e 74 69 6f 6e 20 6f 66 20 63 6f 6d 6d 61 6e  intion of comman
4ae0: 64 20 62 65 69 6e 67 0d 0a 2b 09 09 09 09 20 2a  d being..+.... *
4af0: 20 63 6f 6d 70 69 6c 65 64 2e 20 2a 2f 0d 0a 2b   compiled. */..+
4b00: 20 20 20 20 43 6f 6d 70 69 6c 65 45 6e 76 20 2a      CompileEnv *
4b10: 65 6e 76 50 74 72 2c 09 09 2f 2a 20 48 6f 6c 64  envPtr,../* Hold
4b20: 73 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 73 74  s resulting inst
4b30: 72 75 63 74 69 6f 6e 73 2e 20 2a 2f 0d 0a 2b 20  ructions. */..+ 
4b40: 20 20 20 69 6e 74 20 63 6f 6c 6c 65 63 74 29 09     int collect).
4b50: 09 2f 2a 20 46 6c 61 67 20 3d 3d 20 31 20 74 6f  ./* Flag == 1 to
4b60: 20 63 6f 6c 6c 65 63 74 20 61 6e 64 20 72 65 74   collect and ret
4b70: 75 72 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 72 65  urn loop body re
4b80: 73 75 6c 74 2e 20 2a 2f 0d 0a 2b 7b 0d 0a 20 20  sult. */..+{..  
4b90: 20 20 20 50 72 6f 63 20 2a 70 72 6f 63 50 74 72     Proc *procPtr
4ba0: 20 3d 20 65 6e 76 50 74 72 2d 3e 70 72 6f 63 50   = envPtr->procP
4bb0: 74 72 3b 0d 0a 20 20 20 20 20 46 6f 72 65 61 63  tr;..     Foreac
4bc0: 68 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 72 3b 09  hInfo *infoPtr;.
4bd0: 2f 2a 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65  /* Points to the
4be0: 20 73 74 72 75 63 74 75 72 65 20 64 65 73 63 72   structure descr
4bf0: 69 62 69 6e 67 20 74 68 69 73 0d 0a 20 09 09 09  ibing this.. ...
4c00: 09 20 2a 20 66 6f 72 65 61 63 68 20 63 6f 6d 6d  . * foreach comm
4c10: 61 6e 64 2e 20 53 74 6f 72 65 64 20 69 6e 20 61  and. Stored in a
4c20: 20 41 75 78 44 61 74 61 0d 0a 20 09 09 09 09 20   AuxData.. .... 
4c30: 2a 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * record in the 
4c40: 42 79 74 65 43 6f 64 65 2e 20 2a 2f 0d 0a 20 20  ByteCode. */..  
4c50: 20 20 20 69 6e 74 20 66 69 72 73 74 56 61 6c 75     int firstValu
4c60: 65 54 65 6d 70 3b 09 09 2f 2a 20 49 6e 64 65 78  eTemp;../* Index
4c70: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 65   of the first te
4c80: 6d 70 20 76 61 72 20 69 6e 20 74 68 65 20 66 72  mp var in the fr
4c90: 61 6d 65 0d 0a 20 09 09 09 09 20 2a 20 75 73 65  ame.. .... * use
4ca0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
4cb0: 76 61 6c 75 65 20 6c 69 73 74 2e 20 2a 2f 0d 0a  value list. */..
4cc0: 20 20 20 20 20 69 6e 74 20 6c 6f 6f 70 43 74 54       int loopCtT
4cd0: 65 6d 70 3b 09 09 2f 2a 20 49 6e 64 65 78 20 6f  emp;../* Index o
4ce0: 66 20 74 65 6d 70 20 76 61 72 20 68 6f 6c 64 69  f temp var holdi
4cf0: 6e 67 20 74 68 65 20 6c 6f 6f 70 27 73 0d 0a 20  ng the loop's.. 
4d00: 09 09 09 09 20 2a 20 69 74 65 72 61 74 69 6f 6e  .... * iteration
4d10: 20 63 6f 75 6e 74 2e 20 2a 2f 0d 0a 2b 20 20 20   count. */..+   
4d20: 20 69 6e 74 20 63 6f 6c 6c 65 63 74 54 65 6d 70   int collectTemp
4d30: 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 65  ; /* Index of te
4d40: 6d 70 20 76 61 72 20 68 6f 6c 64 69 6e 67 20 74  mp var holding t
4d50: 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 20  he result list. 
4d60: 2a 2f 0d 0a 2b 0d 0a 20 20 20 20 20 54 63 6c 5f  */..+..     Tcl_
4d70: 54 6f 6b 65 6e 20 2a 74 6f 6b 65 6e 50 74 72 2c  Token *tokenPtr,
4d80: 20 2a 62 6f 64 79 54 6f 6b 65 6e 50 74 72 3b 0d   *bodyTokenPtr;.
4d90: 0a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  .     unsigned c
4da0: 68 61 72 20 2a 6a 75 6d 70 50 63 3b 0d 0a 20 20  har *jumpPc;..  
4db0: 20 20 20 4a 75 6d 70 46 69 78 75 70 20 6a 75 6d     JumpFixup jum
4dc0: 70 46 61 6c 73 65 46 69 78 75 70 3b 0d 0a 20 20  pFalseFixup;..  
4dd0: 20 20 20 69 6e 74 20 6a 75 6d 70 42 61 63 6b 44     int jumpBackD
4de0: 69 73 74 2c 20 6a 75 6d 70 42 61 63 6b 4f 66 66  ist, jumpBackOff
4df0: 73 65 74 2c 20 69 6e 66 6f 49 6e 64 65 78 2c 20  set, infoIndex, 
4e00: 72 61 6e 67 65 2c 20 62 6f 64 79 49 6e 64 65 78  range, bodyIndex
4e10: 3b 0d 0a 20 20 20 20 20 69 6e 74 20 6e 75 6d 57  ;..     int numW
4e20: 6f 72 64 73 2c 20 6e 75 6d 4c 69 73 74 73 2c 20  ords, numLists, 
4e30: 6e 75 6d 56 61 72 73 2c 20 6c 6f 6f 70 49 6e 64  numVars, loopInd
4e40: 65 78 2c 20 74 65 6d 70 56 61 72 2c 20 69 2c 20  ex, tempVar, i, 
4e50: 6a 2c 20 63 6f 64 65 3b 0d 0a 40 40 20 2d 32 30  j, code;..@@ -20
4e60: 36 35 2c 31 30 20 2b 32 31 36 33 2c 32 36 20 40  65,10 +2163,26 @
4e70: 40 0d 0a 20 09 20 20 20 20 45 6d 69 74 31 34 49  @.. .    Emit14I
4e80: 6e 73 74 28 09 09 49 4e 53 54 5f 53 54 4f 52 45  nst(..INST_STORE
4e90: 5f 53 43 41 4c 41 52 2c 20 74 65 6d 70 56 61 72  _SCALAR, tempVar
4ea0: 2c 09 65 6e 76 50 74 72 29 3b 0d 0a 20 09 20 20  ,.envPtr);.. .  
4eb0: 20 20 54 63 6c 45 6d 69 74 4f 70 63 6f 64 65 28    TclEmitOpcode(
4ec0: 09 49 4e 53 54 5f 50 4f 50 2c 09 09 09 65 6e 76  .INST_POP,...env
4ed0: 50 74 72 29 3b 0d 0a 20 09 20 20 20 20 6c 6f 6f  Ptr);.. .    loo
4ee0: 70 49 6e 64 65 78 2b 2b 3b 0d 0a 20 09 7d 0d 0a  pIndex++;.. .}..
4ef0: 20 20 20 20 20 7d 0d 0a 2b 0d 0a 2b 20 20 20 20       }..+..+    
4f00: 2f 2a 0d 0a 2b 20 20 20 20 20 2a 20 43 72 65 61  /*..+     * Crea
4f10: 74 65 20 74 65 6d 70 6f 72 61 72 79 20 76 61 72  te temporary var
4f20: 69 61 62 6c 65 20 74 6f 20 63 61 70 74 75 72 65  iable to capture
4f30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 66   return values f
4f40: 72 6f 6d 20 6c 6f 6f 70 20 62 6f 64 79 2e 0d 0a  rom loop body...
4f50: 2b 20 20 20 20 20 2a 2f 0d 0a 2b 20 20 20 20 20  +     */..+     
4f60: 0d 0a 2b 20 20 20 20 69 66 20 28 63 6f 6c 6c 65  ..+    if (colle
4f70: 63 74 20 3d 3d 20 31 29 20 7b 0d 0a 2b 09 20 20  ct == 1) {..+.  
4f80: 20 20 63 6f 6c 6c 65 63 74 54 65 6d 70 20 3d 20    collectTemp = 
4f90: 54 63 6c 46 69 6e 64 43 6f 6d 70 69 6c 65 64 4c  TclFindCompiledL
4fa0: 6f 63 61 6c 28 4e 55 4c 4c 2c 20 2f 2a 6e 61 6d  ocal(NULL, /*nam
4fb0: 65 43 68 61 72 73 2a 2f 20 30 2c 20 2f 2a 63 72  eChars*/ 0, /*cr
4fc0: 65 61 74 65 2a 2f 20 31 2c 20 65 6e 76 50 74 72  eate*/ 1, envPtr
4fd0: 29 3b 0d 0a 2b 09 20 20 20 20 0d 0a 2b 09 20 20  );..+.    ..+.  
4fe0: 20 20 50 75 73 68 4c 69 74 65 72 61 6c 28 65 6e    PushLiteral(en
4ff0: 76 50 74 72 2c 20 22 22 2c 20 30 29 3b 0d 0a 2b  vPtr, "", 0);..+
5000: 09 20 20 20 20 69 66 20 28 63 6f 6c 6c 65 63 74  .    if (collect
5010: 54 65 6d 70 20 3c 3d 20 32 35 35 29 20 7b 0d 0a  Temp <= 255) {..
5020: 2b 09 20 20 20 20 20 20 54 63 6c 45 6d 69 74 49  +.      TclEmitI
5030: 6e 73 74 49 6e 74 31 28 20 20 49 4e 53 54 5f 53  nstInt1(  INST_S
5040: 54 4f 52 45 5f 53 43 41 4c 41 52 31 2c 20 63 6f  TORE_SCALAR1, co
5050: 6c 6c 65 63 74 54 65 6d 70 2c 20 65 6e 76 50 74  llectTemp, envPt
5060: 72 29 3b 0d 0a 2b 09 20 20 20 20 7d 20 65 6c 73  r);..+.    } els
5070: 65 20 7b 0d 0a 2b 09 20 20 20 20 20 20 54 63 6c  e {..+.      Tcl
5080: 45 6d 69 74 49 6e 73 74 49 6e 74 34 28 20 20 49  EmitInstInt4(  I
5090: 4e 53 54 5f 53 54 4f 52 45 5f 53 43 41 4c 41 52  NST_STORE_SCALAR
50a0: 34 2c 20 63 6f 6c 6c 65 63 74 54 65 6d 70 2c 20  4, collectTemp, 
50b0: 65 6e 76 50 74 72 29 3b 0d 0a 2b 09 20 20 20 20  envPtr);..+.    
50c0: 7d 0d 0a 2b 09 20 20 20 20 54 63 6c 45 6d 69 74  }..+.    TclEmit
50d0: 4f 70 63 6f 64 65 28 20 20 20 20 20 20 49 4e 53  Opcode(      INS
50e0: 54 5f 50 4f 50 2c 20 20 20 20 20 20 20 65 6e 76  T_POP,       env
50f0: 50 74 72 29 3b 0d 0a 2b 20 20 20 20 7d 0d 0a 20  Ptr);..+    }.. 
5100: 0d 0a 20 20 20 20 20 2f 2a 0d 0a 20 20 20 20 20  ..     /*..     
5110: 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68   * Initialize th
5120: 65 20 74 65 6d 70 6f 72 61 72 79 20 76 61 72 20  e temporary var 
5130: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 63  that holds the c
5140: 6f 75 6e 74 20 6f 66 20 6c 6f 6f 70 20 69 74 65  ount of loop ite
5150: 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20  rations...      
5160: 2a 2f 0d 0a 20 0d 0a 40 40 20 2d 32 30 39 30 2c  */.. ..@@ -2090,
5170: 31 31 20 2b 32 32 30 34 2c 32 30 20 40 40 0d 0a  11 +2204,20 @@..
5180: 20 20 20 20 20 53 65 74 4c 69 6e 65 49 6e 66 6f       SetLineInfo
5190: 72 6d 61 74 69 6f 6e 28 62 6f 64 79 49 6e 64 65  rmation(bodyInde
51a0: 78 29 3b 0d 0a 20 20 20 20 20 45 78 63 65 70 74  x);..     Except
51b0: 69 6f 6e 52 61 6e 67 65 53 74 61 72 74 73 28 65  ionRangeStarts(e
51c0: 6e 76 50 74 72 2c 20 72 61 6e 67 65 29 3b 0d 0a  nvPtr, range);..
51d0: 20 20 20 20 20 43 6f 6d 70 69 6c 65 42 6f 64 79       CompileBody
51e0: 28 65 6e 76 50 74 72 2c 20 62 6f 64 79 54 6f 6b  (envPtr, bodyTok
51f0: 65 6e 50 74 72 2c 20 69 6e 74 65 72 70 29 3b 0d  enPtr, interp);.
5200: 0a 20 20 20 20 20 45 78 63 65 70 74 69 6f 6e 52  .     ExceptionR
5210: 61 6e 67 65 45 6e 64 73 28 65 6e 76 50 74 72 2c  angeEnds(envPtr,
5220: 20 72 61 6e 67 65 29 3b 0d 0a 20 20 20 20 20 65   range);..     e
5230: 6e 76 50 74 72 2d 3e 63 75 72 72 53 74 61 63 6b  nvPtr->currStack
5240: 44 65 70 74 68 20 3d 20 73 61 76 65 64 53 74 61  Depth = savedSta
5250: 63 6b 44 65 70 74 68 20 2b 20 31 3b 0d 0a 2d 20  ckDepth + 1;..- 
5260: 20 20 20 54 63 6c 45 6d 69 74 4f 70 63 6f 64 65     TclEmitOpcode
5270: 28 09 09 49 4e 53 54 5f 50 4f 50 2c 09 09 09 65  (..INST_POP,...e
5280: 6e 76 50 74 72 29 3b 0d 0a 2b 0d 0a 2b 20 20 20  nvPtr);..+..+   
5290: 20 69 66 20 28 63 6f 6c 6c 65 63 74 20 3d 3d 20   if (collect == 
52a0: 31 29 20 7b 0d 0a 2b 09 20 20 20 20 69 66 20 28  1) {..+.    if (
52b0: 63 6f 6c 6c 65 63 74 54 65 6d 70 20 3c 3d 20 32  collectTemp <= 2
52c0: 35 35 29 20 7b 0d 0a 2b 09 20 20 20 20 20 20 54  55) {..+.      T
52d0: 63 6c 45 6d 69 74 49 6e 73 74 49 6e 74 31 28 20  clEmitInstInt1( 
52e0: 20 49 4e 53 54 5f 4c 41 50 50 45 4e 44 5f 53 43   INST_LAPPEND_SC
52f0: 41 4c 41 52 31 2c 20 63 6f 6c 6c 65 63 74 54 65  ALAR1, collectTe
5300: 6d 70 2c 20 65 6e 76 50 74 72 29 3b 0d 0a 2b 09  mp, envPtr);..+.
5310: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 2b 09      } else {..+.
5320: 20 20 20 20 20 20 54 63 6c 45 6d 69 74 49 6e 73        TclEmitIns
5330: 74 49 6e 74 34 28 20 20 49 4e 53 54 5f 4c 41 50  tInt4(  INST_LAP
5340: 50 45 4e 44 5f 53 43 41 4c 41 52 34 2c 20 63 6f  PEND_SCALAR4, co
5350: 6c 6c 65 63 74 54 65 6d 70 2c 20 65 6e 76 50 74  llectTemp, envPt
5360: 72 29 3b 0d 0a 2b 09 20 20 20 20 7d 0d 0a 2b 20  r);..+.    }..+ 
5370: 20 20 20 7d 0d 0a 2b 20 20 20 20 54 63 6c 45 6d     }..+    TclEm
5380: 69 74 4f 70 63 6f 64 65 28 20 20 20 20 20 20 20  itOpcode(       
5390: 20 49 4e 53 54 5f 50 4f 50 2c 20 20 20 20 20 20   INST_POP,      
53a0: 20 20 20 20 20 65 6e 76 50 74 72 29 3b 0d 0a 2b       envPtr);..+
53b0: 0d 0a 20 0d 0a 20 20 20 20 20 2f 2a 0d 0a 20 20  .. ..     /*..  
53c0: 20 20 20 20 2a 20 4a 75 6d 70 20 62 61 63 6b 20      * Jump back 
53d0: 74 6f 20 74 68 65 20 74 65 73 74 20 61 74 20 74  to the test at t
53e0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
53f0: 6f 70 2e 20 47 65 6e 65 72 61 74 65 20 61 20 34  op. Generate a 4
5400: 20 62 79 74 65 20 6a 75 6d 70 20 69 66 0d 0a 20   byte jump if.. 
5410: 20 20 20 20 20 2a 20 74 68 65 20 64 69 73 74 61       * the dista
5420: 6e 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 20  nce to the test 
5430: 69 73 20 3e 20 31 32 30 20 62 79 74 65 73 2e 20  is > 120 bytes. 
5440: 54 68 69 73 20 69 73 20 63 6f 6e 73 65 72 76 61  This is conserva
5450: 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  tive and..      
5460: 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 77  * ensures that w
5470: 65 20 77 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e won't have to 
5480: 72 65 70 6c 61 63 65 20 74 68 69 73 20 6a 75 6d  replace this jum
5490: 70 20 69 66 20 77 65 20 6c 61 74 65 72 20 6e 65  p if we later ne
54a0: 65 64 20 74 6f 0d 0a 40 40 20 2d 32 31 34 30 2c  ed to..@@ -2140,
54b0: 31 35 20 2b 32 32 36 33 2c 32 34 20 40 40 0d 0a  15 +2263,24 @@..
54c0: 20 20 20 20 20 20 2a 2f 0d 0a 20 0d 0a 20 20 20        */.. ..   
54d0: 20 20 45 78 63 65 70 74 69 6f 6e 52 61 6e 67 65    ExceptionRange
54e0: 54 61 72 67 65 74 28 65 6e 76 50 74 72 2c 20 72  Target(envPtr, r
54f0: 61 6e 67 65 2c 20 62 72 65 61 6b 4f 66 66 73 65  ange, breakOffse
5500: 74 29 3b 0d 0a 20 0d 0a 20 20 20 20 20 2f 2a 0d  t);.. ..     /*.
5510: 0a 2d 20 20 20 20 20 2a 20 54 68 65 20 66 6f 72  .-     * The for
5520: 65 61 63 68 20 63 6f 6d 6d 61 6e 64 27 73 20 72  each command's r
5530: 65 73 75 6c 74 20 69 73 20 61 6e 20 65 6d 70 74  esult is an empt
5540: 79 20 73 74 72 69 6e 67 2e 0d 0a 2b 20 20 20 20  y string...+    
5550: 20 2a 20 54 68 65 20 63 6f 6d 6d 61 6e 64 27 73   * The command's
5560: 20 72 65 73 75 6c 74 20 69 73 20 61 6e 20 65 6d   result is an em
5570: 70 74 79 20 73 74 72 69 6e 67 20 69 66 20 6e 6f  pty string if no
5580: 74 20 63 6f 6c 6c 65 63 74 69 6e 67 2c 20 6f 72  t collecting, or
5590: 20 74 68 65 0d 0a 2b 20 20 20 20 20 2a 20 6c 69   the..+     * li
55a0: 73 74 20 6f 66 20 72 65 73 75 6c 74 73 20 66 72  st of results fr
55b0: 6f 6d 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  om evaluating th
55c0: 65 20 6c 6f 6f 70 20 62 6f 64 79 2e 0d 0a 20 20  e loop body...  
55d0: 20 20 20 20 2a 2f 0d 0a 20 0d 0a 20 20 20 20 20      */.. ..     
55e0: 65 6e 76 50 74 72 2d 3e 63 75 72 72 53 74 61 63  envPtr->currStac
55f0: 6b 44 65 70 74 68 20 3d 20 73 61 76 65 64 53 74  kDepth = savedSt
5600: 61 63 6b 44 65 70 74 68 3b 0d 0a 2d 20 20 20 20  ackDepth;..-    
5610: 50 75 73 68 4c 69 74 65 72 61 6c 28 65 6e 76 50  PushLiteral(envP
5620: 74 72 2c 20 22 22 2c 20 30 29 3b 0d 0a 2b 20 20  tr, "", 0);..+  
5630: 20 20 69 66 20 28 63 6f 6c 6c 65 63 74 20 3d 3d    if (collect ==
5640: 20 31 29 20 7b 0d 0a 2b 09 20 20 20 20 69 66 20   1) {..+.    if 
5650: 28 63 6f 6c 6c 65 63 74 54 65 6d 70 20 3c 3d 20  (collectTemp <= 
5660: 32 35 35 29 20 7b 0d 0a 2b 09 20 20 20 20 20 20  255) {..+.      
5670: 54 63 6c 45 6d 69 74 49 6e 73 74 49 6e 74 31 28  TclEmitInstInt1(
5680: 20 20 49 4e 53 54 5f 4c 4f 41 44 5f 53 43 41 4c    INST_LOAD_SCAL
5690: 41 52 31 2c 20 63 6f 6c 6c 65 63 74 54 65 6d 70  AR1, collectTemp
56a0: 2c 20 65 6e 76 50 74 72 29 3b 0d 0a 2b 09 20 20  , envPtr);..+.  
56b0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 2b 09 20 20    } else {..+.  
56c0: 20 20 20 20 54 63 6c 45 6d 69 74 49 6e 73 74 49      TclEmitInstI
56d0: 6e 74 34 28 20 20 49 4e 53 54 5f 4c 4f 41 44 5f  nt4(  INST_LOAD_
56e0: 53 43 41 4c 41 52 34 2c 20 63 6f 6c 6c 65 63 74  SCALAR4, collect
56f0: 54 65 6d 70 2c 20 65 6e 76 50 74 72 29 3b 0d 0a  Temp, envPtr);..
5700: 2b 09 20 20 20 20 7d 0d 0a 2b 20 20 20 20 7d 20  +.    }..+    } 
5710: 65 6c 73 65 20 7b 0d 0a 2b 09 20 20 20 20 50 75  else {..+.    Pu
5720: 73 68 4c 69 74 65 72 61 6c 28 65 6e 76 50 74 72  shLiteral(envPtr
5730: 2c 20 22 22 2c 20 30 29 3b 0d 0a 2b 20 20 20 20  , "", 0);..+    
5740: 7d 0d 0a 20 20 20 20 20 65 6e 76 50 74 72 2d 3e  }..     envPtr->
5750: 63 75 72 72 53 74 61 63 6b 44 65 70 74 68 20 3d  currStackDepth =
5760: 20 73 61 76 65 64 53 74 61 63 6b 44 65 70 74 68   savedStackDepth
5770: 20 2b 20 31 3b 0d 0a 20 0d 0a 20 20 20 64 6f 6e   + 1;.. ..   don
5780: 65 3a 0d 0a 20 20 20 20 20 66 6f 72 20 28 6c 6f  e:..     for (lo
5790: 6f 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 6c 6f  opIndex = 0;  lo
57a0: 6f 70 49 6e 64 65 78 20 3c 20 6e 75 6d 4c 69 73  opIndex < numLis
57b0: 74 73 3b 20 20 6c 6f 6f 70 49 6e 64 65 78 2b 2b  ts;  loopIndex++
57c0: 29 20 7b 0d 0a 20 09 69 66 20 28 76 61 72 76 4c  ) {.. .if (varvL
57d0: 69 73 74 5b 6c 6f 6f 70 49 6e 64 65 78 5d 20 21  ist[loopIndex] !
57e0: 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 40 40 20 2d 33  = NULL) {..@@ -3
57f0: 36 39 34 2c 31 30 20 2b 33 38 32 36 2c 34 30 20  694,10 +3826,40 
5800: 40 40 0d 0a 20 09 7d 0d 0a 20 20 20 20 20 7d 0d  @@.. .}..     }.
5810: 0a 20 0d 0a 20 20 20 20 20 72 65 74 75 72 6e 20  . ..     return 
5820: 54 43 4c 5f 4f 4b 3b 0d 0a 20 7d 0d 0a 2b 0c 0d  TCL_OK;.. }..+..
5830: 0a 2b 2f 2a 0d 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d  .+/*..+ *-------
5840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d  ---------------.
5880: 0a 2b 20 2a 0d 0a 2b 20 2a 20 54 63 6c 43 6f 6d  .+ *..+ * TclCom
5890: 70 69 6c 65 4d 61 70 65 61 63 68 43 6d 64 20 2d  pileMapeachCmd -
58a0: 2d 0d 0a 2b 20 2a 0d 0a 2b 20 2a 09 50 72 6f 63  -..+ *..+ *.Proc
58b0: 65 64 75 72 65 20 63 61 6c 6c 65 64 20 74 6f 20  edure called to 
58c0: 63 6f 6d 70 69 6c 65 20 74 68 65 20 22 6d 61 70  compile the "map
58d0: 65 61 63 68 22 20 63 6f 6d 6d 61 6e 64 2e 0d 0a  each" command...
58e0: 2b 20 2a 0d 0a 2b 20 2a 20 52 65 73 75 6c 74 73  + *..+ * Results
58f0: 3a 0d 0a 2b 20 2a 09 52 65 74 75 72 6e 73 20 54  :..+ *.Returns T
5900: 43 4c 5f 4f 4b 20 66 6f 72 20 61 20 73 75 63 63  CL_OK for a succ
5910: 65 73 73 66 75 6c 20 63 6f 6d 70 69 6c 65 2e 20  essful compile. 
5920: 52 65 74 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f  Returns TCL_ERRO
5930: 52 20 74 6f 20 64 65 66 65 72 0d 0a 2b 20 2a 09  R to defer..+ *.
5940: 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 72 75  evaluation to ru
5950: 6e 74 69 6d 65 2e 0d 0a 2b 20 2a 0d 0a 2b 20 2a  ntime...+ *..+ *
5960: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0d 0a   Side effects:..
5970: 2b 20 2a 09 49 6e 73 74 72 75 63 74 69 6f 6e 73  + *.Instructions
5980: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 65 6e   are added to en
5990: 76 50 74 72 20 74 6f 20 65 78 65 63 75 74 65 20  vPtr to execute 
59a0: 74 68 65 20 22 6d 61 70 65 61 63 68 22 20 63 6f  the "mapeach" co
59b0: 6d 6d 61 6e 64 20 61 74 0d 0a 2b 20 2a 09 72 75  mmand at..+ *.ru
59c0: 6e 74 69 6d 65 2e 0d 0a 2b 20 2a 0d 0a 2b 20 2a  ntime...+ *..+ *
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a10: 2d 2d 2d 2d 2d 2d 0d 0a 2b 20 2a 2f 0d 0a 2b 0d  ------..+ */..+.
5a20: 0a 2b 69 6e 74 0d 0a 2b 54 63 6c 43 6f 6d 70 69  .+int..+TclCompi
5a30: 6c 65 4d 61 70 65 61 63 68 43 6d 64 28 0d 0a 2b  leMapeachCmd(..+
5a40: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
5a50: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 55 73 65 64  interp,../* Used
5a60: 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72   for error repor
5a70: 74 69 6e 67 2e 20 2a 2f 0d 0a 2b 20 20 20 20 54  ting. */..+    T
5a80: 63 6c 5f 50 61 72 73 65 20 2a 70 61 72 73 65 50  cl_Parse *parseP
5a90: 74 72 2c 09 2f 2a 20 50 6f 69 6e 74 73 20 74 6f  tr,./* Points to
5aa0: 20 61 20 70 61 72 73 65 20 73 74 72 75 63 74 75   a parse structu
5ab0: 72 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61  re for the comma
5ac0: 6e 64 0d 0a 2b 09 09 09 09 20 2a 20 63 72 65 61  nd..+.... * crea
5ad0: 74 65 64 20 62 79 20 54 63 6c 5f 50 61 72 73 65  ted by Tcl_Parse
5ae0: 43 6f 6d 6d 61 6e 64 2e 20 2a 2f 0d 0a 2b 20 20  Command. */..+  
5af0: 20 20 43 6f 6d 6d 61 6e 64 20 2a 63 6d 64 50 74    Command *cmdPt
5b00: 72 2c 09 09 2f 2a 20 50 6f 69 6e 74 73 20 74 6f  r,../* Points to
5b10: 20 64 65 66 69 6e 74 69 6f 6e 20 6f 66 20 63 6f   defintion of co
5b20: 6d 6d 61 6e 64 20 62 65 69 6e 67 0d 0a 2b 09 09  mmand being..+..
5b30: 09 09 20 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 2a  .. * compiled. *
5b40: 2f 0d 0a 2b 20 20 20 20 43 6f 6d 70 69 6c 65 45  /..+    CompileE
5b50: 6e 76 20 2a 65 6e 76 50 74 72 29 09 09 2f 2a 20  nv *envPtr)../* 
5b60: 48 6f 6c 64 73 20 72 65 73 75 6c 74 69 6e 67 20  Holds resulting 
5b70: 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 2a 2f  instructions. */
5b80: 0d 0a 2b 7b 0d 0a 2b 20 20 72 65 74 75 72 6e 20  ..+{..+  return 
5b90: 54 63 6c 43 6f 6d 70 69 6c 65 45 61 63 68 6c 6f  TclCompileEachlo
5ba0: 6f 70 43 6d 64 28 69 6e 74 65 72 70 2c 20 70 61  opCmd(interp, pa
5bb0: 72 73 65 50 74 72 2c 20 63 6d 64 50 74 72 2c 20  rsePtr, cmdPtr, 
5bc0: 65 6e 76 50 74 72 2c 20 31 29 3b 0d 0a 2b 7d 0d  envPtr, 1);..+}.
5bd0: 0a 20 0c 0d 0a 20 2f 2a 0d 0a 20 20 2a 2d 2d 2d  . ... /*..  *---
5be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c20: 2d 2d 2d 0d 0a 20 20 2a 0d 0a 20 20 2a 20 54 63  ---..  *..  * Tc
5c30: 6c 43 6f 6d 70 69 6c 65 4e 61 6d 65 73 70 61 63  lCompileNamespac
5c40: 65 43 6d 64 20 2d 2d 0d 0a 0d 0a 49 6e 64 65 78  eCmd --....Index
5c50: 3a 20 67 65 6e 65 72 69 63 2f 74 63 6c 44 69 63  : generic/tclDic
5c60: 74 4f 62 6a 2e 63 0d 0a 3d 3d 3d 3d 3d 3d 3d 3d  tObj.c..========
5c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a 2d 2d 2d 20  ==========..--- 
5cb0: 67 65 6e 65 72 69 63 2f 74 63 6c 44 69 63 74 4f  generic/tclDictO
5cc0: 62 6a 2e 63 0d 0a 2b 2b 2b 20 67 65 6e 65 72 69  bj.c..+++ generi
5cd0: 63 2f 74 63 6c 44 69 63 74 4f 62 6a 2e 63 0d 0a  c/tclDictObj.c..
5ce0: 40 40 20 2d 37 34 2c 31 31 20 2b 37 34 2c 31 35  @@ -74,11 +74,15
5cf0: 20 40 40 0d 0a 20 09 09 09 20 20 20 20 54 63 6c   @@.. ...    Tcl
5d00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
5d10: 20 69 6e 74 20 72 65 73 75 6c 74 29 3b 0d 0a 20   int result);.. 
5d20: 73 74 61 74 69 63 20 69 6e 74 09 09 46 69 6e 61  static int..Fina
5d30: 6c 69 7a 65 44 69 63 74 57 69 74 68 28 43 6c 69  lizeDictWith(Cli
5d40: 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 0d  entData data[],.
5d50: 0a 20 09 09 09 20 20 20 20 54 63 6c 5f 49 6e 74  . ...    Tcl_Int
5d60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
5d70: 20 72 65 73 75 6c 74 29 3b 0d 0a 20 73 74 61 74   result);.. stat
5d80: 69 63 20 69 6e 74 09 09 44 69 63 74 46 6f 72 4e  ic int..DictForN
5d90: 52 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  RCmd(ClientData 
5da0: 64 75 6d 6d 79 2c 20 54 63 6c 5f 49 6e 74 65 72  dummy, Tcl_Inter
5db0: 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 20 09 09 09  p *interp,.. ...
5dc0: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63      int objc, Tc
5dd0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62  l_Obj *const *ob
5de0: 6a 76 29 3b 0d 0a 2d 73 74 61 74 69 63 20 69 6e  jv);..-static in
5df0: 74 09 09 44 69 63 74 46 6f 72 4c 6f 6f 70 43 61  t..DictForLoopCa
5e00: 6c 6c 62 61 63 6b 28 43 6c 69 65 6e 74 44 61 74  llback(ClientDat
5e10: 61 20 64 61 74 61 5b 5d 2c 0d 0a 2b 73 74 61 74  a data[],..+stat
5e20: 69 63 20 69 6e 74 20 20 20 20 20 20 44 69 63 74  ic int      Dict
5e30: 4d 61 70 4e 52 43 6d 64 28 43 6c 69 65 6e 74 44  MapNRCmd(ClientD
5e40: 61 74 61 20 64 75 6d 6d 79 2c 20 54 63 6c 5f 49  ata dummy, Tcl_I
5e50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a  nterp *interp,..
5e60: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
5e70: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
5e80: 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29  bj *const *objv)
5e90: 3b 0d 0a 2b 73 74 61 74 69 63 20 69 6e 74 20 20  ;..+static int  
5ea0: 20 20 20 20 44 69 63 74 45 61 63 68 4e 52 43 6d      DictEachNRCm
5eb0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 64 75 6d  d(ClientData dum
5ec0: 6d 79 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  my, Tcl_Interp *
5ed0: 69 6e 74 65 72 70 2c 0d 0a 2b 20 20 20 20 20 20  interp,..+      
5ee0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 62            int ob
5ef0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
5f00: 73 74 20 2a 6f 62 6a 76 2c 20 69 6e 74 20 63 6f  st *objv, int co
5f10: 6c 6c 65 63 74 29 3b 0d 0a 2b 73 74 61 74 69 63  llect);..+static
5f20: 20 69 6e 74 09 09 44 69 63 74 45 61 63 68 4c 6f   int..DictEachLo
5f30: 6f 70 43 61 6c 6c 62 61 63 6b 28 43 6c 69 65 6e  opCallback(Clien
5f40: 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 0d 0a 20  tData data[],.. 
5f50: 09 09 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ...    Tcl_Inter
5f60: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 72  p *interp, int r
5f70: 65 73 75 6c 74 29 3b 0d 0a 20 0d 0a 20 0d 0a 20  esult);.. .. .. 
5f80: 2f 2a 0d 0a 20 20 2a 20 54 61 62 6c 65 20 6f 66  /*..  * Table of
5f90: 20 64 69 63 74 20 73 75 62 63 6f 6d 6d 61 6e 64   dict subcommand
5fa0: 20 6e 61 6d 65 73 20 61 6e 64 20 69 6d 70 6c 65   names and imple
5fb0: 6d 65 6e 74 61 74 69 6f 6e 73 2e 0d 0a 40 40 20  mentations...@@ 
5fc0: 2d 39 33 2c 31 30 20 2b 39 37 2c 31 31 20 40 40  -93,10 +97,11 @@
5fd0: 0d 0a 20 20 20 20 20 7b 22 67 65 74 22 2c 09 44  ..     {"get",.D
5fe0: 69 63 74 47 65 74 43 6d 64 2c 09 54 63 6c 43 6f  ictGetCmd,.TclCo
5ff0: 6d 70 69 6c 65 44 69 63 74 47 65 74 43 6d 64 2c  mpileDictGetCmd,
6000: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 20 7d   NULL, NULL, 0 }
6010: 2c 0d 0a 20 20 20 20 20 7b 22 69 6e 63 72 22 2c  ,..     {"incr",
6020: 09 44 69 63 74 49 6e 63 72 43 6d 64 2c 09 54 63  .DictIncrCmd,.Tc
6030: 6c 43 6f 6d 70 69 6c 65 44 69 63 74 49 6e 63 72  lCompileDictIncr
6040: 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  Cmd, NULL, NULL,
6050: 20 30 20 7d 2c 0d 0a 20 20 20 20 20 7b 22 69 6e   0 },..     {"in
6060: 66 6f 22 2c 09 44 69 63 74 49 6e 66 6f 43 6d 64  fo",.DictInfoCmd
6070: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
6080: 4c 4c 2c 20 30 20 7d 2c 0d 0a 20 20 20 20 20 7b  LL, 0 },..     {
6090: 22 6b 65 79 73 22 2c 09 44 69 63 74 4b 65 79 73  "keys",.DictKeys
60a0: 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  Cmd, NULL, NULL,
60b0: 20 4e 55 4c 4c 2c 20 30 20 7d 2c 0d 0a 20 20 20   NULL, 0 },..   
60c0: 20 20 7b 22 6c 61 70 70 65 6e 64 22 2c 09 44 69    {"lappend",.Di
60d0: 63 74 4c 61 70 70 65 6e 64 43 6d 64 2c 09 54 63  ctLappendCmd,.Tc
60e0: 6c 43 6f 6d 70 69 6c 65 44 69 63 74 4c 61 70 70  lCompileDictLapp
60f0: 65 6e 64 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55  endCmd, NULL, NU
6100: 4c 4c 2c 20 30 20 7d 2c 0d 0a 2b 20 20 20 20 7b  LL, 0 },..+    {
6110: 22 6d 61 70 22 2c 20 09 4e 55 4c 4c 2c 20 20 20  "map", .NULL,   
6120: 20 20 20 20 09 54 63 6c 43 6f 6d 70 69 6c 65 44      .TclCompileD
6130: 69 63 74 4d 61 70 43 6d 64 2c 20 44 69 63 74 4d  ictMapCmd, DictM
6140: 61 70 4e 52 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30  apNRCmd, NULL, 0
6150: 20 7d 2c 0d 0a 20 20 20 20 20 7b 22 6d 65 72 67   },..     {"merg
6160: 65 22 2c 09 44 69 63 74 4d 65 72 67 65 43 6d 64  e",.DictMergeCmd
6170: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
6180: 4c 4c 2c 20 30 20 7d 2c 0d 0a 20 20 20 20 20 7b  LL, 0 },..     {
6190: 22 72 65 6d 6f 76 65 22 2c 09 44 69 63 74 52 65  "remove",.DictRe
61a0: 6d 6f 76 65 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e  moveCmd, NULL, N
61b0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 20 7d 2c 0d  ULL, NULL, 0 },.
61c0: 0a 20 20 20 20 20 7b 22 72 65 70 6c 61 63 65 22  .     {"replace"
61d0: 2c 09 44 69 63 74 52 65 70 6c 61 63 65 43 6d 64  ,.DictReplaceCmd
61e0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
61f0: 4c 4c 2c 20 30 20 7d 2c 0d 0a 20 20 20 20 20 7b  LL, 0 },..     {
6200: 22 73 65 74 22 2c 09 44 69 63 74 53 65 74 43 6d  "set",.DictSetCm
6210: 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 44 69 63  d,.TclCompileDic
6220: 74 53 65 74 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e  tSetCmd, NULL, N
6230: 55 4c 4c 2c 20 30 20 7d 2c 0d 0a 20 20 20 20 20  ULL, 0 },..     
6240: 7b 22 73 69 7a 65 22 2c 09 44 69 63 74 53 69 7a  {"size",.DictSiz
6250: 65 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  eCmd, NULL, NULL
6260: 2c 20 4e 55 4c 4c 2c 20 30 20 7d 2c 0d 0a 40 40  , NULL, 0 },..@@
6270: 20 2d 32 33 32 37 2c 31 35 20 2b 32 33 33 32 2c   -2327,15 +2332,
6280: 31 35 20 40 40 0d 0a 20 7d 0d 0a 20 0c 0d 0a 20  15 @@.. }.. ... 
6290: 2f 2a 0d 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*..  *---------
62a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20  -------------.. 
62e0: 20 2a 0d 0a 2d 20 2a 20 44 69 63 74 46 6f 72 4e   *..- * DictForN
62f0: 52 43 6d 64 20 2d 2d 0d 0a 2b 20 2a 20 44 69 63  RCmd --..+ * Dic
6300: 74 46 6f 72 4e 52 43 6d 64 2c 20 44 69 63 74 4d  tForNRCmd, DictM
6310: 61 70 4e 52 43 6d 64 2c 20 44 69 63 74 45 61 63  apNRCmd, DictEac
6320: 68 4e 52 43 6d 64 20 2d 2d 0d 0a 20 20 2a 0d 0a  hNRCmd --..  *..
6330: 2d 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  - *.This functio
6340: 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  n implements the
6350: 20 22 64 69 63 74 20 66 6f 72 22 20 54 63 6c 20   "dict for" Tcl 
6360: 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65  command. See the
6370: 20 75 73 65 72 0d 0a 2d 20 2a 09 64 6f 63 75 6d   user..- *.docum
6380: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74  entation for det
6390: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20  ails on what it 
63a0: 64 6f 65 73 2c 20 61 6e 64 20 54 49 50 23 31 31  does, and TIP#11
63b0: 31 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 6c  1 for the formal
63c0: 0d 0a 2d 20 2a 09 73 70 65 63 69 66 69 63 61 74  ..- *.specificat
63d0: 69 6f 6e 2e 0d 0a 2b 20 2a 09 54 68 65 73 65 20  ion...+ *.These 
63e0: 66 75 6e 63 74 69 6f 6e 73 20 69 6d 70 6c 65 6d  functions implem
63f0: 65 6e 74 20 74 68 65 20 22 64 69 63 74 20 66 6f  ent the "dict fo
6400: 72 22 20 61 6e 64 20 22 64 69 63 74 20 6d 61 70  r" and "dict map
6410: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 73 2e 20  " Tcl commands. 
6420: 0d 0a 2b 20 2a 20 20 53 65 65 20 74 68 65 20 75  ..+ *  See the u
6430: 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ser documentatio
6440: 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e  n for details on
6450: 20 77 68 61 74 20 69 74 20 64 6f 65 73 2c 20 61   what it does, a
6460: 6e 64 20 54 49 50 23 31 31 31 20 0d 0a 2b 20 2a  nd TIP#111 ..+ *
6470: 20 20 61 6e 64 20 54 49 50 23 34 30 35 20 66 6f    and TIP#405 fo
6480: 72 20 74 68 65 20 66 6f 72 6d 61 6c 20 73 70 65  r the formal spe
6490: 63 69 66 69 63 61 74 69 6f 6e 2e 0d 0a 20 20 2a  cification...  *
64a0: 0d 0a 20 20 2a 20 52 65 73 75 6c 74 73 3a 0d 0a  ..  * Results:..
64b0: 20 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54    *.A standard T
64c0: 63 6c 20 72 65 73 75 6c 74 2e 0d 0a 20 20 2a 0d  cl result...  *.
64d0: 0a 20 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  .  * Side effect
64e0: 73 3a 0d 0a 40 40 20 2d 32 33 34 39 2c 31 30 20  s:..@@ -2349,10 
64f0: 2b 32 33 35 34 2c 33 31 20 40 40 0d 0a 20 20 20  +2354,31 @@..   
6500: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 75 6d    ClientData dum
6510: 6d 79 2c 0d 0a 20 20 20 20 20 54 63 6c 5f 49 6e  my,..     Tcl_In
6520: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 20  terp *interp,.. 
6530: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0d 0a 20      int objc,.. 
6540: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
6550: 73 74 20 2a 6f 62 6a 76 29 0d 0a 20 7b 0d 0a 2b  st *objv).. {..+
6560: 20 20 20 20 72 65 74 75 72 6e 20 44 69 63 74 45      return DictE
6570: 61 63 68 4e 52 43 6d 64 28 64 75 6d 6d 79 2c 20  achNRCmd(dummy, 
6580: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62  interp, objc, ob
6590: 6a 76 2c 20 30 29 3b 0d 0a 2b 7d 0d 0a 2b 0d 0a  jv, 0);..+}..+..
65a0: 2b 73 74 61 74 69 63 20 69 6e 74 0d 0a 2b 44 69  +static int..+Di
65b0: 63 74 4d 61 70 4e 52 43 6d 64 28 0d 0a 2b 20 20  ctMapNRCmd(..+  
65c0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 75 6d    ClientData dum
65d0: 6d 79 2c 0d 0a 2b 20 20 20 20 54 63 6c 5f 49 6e  my,..+    Tcl_In
65e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 2b  terp *interp,..+
65f0: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0d 0a 2b      int objc,..+
6600: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
6610: 73 74 20 2a 6f 62 6a 76 29 0d 0a 2b 7b 0d 0a 2b  st *objv)..+{..+
6620: 20 20 20 20 72 65 74 75 72 6e 20 44 69 63 74 45      return DictE
6630: 61 63 68 4e 52 43 6d 64 28 64 75 6d 6d 79 2c 20  achNRCmd(dummy, 
6640: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62  interp, objc, ob
6650: 6a 76 2c 20 31 29 3b 0d 0a 2b 7d 0d 0a 2b 0d 0a  jv, 1);..+}..+..
6660: 2b 73 74 61 74 69 63 20 69 6e 74 0d 0a 2b 44 69  +static int..+Di
6670: 63 74 45 61 63 68 4e 52 43 6d 64 28 0d 0a 2b 20  ctEachNRCmd(..+ 
6680: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 75     ClientData du
6690: 6d 6d 79 2c 0d 0a 2b 20 20 20 20 54 63 6c 5f 49  mmy,..+    Tcl_I
66a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a  nterp *interp,..
66b0: 2b 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0d 0a  +    int objc,..
66c0: 2b 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  +    Tcl_Obj *co
66d0: 6e 73 74 20 2a 6f 62 6a 76 2c 0d 0a 2b 20 20 20  nst *objv,..+   
66e0: 20 69 6e 74 20 63 6f 6c 6c 65 63 74 29 20 20 2f   int collect)  /
66f0: 2a 20 46 6c 61 67 20 3d 3d 20 31 20 74 6f 20 63  * Flag == 1 to c
6700: 6f 6c 6c 65 63 74 20 61 6e 64 20 72 65 74 75 72  ollect and retur
6710: 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 72 65 73 75  n loop body resu
6720: 6c 74 2e 20 2a 2f 0d 0a 2b 7b 0d 0a 20 20 20 20  lt. */..+{..    
6730: 20 49 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20   Interp *iPtr = 
6740: 28 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72  (Interp *) inter
6750: 70 3b 0d 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a  p;..     Tcl_Obj
6760: 20 2a 73 63 72 69 70 74 4f 62 6a 2c 20 2a 6b 65   *scriptObj, *ke
6770: 79 56 61 72 4f 62 6a 2c 20 2a 76 61 6c 75 65 56  yVarObj, *valueV
6780: 61 72 4f 62 6a 3b 0d 0a 20 20 20 20 20 54 63 6c  arObj;..     Tcl
6790: 5f 4f 62 6a 20 2a 2a 76 61 72 76 2c 20 2a 6b 65  _Obj **varv, *ke
67a0: 79 4f 62 6a 2c 20 2a 76 61 6c 75 65 4f 62 6a 3b  yObj, *valueObj;
67b0: 0d 0a 20 20 20 20 20 54 63 6c 5f 44 69 63 74 53  ..     Tcl_DictS
67c0: 65 61 72 63 68 20 2a 73 65 61 72 63 68 50 74 72  earch *searchPtr
67d0: 3b 0d 0a 20 20 20 20 20 69 6e 74 20 76 61 72 63  ;..     int varc
67e0: 2c 20 64 6f 6e 65 3b 0d 0a 40 40 20 2d 32 33 37  , done;..@@ -237
67f0: 34 2c 31 30 20 2b 32 34 30 30 2c 31 31 20 40 40  4,10 +2400,11 @@
6800: 0d 0a 20 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  .. .Tcl_SetResul
6810: 74 28 69 6e 74 65 72 70 2c 20 22 6d 75 73 74 20  t(interp, "must 
6820: 68 61 76 65 20 65 78 61 63 74 6c 79 20 74 77 6f  have exactly two
6830: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 22   variable names"
6840: 2c 0d 0a 20 09 09 54 43 4c 5f 53 54 41 54 49 43  ,.. ..TCL_STATIC
6850: 29 3b 0d 0a 20 09 72 65 74 75 72 6e 20 54 43 4c  );.. .return TCL
6860: 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20 7d 0d  _ERROR;..     }.
6870: 0a 20 20 20 20 20 73 65 61 72 63 68 50 74 72 20  .     searchPtr 
6880: 3d 20 54 63 6c 53 74 61 63 6b 41 6c 6c 6f 63 28  = TclStackAlloc(
6890: 69 6e 74 65 72 70 2c 20 73 69 7a 65 6f 66 28 54  interp, sizeof(T
68a0: 63 6c 5f 44 69 63 74 53 65 61 72 63 68 29 29 3b  cl_DictSearch));
68b0: 0d 0a 2b 20 20 20 20 73 65 61 72 63 68 50 74 72  ..+    searchPtr
68c0: 2d 3e 72 65 73 75 6c 74 4c 69 73 74 20 3d 20 28  ->resultList = (
68d0: 63 6f 6c 6c 65 63 74 20 3f 20 54 63 6c 5f 4e 65  collect ? Tcl_Ne
68e0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
68f0: 29 20 3a 20 4e 55 4c 4c 20 29 3b 0d 0a 20 20 20  ) : NULL );..   
6900: 20 20 69 66 20 28 54 63 6c 5f 44 69 63 74 4f 62    if (Tcl_DictOb
6910: 6a 46 69 72 73 74 28 69 6e 74 65 72 70 2c 20 6f  jFirst(interp, o
6920: 62 6a 76 5b 32 5d 2c 20 73 65 61 72 63 68 50 74  bjv[2], searchPt
6930: 72 2c 20 26 6b 65 79 4f 62 6a 2c 20 26 76 61 6c  r, &keyObj, &val
6940: 75 65 4f 62 6a 2c 0d 0a 20 09 20 20 20 20 26 64  ueObj,.. .    &d
6950: 6f 6e 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  one) != TCL_OK) 
6960: 7b 0d 0a 20 09 54 63 6c 53 74 61 63 6b 46 72 65  {.. .TclStackFre
6970: 65 28 69 6e 74 65 72 70 2c 20 73 65 61 72 63 68  e(interp, search
6980: 50 74 72 29 3b 0d 0a 20 09 72 65 74 75 72 6e 20  Ptr);.. .return 
6990: 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20  TCL_ERROR;..    
69a0: 20 7d 0d 0a 40 40 20 2d 32 34 31 37 2c 31 31 20   }..@@ -2417,11 
69b0: 2b 32 34 34 34 2c 31 31 20 40 40 0d 0a 20 0d 0a  +2444,11 @@.. ..
69c0: 20 20 20 20 20 2f 2a 0d 0a 20 20 20 20 20 20 2a       /*..      *
69d0: 20 52 75 6e 20 74 68 65 20 73 63 72 69 70 74 2e   Run the script.
69e0: 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 0d 0a 2d  ..      */.. ..-
69f0: 20 20 20 20 54 63 6c 4e 52 41 64 64 43 61 6c 6c      TclNRAddCall
6a00: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 69 63  back(interp, Dic
6a10: 74 46 6f 72 4c 6f 6f 70 43 61 6c 6c 62 61 63 6b  tForLoopCallback
6a20: 2c 20 73 65 61 72 63 68 50 74 72 2c 20 6b 65 79  , searchPtr, key
6a30: 56 61 72 4f 62 6a 2c 0d 0a 2b 20 20 20 20 54 63  VarObj,..+    Tc
6a40: 6c 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69  lNRAddCallback(i
6a50: 6e 74 65 72 70 2c 20 44 69 63 74 45 61 63 68 4c  nterp, DictEachL
6a60: 6f 6f 70 43 61 6c 6c 62 61 63 6b 2c 20 73 65 61  oopCallback, sea
6a70: 72 63 68 50 74 72 2c 20 6b 65 79 56 61 72 4f 62  rchPtr, keyVarOb
6a80: 6a 2c 0d 0a 20 09 20 20 20 20 76 61 6c 75 65 56  j,.. .    valueV
6a90: 61 72 4f 62 6a 2c 20 73 63 72 69 70 74 4f 62 6a  arObj, scriptObj
6aa0: 29 3b 0d 0a 20 20 20 20 20 72 65 74 75 72 6e 20  );..     return 
6ab0: 54 63 6c 4e 52 45 76 61 6c 4f 62 6a 45 78 28 69  TclNREvalObjEx(i
6ac0: 6e 74 65 72 70 2c 20 73 63 72 69 70 74 4f 62 6a  nterp, scriptObj
6ad0: 2c 20 30 2c 20 69 50 74 72 2d 3e 63 6d 64 46 72  , 0, iPtr->cmdFr
6ae0: 61 6d 65 50 74 72 2c 20 33 29 3b 0d 0a 20 0d 0a  amePtr, 3);.. ..
6af0: 20 20 20 20 20 2f 2a 0d 0a 20 20 20 20 20 20 2a       /*..      *
6b00: 20 46 6f 72 20 75 6e 77 69 6e 64 69 6e 67 20 65   For unwinding e
6b10: 76 65 72 79 74 68 69 6e 67 20 6f 6e 20 65 72 72  verything on err
6b20: 6f 72 2e 0d 0a 40 40 20 2d 32 34 33 35 2c 31 31  or...@@ -2435,11
6b30: 20 2b 32 34 36 32 2c 31 31 20 40 40 0d 0a 20 20   +2462,11 @@..  
6b40: 20 20 20 54 63 6c 53 74 61 63 6b 46 72 65 65 28     TclStackFree(
6b50: 69 6e 74 65 72 70 2c 20 73 65 61 72 63 68 50 74  interp, searchPt
6b60: 72 29 3b 0d 0a 20 20 20 20 20 72 65 74 75 72 6e  r);..     return
6b70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0d 0a 20 7d 0d   TCL_ERROR;.. }.
6b80: 0a 20 0d 0a 20 73 74 61 74 69 63 20 69 6e 74 0d  . .. static int.
6b90: 0a 2d 44 69 63 74 46 6f 72 4c 6f 6f 70 43 61 6c  .-DictForLoopCal
6ba0: 6c 62 61 63 6b 28 0d 0a 2b 44 69 63 74 45 61 63  lback(..+DictEac
6bb0: 68 4c 6f 6f 70 43 61 6c 6c 62 61 63 6b 28 0d 0a  hLoopCallback(..
6bc0: 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20       ClientData 
6bd0: 64 61 74 61 5b 5d 2c 0d 0a 20 20 20 20 20 54 63  data[],..     Tc
6be0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6bf0: 2c 0d 0a 20 20 20 20 20 69 6e 74 20 72 65 73 75  ,..     int resu
6c00: 6c 74 29 0d 0a 20 7b 0d 0a 20 20 20 20 20 49 6e  lt).. {..     In
6c10: 74 65 72 70 20 2a 69 50 74 72 20 3d 20 28 49 6e  terp *iPtr = (In
6c20: 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70 3b 0d  terp *) interp;.
6c30: 0a 40 40 20 2d 32 34 36 30 2c 32 33 20 2b 32 34  .@@ -2460,23 +24
6c40: 38 37 2c 33 38 20 40 40 0d 0a 20 09 69 66 20 28  87,38 @@.. .if (
6c50: 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 42 52  result == TCL_BR
6c60: 45 41 4b 29 20 7b 0d 0a 20 09 20 20 20 20 54 63  EAK) {.. .    Tc
6c70: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
6c80: 74 65 72 70 29 3b 0d 0a 20 09 20 20 20 20 72 65  terp);.. .    re
6c90: 73 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b 3b 0d 0a  sult = TCL_OK;..
6ca0: 20 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 73   .} else if (res
6cb0: 75 6c 74 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52  ult == TCL_ERROR
6cc0: 29 20 7b 0d 0a 20 09 20 20 20 20 54 63 6c 5f 41  ) {.. .    Tcl_A
6cd0: 70 70 65 6e 64 4f 62 6a 54 6f 45 72 72 6f 72 49  ppendObjToErrorI
6ce0: 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nfo(interp, Tcl_
6cf0: 4f 62 6a 50 72 69 6e 74 66 28 0d 0a 2d 09 09 20  ObjPrintf(..-.. 
6d00: 20 20 20 22 5c 6e 20 20 20 20 28 5c 22 64 69 63     "\n    (\"dic
6d10: 74 20 66 6f 72 5c 22 20 62 6f 64 79 20 6c 69 6e  t for\" body lin
6d20: 65 20 25 64 29 22 2c 0d 0a 2b 09 09 20 20 20 20  e %d)",..+..    
6d30: 28 28 73 65 61 72 63 68 50 74 72 2d 3e 72 65 73  ((searchPtr->res
6d40: 75 6c 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  ultList == NULL)
6d50: 20 3f 20 0d 0a 2b 09 09 09 22 5c 6e 20 20 20 20   ? ..+..."\n    
6d60: 28 5c 22 64 69 63 74 20 66 6f 72 5c 22 20 62 6f  (\"dict for\" bo
6d70: 64 79 20 6c 69 6e 65 20 25 64 29 22 20 3a 20 0d  dy line %d)" : .
6d80: 0a 2b 09 09 09 22 5c 6e 20 20 20 20 28 5c 22 64  .+..."\n    (\"d
6d90: 69 63 74 20 6d 61 70 5c 22 20 62 6f 64 79 20 6c  ict map\" body l
6da0: 69 6e 65 20 25 64 29 22 29 2c 0d 0a 20 09 09 20  ine %d)"),.. .. 
6db0: 20 20 20 54 63 6c 5f 47 65 74 45 72 72 6f 72 4c     Tcl_GetErrorL
6dc0: 69 6e 65 28 69 6e 74 65 72 70 29 29 29 3b 0d 0a  ine(interp)));..
6dd0: 20 09 7d 0d 0a 20 09 67 6f 74 6f 20 64 6f 6e 65   .}.. .goto done
6de0: 3b 0d 0a 20 20 20 20 20 7d 0d 0a 2b 0d 0a 2b 20  ;..     }..+..+ 
6df0: 20 20 20 2f 2a 0d 0a 2b 20 20 20 20 20 2a 20 43     /*..+     * C
6e00: 61 70 74 75 72 65 20 72 65 73 75 6c 74 20 69 66  apture result if
6e10: 20 63 6f 6c 6c 65 63 74 69 6e 67 2e 0d 0a 2b 20   collecting...+ 
6e20: 20 20 20 20 2a 2f 0d 0a 2b 0d 0a 2b 20 20 20 20      */..+..+    
6e30: 69 66 20 28 73 65 61 72 63 68 50 74 72 2d 3e 72  if (searchPtr->r
6e40: 65 73 75 6c 74 4c 69 73 74 20 21 3d 20 4e 55 4c  esultList != NUL
6e50: 4c 29 20 7b 0d 0a 2b 09 54 63 6c 5f 4c 69 73 74  L) {..+.Tcl_List
6e60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
6e70: 28 69 6e 74 65 72 70 2c 20 73 65 61 72 63 68 50  (interp, searchP
6e80: 74 72 2d 3e 72 65 73 75 6c 74 4c 69 73 74 2c 20  tr->resultList, 
6e90: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
6ea0: 28 69 6e 74 65 72 70 29 29 3b 0d 0a 2b 20 20 20  (interp));..+   
6eb0: 20 7d 0d 0a 20 0d 0a 20 20 20 20 20 2f 2a 0d 0a   }.. ..     /*..
6ec0: 20 20 20 20 20 20 2a 20 47 65 74 20 74 68 65 20        * Get the 
6ed0: 6e 65 78 74 20 6d 61 70 70 69 6e 67 20 66 72 6f  next mapping fro
6ee0: 6d 20 74 68 65 20 64 69 63 74 69 6f 6e 61 72 79  m the dictionary
6ef0: 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 0d 0a  ...      */.. ..
6f00: 20 20 20 20 20 54 63 6c 5f 44 69 63 74 4f 62 6a       Tcl_DictObj
6f10: 4e 65 78 74 28 73 65 61 72 63 68 50 74 72 2c 20  Next(searchPtr, 
6f20: 26 6b 65 79 4f 62 6a 2c 20 26 76 61 6c 75 65 4f  &keyObj, &valueO
6f30: 62 6a 2c 20 26 64 6f 6e 65 29 3b 0d 0a 20 20 20  bj, &done);..   
6f40: 20 20 69 66 20 28 64 6f 6e 65 29 20 7b 0d 0a 2d    if (done) {..-
6f50: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74  .Tcl_ResetResult
6f60: 28 69 6e 74 65 72 70 29 3b 0d 0a 2b 20 20 20 20  (interp);..+    
6f70: 09 69 66 20 28 73 65 61 72 63 68 50 74 72 2d 3e  .if (searchPtr->
6f80: 72 65 73 75 6c 74 4c 69 73 74 20 21 3d 20 4e 55  resultList != NU
6f90: 4c 4c 29 20 7b 0d 0a 2b 09 20 20 20 20 54 63 6c  LL) {..+.    Tcl
6fa0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
6fb0: 74 65 72 70 2c 20 73 65 61 72 63 68 50 74 72 2d  terp, searchPtr-
6fc0: 3e 72 65 73 75 6c 74 4c 69 73 74 29 3b 0d 0a 2b  >resultList);..+
6fd0: 09 20 20 20 20 73 65 61 72 63 68 50 74 72 2d 3e  .    searchPtr->
6fe0: 72 65 73 75 6c 74 4c 69 73 74 20 3d 20 4e 55 4c  resultList = NUL
6ff0: 4c 3b 20 2f 2a 20 44 6f 6e 27 74 20 63 6c 65 61  L; /* Don't clea
7000: 6e 20 69 74 20 75 70 20 2a 2f 0d 0a 2b 09 7d 20  n it up */..+.} 
7010: 65 6c 73 65 20 7b 0d 0a 2b 09 20 20 20 20 54 63  else {..+.    Tc
7020: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
7030: 74 65 72 70 29 3b 0d 0a 2b 09 7d 20 20 20 20 09  terp);..+.}    .
7040: 0d 0a 20 09 67 6f 74 6f 20 64 6f 6e 65 3b 0d 0a  .. .goto done;..
7050: 20 20 20 20 20 7d 0d 0a 20 0d 0a 20 20 20 20 20       }.. ..     
7060: 2f 2a 0d 0a 20 20 20 20 20 20 2a 20 53 74 6f 70  /*..      * Stop
7070: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
7080: 67 65 74 74 69 6e 67 20 68 69 74 20 69 6e 20 61  getting hit in a
7090: 6e 79 20 77 61 79 20 62 79 20 61 6e 79 20 74 72  ny way by any tr
70a0: 61 63 65 73 20 6f 6e 20 74 68 65 20 6b 65 79 0d  aces on the key.
70b0: 0a 40 40 20 2d 32 34 39 37 2c 32 31 20 2b 32 35  .@@ -2497,21 +25
70c0: 33 39 2c 32 34 20 40 40 0d 0a 20 0d 0a 20 20 20  39,24 @@.. ..   
70d0: 20 20 2f 2a 0d 0a 20 20 20 20 20 20 2a 20 52 75    /*..      * Ru
70e0: 6e 20 74 68 65 20 73 63 72 69 70 74 2e 0d 0a 20  n the script... 
70f0: 20 20 20 20 20 2a 2f 0d 0a 20 0d 0a 2d 20 20 20       */.. ..-   
7100: 20 54 63 6c 4e 52 41 64 64 43 61 6c 6c 62 61 63   TclNRAddCallbac
7110: 6b 28 69 6e 74 65 72 70 2c 20 44 69 63 74 46 6f  k(interp, DictFo
7120: 72 4c 6f 6f 70 43 61 6c 6c 62 61 63 6b 2c 20 73  rLoopCallback, s
7130: 65 61 72 63 68 50 74 72 2c 20 6b 65 79 56 61 72  earchPtr, keyVar
7140: 4f 62 6a 2c 0d 0a 2b 20 20 20 20 54 63 6c 4e 52  Obj,..+    TclNR
7150: 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  AddCallback(inte
7160: 72 70 2c 20 44 69 63 74 45 61 63 68 4c 6f 6f 70  rp, DictEachLoop
7170: 43 61 6c 6c 62 61 63 6b 2c 20 73 65 61 72 63 68  Callback, search
7180: 50 74 72 2c 20 6b 65 79 56 61 72 4f 62 6a 2c 0d  Ptr, keyVarObj,.
7190: 0a 20 09 20 20 20 20 76 61 6c 75 65 56 61 72 4f  . .    valueVarO
71a0: 62 6a 2c 20 73 63 72 69 70 74 4f 62 6a 29 3b 0d  bj, scriptObj);.
71b0: 0a 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c  .     return Tcl
71c0: 4e 52 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  NREvalObjEx(inte
71d0: 72 70 2c 20 73 63 72 69 70 74 4f 62 6a 2c 20 30  rp, scriptObj, 0
71e0: 2c 20 69 50 74 72 2d 3e 63 6d 64 46 72 61 6d 65  , iPtr->cmdFrame
71f0: 50 74 72 2c 20 33 29 3b 0d 0a 20 0d 0a 20 20 20  Ptr, 3);.. ..   
7200: 20 20 2f 2a 0d 0a 20 20 20 20 20 20 2a 20 46 6f    /*..      * Fo
7210: 72 20 75 6e 77 69 6e 64 69 6e 67 20 65 76 65 72  r unwinding ever
7220: 79 74 68 69 6e 67 20 6f 6e 63 65 20 74 68 65 20  ything once the 
7230: 69 74 65 72 61 74 69 6e 67 20 69 73 20 64 6f 6e  iterating is don
7240: 65 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20 0d  e...      */.. .
7250: 0a 2d 20 20 64 6f 6e 65 3a 0d 0a 2b 64 6f 6e 65  .-  done:..+done
7260: 3a 0d 0a 20 20 20 20 20 54 63 6c 44 65 63 72 52  :..     TclDecrR
7270: 65 66 43 6f 75 6e 74 28 6b 65 79 56 61 72 4f 62  efCount(keyVarOb
7280: 6a 29 3b 0d 0a 20 20 20 20 20 54 63 6c 44 65 63  j);..     TclDec
7290: 72 52 65 66 43 6f 75 6e 74 28 76 61 6c 75 65 56  rRefCount(valueV
72a0: 61 72 4f 62 6a 29 3b 0d 0a 2b 20 20 20 20 69 66  arObj);..+    if
72b0: 20 28 73 65 61 72 63 68 50 74 72 2d 3e 72 65 73   (searchPtr->res
72c0: 75 6c 74 4c 69 73 74 20 21 3d 20 4e 55 4c 4c 29  ultList != NULL)
72d0: 20 7b 0d 0a 2b 09 54 63 6c 44 65 63 72 52 65 66   {..+.TclDecrRef
72e0: 43 6f 75 6e 74 28 73 65 61 72 63 68 50 74 72 2d  Count(searchPtr-
72f0: 3e 72 65 73 75 6c 74 4c 69 73 74 29 3b 0d 0a 2b  >resultList);..+
7300: 20 20 20 20 7d 0d 0a 20 20 20 20 20 54 63 6c 44      }..     TclD
7310: 65 63 72 52 65 66 43 6f 75 6e 74 28 73 63 72 69  ecrRefCount(scri
7320: 70 74 4f 62 6a 29 3b 0d 0a 20 20 20 20 20 54 63  ptObj);..     Tc
7330: 6c 5f 44 69 63 74 4f 62 6a 44 6f 6e 65 28 73 65  l_DictObjDone(se
7340: 61 72 63 68 50 74 72 29 3b 0d 0a 20 20 20 20 20  archPtr);..     
7350: 54 63 6c 53 74 61 63 6b 46 72 65 65 28 69 6e 74  TclStackFree(int
7360: 65 72 70 2c 20 73 65 61 72 63 68 50 74 72 29 3b  erp, searchPtr);
7370: 0d 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72 65  ..     return re
7380: 73 75 6c 74 3b 0d 0a 20 7d 0d 0a 0d 0a 49 6e 64  sult;.. }....Ind
7390: 65 78 3a 20 67 65 6e 65 72 69 63 2f 74 63 6c 49  ex: generic/tclI
73a0: 6e 74 2e 68 0d 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  nt.h..==========
73b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
73c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
73d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
73e0: 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a 2d 2d 2d 20 67 65  ========..--- ge
73f0: 6e 65 72 69 63 2f 74 63 6c 49 6e 74 2e 68 0d 0a  neric/tclInt.h..
7400: 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 49  +++ generic/tclI
7410: 6e 74 2e 68 0d 0a 40 40 20 2d 32 37 37 32 2c 31  nt.h..@@ -2772,1
7420: 30 20 2b 32 37 37 32 2c 31 31 20 40 40 0d 0a 20  0 +2772,11 @@.. 
7430: 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20 54 63 6c  MODULE_SCOPE Tcl
7440: 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 54 63 6c 4e  _ObjCmdProc TclN
7450: 52 43 61 74 63 68 4f 62 6a 43 6d 64 3b 0d 0a 20  RCatchObjCmd;.. 
7460: 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20 54 63 6c  MODULE_SCOPE Tcl
7470: 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 54 63 6c 4e  _ObjCmdProc TclN
7480: 52 45 78 70 72 4f 62 6a 43 6d 64 3b 0d 0a 20 4d  RExprObjCmd;.. M
7490: 4f 44 55 4c 45 5f 53 43 4f 50 45 20 54 63 6c 5f  ODULE_SCOPE Tcl_
74a0: 4f 62 6a 43 6d 64 50 72 6f 63 20 54 63 6c 4e 52  ObjCmdProc TclNR
74b0: 46 6f 72 4f 62 6a 43 6d 64 3b 0d 0a 20 4d 4f 44  ForObjCmd;.. MOD
74c0: 55 4c 45 5f 53 43 4f 50 45 20 54 63 6c 5f 4f 62  ULE_SCOPE Tcl_Ob
74d0: 6a 43 6d 64 50 72 6f 63 20 54 63 6c 4e 52 46 6f  jCmdProc TclNRFo
74e0: 72 65 61 63 68 43 6d 64 3b 0d 0a 20 4d 4f 44 55  reachCmd;.. MODU
74f0: 4c 45 5f 53 43 4f 50 45 20 54 63 6c 5f 4f 62 6a  LE_SCOPE Tcl_Obj
7500: 43 6d 64 50 72 6f 63 20 54 63 6c 4e 52 49 66 4f  CmdProc TclNRIfO
7510: 62 6a 43 6d 64 3b 0d 0a 2b 4d 4f 44 55 4c 45 5f  bjCmd;..+MODULE_
7520: 53 43 4f 50 45 20 54 63 6c 5f 4f 62 6a 43 6d 64  SCOPE Tcl_ObjCmd
7530: 50 72 6f 63 20 54 63 6c 4e 52 4d 61 70 65 61 63  Proc TclNRMapeac
7540: 68 43 6d 64 3b 0d 0a 20 4d 4f 44 55 4c 45 5f 53  hCmd;.. MODULE_S
7550: 43 4f 50 45 20 54 63 6c 5f 4f 62 6a 43 6d 64 50  COPE Tcl_ObjCmdP
7560: 72 6f 63 20 54 63 6c 4e 52 53 6f 75 72 63 65 4f  roc TclNRSourceO
7570: 62 6a 43 6d 64 3b 0d 0a 20 4d 4f 44 55 4c 45 5f  bjCmd;.. MODULE_
7580: 53 43 4f 50 45 20 54 63 6c 5f 4f 62 6a 43 6d 64  SCOPE Tcl_ObjCmd
7590: 50 72 6f 63 20 54 63 6c 4e 52 53 75 62 73 74 4f  Proc TclNRSubstO
75a0: 62 6a 43 6d 64 3b 0d 0a 20 4d 4f 44 55 4c 45 5f  bjCmd;.. MODULE_
75b0: 53 43 4f 50 45 20 54 63 6c 5f 4f 62 6a 43 6d 64  SCOPE Tcl_ObjCmd
75c0: 50 72 6f 63 20 54 63 6c 4e 52 53 77 69 74 63 68  Proc TclNRSwitch
75d0: 4f 62 6a 43 6d 64 3b 0d 0a 20 4d 4f 44 55 4c 45  ObjCmd;.. MODULE
75e0: 5f 53 43 4f 50 45 20 54 63 6c 5f 4f 62 6a 43 6d  _SCOPE Tcl_ObjCm
75f0: 64 50 72 6f 63 20 54 63 6c 4e 52 54 72 79 4f 62  dProc TclNRTryOb
7600: 6a 43 6d 64 3b 0d 0a 20 4d 4f 44 55 4c 45 5f 53  jCmd;.. MODULE_S
7610: 43 4f 50 45 20 54 63 6c 5f 4f 62 6a 43 6d 64 50  COPE Tcl_ObjCmdP
7620: 72 6f 63 20 54 63 6c 4e 52 55 70 6c 65 76 65 6c  roc TclNRUplevel
7630: 4f 62 6a 43 6d 64 3b 0d 0a 40 40 20 2d 33 33 36  ObjCmd;..@@ -336
7640: 33 2c 31 30 20 2b 33 33 36 34 2c 31 33 20 40 40  3,10 +3364,13 @@
7650: 0d 0a 20 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20  .. MODULE_SCOPE 
7660: 69 6e 74 09 54 63 6c 5f 4c 73 65 74 4f 62 6a 43  int.Tcl_LsetObjC
7670: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
7680: 69 65 6e 74 44 61 74 61 2c 0d 0a 20 09 09 09 20  ientData,.. ... 
7690: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
76a0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
76b0: 0d 0a 20 09 09 09 20 20 20 20 54 63 6c 5f 4f 62  .. ...    Tcl_Ob
76c0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
76d0: 3b 0d 0a 20 4d 4f 44 55 4c 45 5f 53 43 4f 50 45  ;.. MODULE_SCOPE
76e0: 20 69 6e 74 09 54 63 6c 5f 4c 73 6f 72 74 4f 62   int.Tcl_LsortOb
76f0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
7700: 63 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20 09 09  clientData,.. ..
7710: 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
7720: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
7730: 63 2c 0d 0a 2b 09 09 09 20 20 20 20 54 63 6c 5f  c,..+...    Tcl_
7740: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
7750: 5d 29 3b 0d 0a 2b 4d 4f 44 55 4c 45 5f 53 43 4f  ]);..+MODULE_SCO
7760: 50 45 20 69 6e 74 09 54 63 6c 5f 4d 61 70 65 61  PE int.Tcl_Mapea
7770: 63 68 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  chObjCmd(ClientD
7780: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0d  ata clientData,.
7790: 0a 2b 09 09 09 20 20 20 20 54 63 6c 5f 49 6e 74  .+...    Tcl_Int
77a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
77b0: 20 6f 62 6a 63 2c 0d 0a 20 09 09 09 20 20 20 20   objc,.. ...    
77c0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
77d0: 62 6a 76 5b 5d 29 3b 0d 0a 20 4d 4f 44 55 4c 45  bjv[]);.. MODULE
77e0: 5f 53 43 4f 50 45 20 54 63 6c 5f 43 6f 6d 6d 61  _SCOPE Tcl_Comma
77f0: 6e 64 20 54 63 6c 49 6e 69 74 4e 61 6d 65 73 70  nd TclInitNamesp
7800: 61 63 65 43 6d 64 28 54 63 6c 5f 49 6e 74 65 72  aceCmd(Tcl_Inter
7810: 70 20 2a 69 6e 74 65 72 70 29 3b 0d 0a 20 4d 4f  p *interp);.. MO
7820: 44 55 4c 45 5f 53 43 4f 50 45 20 69 6e 74 09 54  DULE_SCOPE int.T
7830: 63 6c 4e 61 6d 65 73 70 61 63 65 45 6e 73 65 6d  clNamespaceEnsem
7840: 62 6c 65 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  bleCmd(ClientDat
7850: 61 20 64 75 6d 6d 79 2c 0d 0a 20 09 09 09 20 20  a dummy,.. ...  
7860: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7870: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 0d  terp, int objc,.
7880: 0a 20 09 09 09 20 20 20 20 54 63 6c 5f 4f 62 6a  . ...    Tcl_Obj
7890: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 3b   *const objv[]);
78a0: 0d 0a 40 40 20 2d 33 34 38 39 2c 31 30 20 2b 33  ..@@ -3489,10 +3
78b0: 34 39 33 2c 31 33 20 40 40 0d 0a 20 4d 4f 44 55  493,13 @@.. MODU
78c0: 4c 45 5f 53 43 4f 50 45 20 69 6e 74 09 54 63 6c  LE_SCOPE int.Tcl
78d0: 43 6f 6d 70 69 6c 65 44 69 63 74 41 70 70 65 6e  CompileDictAppen
78e0: 64 43 6d 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  dCmd(Tcl_Interp 
78f0: 2a 69 6e 74 65 72 70 2c 0d 0a 20 09 09 09 20 20  *interp,.. ...  
7900: 20 20 54 63 6c 5f 50 61 72 73 65 20 2a 70 61 72    Tcl_Parse *par
7910: 73 65 50 74 72 2c 20 43 6f 6d 6d 61 6e 64 20 2a  sePtr, Command *
7920: 63 6d 64 50 74 72 2c 0d 0a 20 09 09 09 20 20 20  cmdPtr,.. ...   
7930: 20 73 74 72 75 63 74 20 43 6f 6d 70 69 6c 65 45   struct CompileE
7940: 6e 76 20 2a 65 6e 76 50 74 72 29 3b 0d 0a 20 4d  nv *envPtr);.. M
7950: 4f 44 55 4c 45 5f 53 43 4f 50 45 20 69 6e 74 09  ODULE_SCOPE int.
7960: 54 63 6c 43 6f 6d 70 69 6c 65 44 69 63 74 46 6f  TclCompileDictFo
7970: 72 43 6d 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  rCmd(Tcl_Interp 
7980: 2a 69 6e 74 65 72 70 2c 0d 0a 20 09 09 09 20 20  *interp,.. ...  
7990: 20 20 54 63 6c 5f 50 61 72 73 65 20 2a 70 61 72    Tcl_Parse *par
79a0: 73 65 50 74 72 2c 20 43 6f 6d 6d 61 6e 64 20 2a  sePtr, Command *
79b0: 63 6d 64 50 74 72 2c 0d 0a 2b 09 09 09 20 20 20  cmdPtr,..+...   
79c0: 20 73 74 72 75 63 74 20 43 6f 6d 70 69 6c 65 45   struct CompileE
79d0: 6e 76 20 2a 65 6e 76 50 74 72 29 3b 0d 0a 2b 4d  nv *envPtr);..+M
79e0: 4f 44 55 4c 45 5f 53 43 4f 50 45 20 69 6e 74 09  ODULE_SCOPE int.
79f0: 54 63 6c 43 6f 6d 70 69 6c 65 44 69 63 74 4d 61  TclCompileDictMa
7a00: 70 43 6d 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  pCmd(Tcl_Interp 
7a10: 2a 69 6e 74 65 72 70 2c 0d 0a 2b 09 09 09 20 20  *interp,..+...  
7a20: 20 20 54 63 6c 5f 50 61 72 73 65 20 2a 70 61 72    Tcl_Parse *par
7a30: 73 65 50 74 72 2c 20 43 6f 6d 6d 61 6e 64 20 2a  sePtr, Command *
7a40: 63 6d 64 50 74 72 2c 0d 0a 20 09 09 09 20 20 20  cmdPtr,.. ...   
7a50: 20 73 74 72 75 63 74 20 43 6f 6d 70 69 6c 65 45   struct CompileE
7a60: 6e 76 20 2a 65 6e 76 50 74 72 29 3b 0d 0a 20 4d  nv *envPtr);.. M
7a70: 4f 44 55 4c 45 5f 53 43 4f 50 45 20 69 6e 74 09  ODULE_SCOPE int.
7a80: 54 63 6c 43 6f 6d 70 69 6c 65 44 69 63 74 47 65  TclCompileDictGe
7a90: 74 43 6d 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  tCmd(Tcl_Interp 
7aa0: 2a 69 6e 74 65 72 70 2c 0d 0a 20 09 09 09 20 20  *interp,.. ...  
7ab0: 20 20 54 63 6c 5f 50 61 72 73 65 20 2a 70 61 72    Tcl_Parse *par
7ac0: 73 65 50 74 72 2c 20 43 6f 6d 6d 61 6e 64 20 2a  sePtr, Command *
7ad0: 63 6d 64 50 74 72 2c 0d 0a 20 09 09 09 20 20 20  cmdPtr,.. ...   
7ae0: 20 73 74 72 75 63 74 20 43 6f 6d 70 69 6c 65 45   struct CompileE
7af0: 6e 76 20 2a 65 6e 76 50 74 72 29 3b 0d 0a 20 4d  nv *envPtr);.. M
7b00: 4f 44 55 4c 45 5f 53 43 4f 50 45 20 69 6e 74 09  ODULE_SCOPE int.
7b10: 54 63 6c 43 6f 6d 70 69 6c 65 44 69 63 74 49 6e  TclCompileDictIn
7b20: 63 72 43 6d 64 28 54 63 6c 5f 49 6e 74 65 72 70  crCmd(Tcl_Interp
7b30: 20 2a 69 6e 74 65 72 70 2c 0d 0a 40 40 20 2d 33   *interp,..@@ -3
7b40: 35 35 38 2c 31 30 20 2b 33 35 36 35 2c 31 33 20  558,10 +3565,13 
7b50: 40 40 0d 0a 20 4d 4f 44 55 4c 45 5f 53 43 4f 50  @@.. MODULE_SCOP
7b60: 45 20 69 6e 74 09 54 63 6c 43 6f 6d 70 69 6c 65  E int.TclCompile
7b70: 4c 72 65 70 6c 61 63 65 43 6d 64 28 54 63 6c 5f  LreplaceCmd(Tcl_
7b80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d  Interp *interp,.
7b90: 0a 20 09 09 09 20 20 20 20 54 63 6c 5f 50 61 72  . ...    Tcl_Par
7ba0: 73 65 20 2a 70 61 72 73 65 50 74 72 2c 20 43 6f  se *parsePtr, Co
7bb0: 6d 6d 61 6e 64 20 2a 63 6d 64 50 74 72 2c 0d 0a  mmand *cmdPtr,..
7bc0: 20 09 09 09 20 20 20 20 73 74 72 75 63 74 20 43   ...    struct C
7bd0: 6f 6d 70 69 6c 65 45 6e 76 20 2a 65 6e 76 50 74  ompileEnv *envPt
7be0: 72 29 3b 0d 0a 20 4d 4f 44 55 4c 45 5f 53 43 4f  r);.. MODULE_SCO
7bf0: 50 45 20 69 6e 74 09 54 63 6c 43 6f 6d 70 69 6c  PE int.TclCompil
7c00: 65 4c 73 65 74 43 6d 64 28 54 63 6c 5f 49 6e 74  eLsetCmd(Tcl_Int
7c10: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 20 09  erp *interp,.. .
7c20: 09 09 20 20 20 20 54 63 6c 5f 50 61 72 73 65 20  ..    Tcl_Parse 
7c30: 2a 70 61 72 73 65 50 74 72 2c 20 43 6f 6d 6d 61  *parsePtr, Comma
7c40: 6e 64 20 2a 63 6d 64 50 74 72 2c 0d 0a 2b 09 09  nd *cmdPtr,..+..
7c50: 09 20 20 20 20 73 74 72 75 63 74 20 43 6f 6d 70  .    struct Comp
7c60: 69 6c 65 45 6e 76 20 2a 65 6e 76 50 74 72 29 3b  ileEnv *envPtr);
7c70: 0d 0a 2b 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20  ..+MODULE_SCOPE 
7c80: 69 6e 74 09 54 63 6c 43 6f 6d 70 69 6c 65 4d 61  int.TclCompileMa
7c90: 70 65 61 63 68 43 6d 64 28 54 63 6c 5f 49 6e 74  peachCmd(Tcl_Int
7ca0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 2b 09  erp *interp,..+.
7cb0: 09 09 20 20 20 20 54 63 6c 5f 50 61 72 73 65 20  ..    Tcl_Parse 
7cc0: 2a 70 61 72 73 65 50 74 72 2c 20 43 6f 6d 6d 61  *parsePtr, Comma
7cd0: 6e 64 20 2a 63 6d 64 50 74 72 2c 0d 0a 20 09 09  nd *cmdPtr,.. ..
7ce0: 09 20 20 20 20 73 74 72 75 63 74 20 43 6f 6d 70  .    struct Comp
7cf0: 69 6c 65 45 6e 76 20 2a 65 6e 76 50 74 72 29 3b  ileEnv *envPtr);
7d00: 0d 0a 20 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20  .. MODULE_SCOPE 
7d10: 69 6e 74 09 54 63 6c 43 6f 6d 70 69 6c 65 4e 61  int.TclCompileNa
7d20: 6d 65 73 70 61 63 65 55 70 76 61 72 43 6d 64 28  mespaceUpvarCmd(
7d30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7d40: 72 70 2c 0d 0a 20 09 09 09 20 20 20 20 54 63 6c  rp,.. ...    Tcl
7d50: 5f 50 61 72 73 65 20 2a 70 61 72 73 65 50 74 72  _Parse *parsePtr
7d60: 2c 20 43 6f 6d 6d 61 6e 64 20 2a 63 6d 64 50 74  , Command *cmdPt
7d70: 72 2c 0d 0a 20 09 09 09 20 20 20 20 73 74 72 75  r,.. ...    stru
7d80: 63 74 20 43 6f 6d 70 69 6c 65 45 6e 76 20 2a 65  ct CompileEnv *e
7d90: 6e 76 50 74 72 29 3b 0d 0a 20 4d 4f 44 55 4c 45  nvPtr);.. MODULE
7da0: 5f 53 43 4f 50 45 20 69 6e 74 09 54 63 6c 43 6f  _SCOPE int.TclCo
7db0: 6d 70 69 6c 65 4e 6f 4f 70 28 54 63 6c 5f 49 6e  mpileNoOp(Tcl_In
7dc0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0d 0a 0d  terp *interp,...
7dd0: 0a 49 6e 64 65 78 3a 20 74 65 73 74 73 2f 64 69  .Index: tests/di
7de0: 63 74 2e 74 65 73 74 0d 0a 3d 3d 3d 3d 3d 3d 3d  ct.test..=======
7df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7e10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a 2d 2d 2d  ===========..---
7e30: 20 74 65 73 74 73 2f 64 69 63 74 2e 74 65 73 74   tests/dict.test
7e40: 0d 0a 2b 2b 2b 20 74 65 73 74 73 2f 64 69 63 74  ..+++ tests/dict
7e50: 2e 74 65 73 74 0d 0a 40 40 20 2d 31 35 31 39 2c  .test..@@ -1519,
7e60: 31 33 20 2b 31 35 31 39 2c 32 35 39 20 40 40 0d  13 +1519,259 @@.
7e70: 0a 20 09 20 20 20 20 7d 0d 0a 20 09 7d 0d 0a 20  . .    }.. .}.. 
7e80: 20 20 20 20 7d 7d 20 5b 6c 69 6e 65 6e 75 6d 62      }} [linenumb
7e90: 65 72 5d 7d 7d 0d 0a 20 7d 20 35 0d 0a 20 72 65  er]}}.. } 5.. re
7ea0: 6e 61 6d 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20  name linenumber 
7eb0: 7b 7d 0d 0a 2b 0d 0a 2b 74 65 73 74 20 64 69 63  {}..+..+test dic
7ec0: 74 2d 32 34 2e 31 20 7b 64 69 63 74 20 6d 61 70  t-24.1 {dict map
7ed0: 20 63 6f 6d 6d 61 6e 64 3a 20 73 79 6e 74 61 78   command: syntax
7ee0: 7d 20 2d 72 65 74 75 72 6e 43 6f 64 65 73 20 65  } -returnCodes e
7ef0: 72 72 6f 72 20 2d 62 6f 64 79 20 7b 0d 0a 2b 20  rror -body {..+ 
7f00: 20 20 20 64 69 63 74 20 6d 61 70 0d 0a 2b 7d 20     dict map..+} 
7f10: 2d 72 65 73 75 6c 74 20 7b 77 72 6f 6e 67 20 23  -result {wrong #
7f20: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
7f30: 20 22 64 69 63 74 20 6d 61 70 20 7b 6b 65 79 56   "dict map {keyV
7f40: 61 72 20 76 61 6c 75 65 56 61 72 7d 20 64 69 63  ar valueVar} dic
7f50: 74 69 6f 6e 61 72 79 20 73 63 72 69 70 74 22 7d  tionary script"}
7f60: 0d 0a 2b 74 65 73 74 20 64 69 63 74 2d 32 34 2e  ..+test dict-24.
7f70: 32 20 7b 64 69 63 74 20 6d 61 70 20 63 6f 6d 6d  2 {dict map comm
7f80: 61 6e 64 3a 20 73 79 6e 74 61 78 7d 20 2d 72 65  and: syntax} -re
7f90: 74 75 72 6e 43 6f 64 65 73 20 65 72 72 6f 72 20  turnCodes error 
7fa0: 2d 62 6f 64 79 20 7b 0d 0a 2b 20 20 20 20 64 69  -body {..+    di
7fb0: 63 74 20 6d 61 70 20 78 0d 0a 2b 7d 20 2d 72 65  ct map x..+} -re
7fc0: 73 75 6c 74 20 7b 77 72 6f 6e 67 20 23 20 61 72  sult {wrong # ar
7fd0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 64  gs: should be "d
7fe0: 69 63 74 20 6d 61 70 20 7b 6b 65 79 56 61 72 20  ict map {keyVar 
7ff0: 76 61 6c 75 65 56 61 72 7d 20 64 69 63 74 69 6f  valueVar} dictio
8000: 6e 61 72 79 20 73 63 72 69 70 74 22 7d 0d 0a 2b  nary script"}..+
8010: 74 65 73 74 20 64 69 63 74 2d 32 34 2e 33 20 7b  test dict-24.3 {
8020: 64 69 63 74 20 6d 61 70 20 63 6f 6d 6d 61 6e 64  dict map command
8030: 3a 20 73 79 6e 74 61 78 7d 20 2d 72 65 74 75 72  : syntax} -retur
8040: 6e 43 6f 64 65 73 20 65 72 72 6f 72 20 2d 62 6f  nCodes error -bo
8050: 64 79 20 7b 0d 0a 2b 20 20 20 20 64 69 63 74 20  dy {..+    dict 
8060: 6d 61 70 20 78 20 78 0d 0a 2b 7d 20 2d 72 65 73  map x x..+} -res
8070: 75 6c 74 20 7b 77 72 6f 6e 67 20 23 20 61 72 67  ult {wrong # arg
8080: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 64 69  s: should be "di
8090: 63 74 20 6d 61 70 20 7b 6b 65 79 56 61 72 20 76  ct map {keyVar v
80a0: 61 6c 75 65 56 61 72 7d 20 64 69 63 74 69 6f 6e  alueVar} diction
80b0: 61 72 79 20 73 63 72 69 70 74 22 7d 0d 0a 2b 74  ary script"}..+t
80c0: 65 73 74 20 64 69 63 74 2d 32 34 2e 34 20 7b 64  est dict-24.4 {d
80d0: 69 63 74 20 6d 61 70 20 63 6f 6d 6d 61 6e 64 3a  ict map command:
80e0: 20 73 79 6e 74 61 78 7d 20 2d 72 65 74 75 72 6e   syntax} -return
80f0: 43 6f 64 65 73 20 65 72 72 6f 72 20 2d 62 6f 64  Codes error -bod
8100: 79 20 7b 0d 0a 2b 20 20 20 20 64 69 63 74 20 6d  y {..+    dict m
8110: 61 70 20 78 20 78 20 78 20 78 0d 0a 2b 7d 20 2d  ap x x x x..+} -
8120: 72 65 73 75 6c 74 20 7b 77 72 6f 6e 67 20 23 20  result {wrong # 
8130: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8140: 22 64 69 63 74 20 6d 61 70 20 7b 6b 65 79 56 61  "dict map {keyVa
8150: 72 20 76 61 6c 75 65 56 61 72 7d 20 64 69 63 74  r valueVar} dict
8160: 69 6f 6e 61 72 79 20 73 63 72 69 70 74 22 7d 0d  ionary script"}.
8170: 0a 2b 74 65 73 74 20 64 69 63 74 2d 32 34 2e 35  .+test dict-24.5
8180: 20 7b 64 69 63 74 20 6d 61 70 20 63 6f 6d 6d 61   {dict map comma
8190: 6e 64 3a 20 73 79 6e 74 61 78 7d 20 2d 72 65 74  nd: syntax} -ret
81a0: 75 72 6e 43 6f 64 65 73 20 65 72 72 6f 72 20 2d  urnCodes error -
81b0: 62 6f 64 79 20 7b 0d 0a 2b 20 20 20 20 64 69 63  body {..+    dic
81c0: 74 20 6d 61 70 20 78 20 78 20 78 0d 0a 2b 7d 20  t map x x x..+} 
81d0: 2d 72 65 73 75 6c 74 20 7b 6d 75 73 74 20 68 61  -result {must ha
81e0: 76 65 20 65 78 61 63 74 6c 79 20 74 77 6f 20 76  ve exactly two v
81f0: 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 7d 0d 0a  ariable names}..
8200: 2b 74 65 73 74 20 64 69 63 74 2d 32 34 2e 36 20  +test dict-24.6 
8210: 7b 64 69 63 74 20 6d 61 70 20 63 6f 6d 6d 61 6e  {dict map comman
8220: 64 3a 20 73 79 6e 74 61 78 7d 20 2d 72 65 74 75  d: syntax} -retu
8230: 72 6e 43 6f 64 65 73 20 65 72 72 6f 72 20 2d 62  rnCodes error -b
8240: 6f 64 79 20 7b 0d 0a 2b 20 20 20 20 64 69 63 74  ody {..+    dict
8250: 20 6d 61 70 20 7b 78 20 78 20 78 7d 20 78 20 78   map {x x x} x x
8260: 0d 0a 2b 7d 20 2d 72 65 73 75 6c 74 20 7b 6d 75  ..+} -result {mu
8270: 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
8280: 74 77 6f 20 76 61 72 69 61 62 6c 65 20 6e 61 6d  two variable nam
8290: 65 73 7d 0d 0a 2b 74 65 73 74 20 64 69 63 74 2d  es}..+test dict-
82a0: 32 34 2e 37 20 7b 64 69 63 74 20 6d 61 70 20 63  24.7 {dict map c
82b0: 6f 6d 6d 61 6e 64 3a 20 73 79 6e 74 61 78 7d 20  ommand: syntax} 
82c0: 2d 72 65 74 75 72 6e 43 6f 64 65 73 20 65 72 72  -returnCodes err
82d0: 6f 72 20 2d 62 6f 64 79 20 7b 0d 0a 2b 20 20 20  or -body {..+   
82e0: 20 64 69 63 74 20 6d 61 70 20 22 5c 7b 78 22 20   dict map "\{x" 
82f0: 78 20 78 0d 0a 2b 7d 20 2d 72 65 73 75 6c 74 20  x x..+} -result 
8300: 7b 75 6e 6d 61 74 63 68 65 64 20 6f 70 65 6e 20  {unmatched open 
8310: 62 72 61 63 65 20 69 6e 20 6c 69 73 74 7d 0d 0a  brace in list}..
8320: 2b 74 65 73 74 20 64 69 63 74 2d 32 34 2e 38 20  +test dict-24.8 
8330: 7b 64 69 63 74 20 6d 61 70 20 63 6f 6d 6d 61 6e  {dict map comman
8340: 64 7d 20 2d 62 6f 64 79 20 7b 0d 0a 2b 20 20 20  d} -body {..+   
8350: 20 23 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e   # This test con
8360: 66 69 72 6d 73 20 74 68 61 74 20 5b 64 69 63 74  firms that [dict
8370: 20 6b 65 79 73 5d 2c 20 5b 64 69 63 74 20 76 61   keys], [dict va
8380: 6c 75 65 73 5d 20 61 6e 64 20 5b 64 69 63 74 20  lues] and [dict 
8390: 6d 61 70 5d 0d 0a 2b 20 20 20 20 23 20 61 6c 6c  map]..+    # all
83a0: 20 74 72 61 76 65 72 73 65 20 61 20 64 69 63 74   traverse a dict
83b0: 69 6f 6e 61 72 79 20 69 6e 20 74 68 65 20 73 61  ionary in the sa
83c0: 6d 65 20 6f 72 64 65 72 2e 0d 0a 2b 20 20 20 20  me order...+    
83d0: 73 65 74 20 64 69 63 74 76 20 7b 61 20 41 20 62  set dictv {a A b
83e0: 20 42 20 63 20 43 7d 0d 0a 2b 20 20 20 20 73 65   B c C}..+    se
83f0: 74 20 76 61 6c 75 65 73 20 7b 7d 0d 0a 2b 20 20  t values {}..+  
8400: 20 20 73 65 74 20 6b 65 79 73 20 5b 64 69 63 74    set keys [dict
8410: 20 6d 61 70 20 7b 6b 20 76 7d 20 24 64 69 63 74   map {k v} $dict
8420: 76 20 7b 0d 0a 2b 09 6c 61 70 70 65 6e 64 20 76  v {..+.lappend v
8430: 61 6c 75 65 73 20 24 76 0d 0a 2b 09 73 65 74 20  alues $v..+.set 
8440: 6b 0d 0a 2b 20 20 20 20 7d 5d 0d 0a 2b 20 20 20  k..+    }]..+   
8450: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 65 78 70   set result [exp
8460: 72 20 7b 0d 0a 2b 09 24 6b 65 79 73 20 65 71 20  r {..+.$keys eq 
8470: 5b 64 69 63 74 20 6b 65 79 73 20 24 64 69 63 74  [dict keys $dict
8480: 76 5d 20 26 26 20 24 76 61 6c 75 65 73 20 65 71  v] && $values eq
8490: 20 5b 64 69 63 74 20 76 61 6c 75 65 73 20 24 64   [dict values $d
84a0: 69 63 74 76 5d 0d 0a 2b 20 20 20 20 7d 5d 0d 0a  ictv]..+    }]..
84b0: 2b 20 20 20 20 65 78 70 72 20 7b 24 72 65 73 75  +    expr {$resu
84c0: 6c 74 20 3f 20 22 59 45 53 22 20 3a 20 5b 6c 69  lt ? "YES" : [li
84d0: 73 74 20 22 4e 4f 22 20 24 64 69 63 74 76 20 24  st "NO" $dictv $
84e0: 6b 65 79 73 20 24 76 61 6c 75 65 73 5d 7d 0d 0a  keys $values]}..
84f0: 2b 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0d 0a 2b  +} -cleanup {..+
8500: 20 20 20 20 75 6e 73 65 74 20 72 65 73 75 6c 74      unset result
8510: 20 6b 65 79 73 20 76 61 6c 75 65 73 20 6b 20 76   keys values k v
8520: 20 64 69 63 74 76 0d 0a 2b 7d 20 2d 72 65 73 75   dictv..+} -resu
8530: 6c 74 20 59 45 53 0d 0a 2b 74 65 73 74 20 64 69  lt YES..+test di
8540: 63 74 2d 32 34 2e 39 20 7b 64 69 63 74 20 6d 61  ct-24.9 {dict ma
8550: 70 20 63 6f 6d 6d 61 6e 64 7d 20 7b 0d 0a 2b 20  p command} {..+ 
8560: 20 20 20 64 69 63 74 20 6d 61 70 20 7b 6b 20 76     dict map {k v
8570: 7d 20 7b 7d 20 7b 0d 0a 2b 09 65 72 72 6f 72 20  } {} {..+.error 
8580: 22 75 6e 65 78 70 65 63 74 65 64 20 65 78 65 63  "unexpected exec
8590: 75 74 69 6f 6e 20 6f 66 20 27 64 69 63 74 20 6d  ution of 'dict m
85a0: 61 70 27 20 62 6f 64 79 22 0d 0a 2b 20 20 20 20  ap' body"..+    
85b0: 7d 0d 0a 2b 7d 20 7b 7d 0d 0a 2b 74 65 73 74 20  }..+} {}..+test 
85c0: 64 69 63 74 2d 32 34 2e 31 30 20 7b 64 69 63 74  dict-24.10 {dict
85d0: 20 6d 61 70 20 63 6f 6d 6d 61 6e 64 3a 20 73 63   map command: sc
85e0: 72 69 70 74 20 72 65 73 75 6c 74 73 7d 20 2d 62  ript results} -b
85f0: 6f 64 79 20 7b 0d 0a 2b 20 20 20 20 73 65 74 20  ody {..+    set 
8600: 74 69 6d 65 73 20 30 0d 0a 2b 20 20 20 20 64 69  times 0..+    di
8610: 63 74 20 6d 61 70 20 7b 6b 20 76 7d 20 7b 61 20  ct map {k v} {a 
8620: 61 20 62 20 62 7d 20 7b 0d 0a 2b 09 69 6e 63 72  a b b} {..+.incr
8630: 20 74 69 6d 65 73 0d 0a 2b 09 63 6f 6e 74 69 6e   times..+.contin
8640: 75 65 0d 0a 2b 09 65 72 72 6f 72 20 22 73 68 6f  ue..+.error "sho
8650: 75 6c 64 6e 27 74 20 67 65 74 20 68 65 72 65 22  uldn't get here"
8660: 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 20 20 20 20 72  ..+    }..+    r
8670: 65 74 75 72 6e 20 24 74 69 6d 65 73 0d 0a 2b 7d  eturn $times..+}
8680: 20 2d 63 6c 65 61 6e 75 70 20 7b 0d 0a 2b 20 20   -cleanup {..+  
8690: 20 20 75 6e 73 65 74 20 74 69 6d 65 73 20 6b 20    unset times k 
86a0: 76 0d 0a 2b 7d 20 2d 72 65 73 75 6c 74 20 32 0d  v..+} -result 2.
86b0: 0a 2b 74 65 73 74 20 64 69 63 74 2d 32 34 2e 31  .+test dict-24.1
86c0: 31 20 7b 64 69 63 74 20 6d 61 70 20 63 6f 6d 6d  1 {dict map comm
86d0: 61 6e 64 3a 20 73 63 72 69 70 74 20 72 65 73 75  and: script resu
86e0: 6c 74 73 7d 20 2d 62 6f 64 79 20 7b 0d 0a 2b 20  lts} -body {..+ 
86f0: 20 20 20 73 65 74 20 74 69 6d 65 73 20 30 0d 0a     set times 0..
8700: 2b 20 20 20 20 64 69 63 74 20 6d 61 70 20 7b 6b  +    dict map {k
8710: 20 76 7d 20 7b 61 20 61 20 62 20 62 7d 20 7b 0d   v} {a a b b} {.
8720: 0a 2b 09 69 6e 63 72 20 74 69 6d 65 73 0d 0a 2b  .+.incr times..+
8730: 09 62 72 65 61 6b 0d 0a 2b 09 65 72 72 6f 72 20  .break..+.error 
8740: 22 73 68 6f 75 6c 64 6e 27 74 20 67 65 74 20 68  "shouldn't get h
8750: 65 72 65 22 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 20  ere"..+    }..+ 
8760: 20 20 20 72 65 74 75 72 6e 20 24 74 69 6d 65 73     return $times
8770: 0d 0a 2b 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0d  ..+} -cleanup {.
8780: 0a 2b 20 20 20 20 75 6e 73 65 74 20 74 69 6d 65  .+    unset time
8790: 73 20 6b 20 76 0d 0a 2b 7d 20 2d 72 65 73 75 6c  s k v..+} -resul
87a0: 74 20 31 0d 0a 2b 74 65 73 74 20 64 69 63 74 2d  t 1..+test dict-
87b0: 32 34 2e 31 32 20 7b 64 69 63 74 20 6d 61 70 20  24.12 {dict map 
87c0: 63 6f 6d 6d 61 6e 64 3a 20 73 63 72 69 70 74 20  command: script 
87d0: 72 65 73 75 6c 74 73 7d 20 2d 62 6f 64 79 20 7b  results} -body {
87e0: 0d 0a 2b 20 20 20 20 73 65 74 20 74 69 6d 65 73  ..+    set times
87f0: 20 30 0d 0a 2b 20 20 20 20 6c 69 73 74 20 5b 63   0..+    list [c
8800: 61 74 63 68 20 7b 0d 0a 2b 09 64 69 63 74 20 6d  atch {..+.dict m
8810: 61 70 20 7b 6b 20 76 7d 20 7b 61 20 61 20 62 20  ap {k v} {a a b 
8820: 62 7d 20 7b 0d 0a 2b 09 20 20 20 20 69 6e 63 72  b} {..+.    incr
8830: 20 74 69 6d 65 73 0d 0a 2b 09 20 20 20 20 65 72   times..+.    er
8840: 72 6f 72 20 74 65 73 74 0d 0a 2b 09 7d 0d 0a 2b  ror test..+.}..+
8850: 20 20 20 20 7d 20 6d 73 67 5d 20 24 6d 73 67 20      } msg] $msg 
8860: 24 74 69 6d 65 73 20 24 3a 3a 65 72 72 6f 72 49  $times $::errorI
8870: 6e 66 6f 0d 0a 2b 7d 20 2d 63 6c 65 61 6e 75 70  nfo..+} -cleanup
8880: 20 7b 0d 0a 2b 20 20 20 20 75 6e 73 65 74 20 74   {..+    unset t
8890: 69 6d 65 73 20 6b 20 76 20 6d 73 67 0d 0a 2b 7d  imes k v msg..+}
88a0: 20 2d 72 65 73 75 6c 74 20 7b 31 20 74 65 73 74   -result {1 test
88b0: 20 31 20 7b 74 65 73 74 0d 0a 2b 20 20 20 20 77   1 {test..+    w
88c0: 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0d 0a  hile executing..
88d0: 2b 22 65 72 72 6f 72 20 74 65 73 74 22 0d 0a 2b  +"error test"..+
88e0: 20 20 20 20 28 22 64 69 63 74 20 6d 61 70 22 20      ("dict map" 
88f0: 62 6f 64 79 20 6c 69 6e 65 20 33 29 0d 0a 2b 20  body line 3)..+ 
8900: 20 20 20 69 6e 76 6f 6b 65 64 20 66 72 6f 6d 20     invoked from 
8910: 77 69 74 68 69 6e 0d 0a 2b 22 64 69 63 74 20 6d  within..+"dict m
8920: 61 70 20 7b 6b 20 76 7d 20 7b 61 20 61 20 62 20  ap {k v} {a a b 
8930: 62 7d 20 7b 0d 0a 2b 09 20 20 20 20 69 6e 63 72  b} {..+.    incr
8940: 20 74 69 6d 65 73 0d 0a 2b 09 20 20 20 20 65 72   times..+.    er
8950: 72 6f 72 20 74 65 73 74 0d 0a 2b 09 7d 22 7d 7d  ror test..+.}"}}
8960: 0d 0a 2b 74 65 73 74 20 64 69 63 74 2d 32 34 2e  ..+test dict-24.
8970: 31 33 20 7b 64 69 63 74 20 6d 61 70 20 63 6f 6d  13 {dict map com
8980: 6d 61 6e 64 3a 20 73 63 72 69 70 74 20 72 65 73  mand: script res
8990: 75 6c 74 73 7d 20 7b 0d 0a 2b 20 20 20 20 61 70  ults} {..+    ap
89a0: 70 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b 09 64 69 63  ply {{} {..+.dic
89b0: 74 20 6d 61 70 20 7b 6b 20 76 7d 20 7b 61 20 62  t map {k v} {a b
89c0: 7d 20 7b 0d 0a 2b 09 20 20 20 20 72 65 74 75 72  } {..+.    retur
89d0: 6e 20 6f 6b 2c 24 6b 2c 24 76 0d 0a 2b 09 20 20  n ok,$k,$v..+.  
89e0: 20 20 65 72 72 6f 72 20 22 73 6b 69 70 70 65 64    error "skipped
89f0: 20 72 65 74 75 72 6e 20 63 6f 6d 70 6c 65 74 65   return complete
8a00: 6c 79 22 0d 0a 2b 09 7d 0d 0a 2b 09 65 72 72 6f  ly"..+.}..+.erro
8a10: 72 20 22 72 65 74 75 72 6e 20 64 69 64 6e 27 74  r "return didn't
8a20: 20 67 6f 20 66 61 72 20 65 6e 6f 75 67 68 22 0d   go far enough".
8a30: 0a 2b 20 20 20 20 7d 7d 0d 0a 2b 7d 20 6f 6b 2c  .+    }}..+} ok,
8a40: 61 2c 62 0d 0a 2b 74 65 73 74 20 64 69 63 74 2d  a,b..+test dict-
8a50: 32 34 2e 31 34 20 7b 64 69 63 74 20 6d 61 70 20  24.14 {dict map 
8a60: 63 6f 6d 6d 61 6e 64 3a 20 68 61 6e 64 6c 65 20  command: handle 
8a70: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6c  representation l
8a80: 6f 73 73 7d 20 2d 62 6f 64 79 20 7b 0d 0a 2b 20  oss} -body {..+ 
8a90: 20 20 20 73 65 74 20 64 69 63 74 56 61 72 20 7b     set dictVar {
8aa0: 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68 7d  a b c d e f g h}
8ab0: 0d 0a 2b 20 20 20 20 73 65 74 20 76 61 6c 75 65  ..+    set value
8ac0: 73 20 7b 7d 0d 0a 2b 20 20 20 20 73 65 74 20 6b  s {}..+    set k
8ad0: 65 79 73 20 5b 64 69 63 74 20 6d 61 70 20 7b 6b  eys [dict map {k
8ae0: 20 76 7d 20 24 64 69 63 74 56 61 72 20 7b 0d 0a   v} $dictVar {..
8af0: 2b 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  +.if {[llength $
8b00: 64 69 63 74 56 61 72 5d 7d 20 7b 0d 0a 2b 09 20  dictVar]} {..+. 
8b10: 20 20 20 6c 61 70 70 65 6e 64 20 76 61 6c 75 65     lappend value
8b20: 73 20 24 76 0d 0a 2b 09 20 20 20 20 72 65 74 75  s $v..+.    retu
8b30: 72 6e 20 2d 6c 65 76 65 6c 20 30 20 24 6b 0d 0a  rn -level 0 $k..
8b40: 2b 09 7d 0d 0a 2b 20 20 20 20 7d 5d 0d 0a 2b 20  +.}..+    }]..+ 
8b50: 20 20 20 6c 69 73 74 20 5b 6c 73 6f 72 74 20 24     list [lsort $
8b60: 6b 65 79 73 5d 20 5b 6c 73 6f 72 74 20 24 76 61  keys] [lsort $va
8b70: 6c 75 65 73 5d 0d 0a 2b 7d 20 2d 63 6c 65 61 6e  lues]..+} -clean
8b80: 75 70 20 7b 0d 0a 2b 20 20 20 20 75 6e 73 65 74  up {..+    unset
8b90: 20 64 69 63 74 56 61 72 20 6b 65 79 73 20 76 61   dictVar keys va
8ba0: 6c 75 65 73 20 6b 20 76 0d 0a 2b 7d 20 2d 72 65  lues k v..+} -re
8bb0: 73 75 6c 74 20 7b 7b 61 20 63 20 65 20 67 7d 20  sult {{a c e g} 
8bc0: 7b 62 20 64 20 66 20 68 7d 7d 0d 0a 2b 74 65 73  {b d f h}}..+tes
8bd0: 74 20 64 69 63 74 2d 32 34 2e 31 35 20 7b 64 69  t dict-24.15 {di
8be0: 63 74 20 6d 61 70 20 63 6f 6d 6d 61 6e 64 3a 20  ct map command: 
8bf0: 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20  keys are unique 
8c00: 61 6e 64 20 69 74 65 72 61 74 65 64 20 6f 76 65  and iterated ove
8c10: 72 20 6f 6e 63 65 20 6f 6e 6c 79 7d 20 2d 73 65  r once only} -se
8c20: 74 75 70 20 7b 0d 0a 2b 20 20 20 20 75 6e 73 65  tup {..+    unse
8c30: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 61 63  t -nocomplain ac
8c40: 63 75 6d 0d 0a 2b 20 20 20 20 61 72 72 61 79 20  cum..+    array 
8c50: 73 65 74 20 61 63 63 75 6d 20 7b 7d 0d 0a 2b 7d  set accum {}..+}
8c60: 20 2d 62 6f 64 79 20 7b 0d 0a 2b 20 20 20 20 73   -body {..+    s
8c70: 65 74 20 64 69 63 74 56 61 72 20 7b 61 31 20 61  et dictVar {a1 a
8c80: 20 61 32 20 62 20 62 31 20 63 20 62 32 20 64 20   a2 b b1 c b2 d 
8c90: 66 6f 6f 20 62 61 72 20 62 61 72 20 66 6f 6f 7d  foo bar bar foo}
8ca0: 0d 0a 2b 20 20 20 20 64 69 63 74 20 6d 61 70 20  ..+    dict map 
8cb0: 7b 6b 20 76 7d 20 24 64 69 63 74 56 61 72 20 7b  {k v} $dictVar {
8cc0: 0d 0a 2b 09 61 70 70 65 6e 64 20 61 63 63 75 6d  ..+.append accum
8cd0: 28 24 6b 29 20 24 76 2c 0d 0a 2b 20 20 20 20 7d  ($k) $v,..+    }
8ce0: 0d 0a 2b 20 20 20 20 73 65 74 20 72 65 73 75 6c  ..+    set resul
8cf0: 74 20 5b 6c 73 6f 72 74 20 5b 61 72 72 61 79 20  t [lsort [array 
8d00: 6e 61 6d 65 73 20 61 63 63 75 6d 5d 5d 0d 0a 2b  names accum]]..+
8d10: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
8d20: 6c 74 20 3a 0d 0a 2b 20 20 20 20 66 6f 72 65 61  lt :..+    forea
8d30: 63 68 20 6b 20 24 72 65 73 75 6c 74 20 7b 0d 0a  ch k $result {..
8d40: 2b 09 63 61 74 63 68 20 7b 6c 61 70 70 65 6e 64  +.catch {lappend
8d50: 20 72 65 73 75 6c 74 20 24 61 63 63 75 6d 28 24   result $accum($
8d60: 6b 29 7d 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 20 20  k)}..+    }..+  
8d70: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
8d80: 0d 0a 2b 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0d  ..+} -cleanup {.
8d90: 0a 2b 20 20 20 20 75 6e 73 65 74 20 64 69 63 74  .+    unset dict
8da0: 56 61 72 20 6b 20 76 20 72 65 73 75 6c 74 20 61  Var k v result a
8db0: 63 63 75 6d 0d 0a 2b 7d 20 2d 72 65 73 75 6c 74  ccum..+} -result
8dc0: 20 7b 61 31 20 61 32 20 62 31 20 62 32 20 62 61   {a1 a2 b1 b2 ba
8dd0: 72 20 66 6f 6f 20 3a 20 61 2c 20 62 2c 20 63 2c  r foo : a, b, c,
8de0: 20 64 2c 20 66 6f 6f 2c 20 62 61 72 2c 7d 0d 0a   d, foo, bar,}..
8df0: 2b 74 65 73 74 20 64 69 63 74 2d 32 34 2e 31 36  +test dict-24.16
8e00: 20 7b 64 69 63 74 20 6d 61 70 20 63 6f 6d 6d 61   {dict map comma
8e10: 6e 64 20 69 6e 20 63 6f 6d 70 69 6c 61 74 69 6f  nd in compilatio
8e20: 6e 20 63 6f 6e 74 65 78 74 7d 20 7b 0d 0a 2b 20  n context} {..+ 
8e30: 20 20 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 0d 0a     apply {{} {..
8e40: 2b 09 73 65 74 20 72 65 73 20 7b 78 20 78 20 78  +.set res {x x x
8e50: 20 78 20 78 20 78 7d 0d 0a 2b 09 64 69 63 74 20   x x x}..+.dict 
8e60: 6d 61 70 20 7b 6b 20 76 7d 20 7b 61 20 30 20 62  map {k v} {a 0 b
8e70: 20 31 20 63 20 32 20 64 20 33 20 65 20 34 20 66   1 c 2 d 3 e 4 f
8e80: 20 35 7d 20 7b 0d 0a 2b 09 20 20 20 20 6c 73 65   5} {..+.    lse
8e90: 74 20 72 65 73 20 24 76 20 24 6b 0d 0a 2b 09 20  t res $v $k..+. 
8ea0: 20 20 20 63 6f 6e 74 69 6e 75 65 0d 0a 2b 09 7d     continue..+.}
8eb0: 0d 0a 2b 09 72 65 74 75 72 6e 20 24 72 65 73 0d  ..+.return $res.
8ec0: 0a 2b 20 20 20 20 7d 7d 0d 0a 2b 7d 20 7b 61 20  .+    }}..+} {a 
8ed0: 62 20 63 20 64 20 65 20 66 7d 0d 0a 2b 74 65 73  b c d e f}..+tes
8ee0: 74 20 64 69 63 74 2d 32 34 2e 31 37 20 7b 64 69  t dict-24.17 {di
8ef0: 63 74 20 6d 61 70 20 63 6f 6d 6d 61 6e 64 20 69  ct map command i
8f00: 6e 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 63 6f  n compilation co
8f10: 6e 74 65 78 74 7d 20 7b 0d 0a 2b 20 20 20 20 23  ntext} {..+    #
8f20: 20 42 75 67 20 31 33 37 39 33 34 39 20 28 64 69   Bug 1379349 (di
8f30: 63 74 20 66 6f 72 29 0d 0a 2b 20 20 20 20 61 70  ct for)..+    ap
8f40: 70 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b 09 73 65 74  ply {{} {..+.set
8f50: 20 64 20 5b 64 69 63 74 20 63 72 65 61 74 65 20   d [dict create 
8f60: 61 20 31 5d 09 09 3b 23 20 44 69 63 74 20 6d 75  a 1]..;# Dict mu
8f70: 73 74 20 62 65 20 75 6e 73 68 61 72 65 64 21 0d  st be unshared!.
8f80: 0a 2b 09 64 69 63 74 20 6d 61 70 20 7b 6b 20 76  .+.dict map {k v
8f90: 7d 20 24 64 20 7b 0d 0a 2b 09 20 20 20 20 64 69  } $d {..+.    di
8fa0: 63 74 20 73 65 74 20 64 20 24 6b 20 30 09 09 3b  ct set d $k 0..;
8fb0: 23 20 41 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  # Any modificati
8fc0: 6f 6e 20 77 69 6c 6c 20 64 6f 0d 0a 2b 09 7d 0d  on will do..+.}.
8fd0: 0a 2b 09 72 65 74 75 72 6e 20 24 64 0d 0a 2b 20  .+.return $d..+ 
8fe0: 20 20 20 7d 7d 0d 0a 2b 7d 20 7b 61 20 30 7d 0d     }}..+} {a 0}.
8ff0: 0a 2b 74 65 73 74 20 64 69 63 74 2d 32 34 2e 31  .+test dict-24.1
9000: 37 61 20 7b 64 69 63 74 20 6d 61 70 20 63 6f 6d  7a {dict map com
9010: 6d 61 6e 64 20 69 6e 20 63 6f 6d 70 69 6c 61 74  mand in compilat
9020: 69 6f 6e 20 63 6f 6e 74 65 78 74 7d 20 7b 0d 0a  ion context} {..
9030: 2b 20 20 20 20 23 20 42 75 67 20 31 33 37 39 33  +    # Bug 13793
9040: 34 39 20 28 64 69 63 74 20 66 6f 72 29 0d 0a 2b  49 (dict for)..+
9050: 20 20 20 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 0d      apply {{} {.
9060: 0a 2b 09 73 65 74 20 64 20 5b 64 69 63 74 20 63  .+.set d [dict c
9070: 72 65 61 74 65 20 61 20 31 5d 09 09 3b 23 20 44  reate a 1]..;# D
9080: 69 63 74 20 6d 75 73 74 20 62 65 20 75 6e 73 68  ict must be unsh
9090: 61 72 65 64 21 0d 0a 2b 09 64 69 63 74 20 6d 61  ared!..+.dict ma
90a0: 70 20 7b 6b 20 76 7d 20 24 64 20 7b 0d 0a 2b 09  p {k v} $d {..+.
90b0: 20 20 20 20 64 69 63 74 20 73 65 74 20 64 20 24      dict set d $
90c0: 6b 20 30 09 09 3b 23 20 41 6e 79 20 6d 6f 64 69  k 0..;# Any modi
90d0: 66 69 63 61 74 69 6f 6e 20 77 69 6c 6c 20 64 6f  fication will do
90e0: 0d 0a 2b 09 7d 0d 0a 2b 20 20 20 20 7d 7d 0d 0a  ..+.}..+    }}..
90f0: 2b 7d 20 7b 7b 61 20 30 7d 7d 0d 0a 2b 74 65 73  +} {{a 0}}..+tes
9100: 74 20 64 69 63 74 2d 32 34 2e 31 38 20 7b 64 69  t dict-24.18 {di
9110: 63 74 20 6d 61 70 20 63 6f 6d 6d 61 6e 64 20 69  ct map command i
9120: 6e 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 63 6f  n compilation co
9130: 6e 74 65 78 74 7d 20 7b 0d 0a 2b 20 20 20 20 23  ntext} {..+    #
9140: 20 42 75 67 20 31 33 38 32 35 32 38 20 28 64 69   Bug 1382528 (di
9150: 63 74 20 66 6f 72 29 0d 0a 2b 20 20 20 20 61 70  ct for)..+    ap
9160: 70 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b 09 64 69 63  ply {{} {..+.dic
9170: 74 20 6d 61 70 20 7b 6b 20 76 7d 20 7b 7d 20 7b  t map {k v} {} {
9180: 7d 09 09 3b 23 20 4e 6f 74 65 20 65 6d 70 74 79  }..;# Note empty
9190: 20 64 69 63 74 0d 0a 2b 09 63 61 74 63 68 20 7b   dict..+.catch {
91a0: 20 65 72 72 6f 72 20 66 6f 6f 20 7d 09 09 3b 23   error foo }..;#
91b0: 20 4e 6f 74 65 20 63 6f 6d 70 69 6c 65 64 20 5b   Note compiled [
91c0: 63 61 74 63 68 5d 0d 0a 2b 20 20 20 20 7d 7d 0d  catch]..+    }}.
91d0: 0a 2b 7d 20 31 0d 0a 2b 74 65 73 74 20 64 69 63  .+} 1..+test dic
91e0: 74 2d 32 34 2e 31 39 20 7b 64 69 63 74 20 6d 61  t-24.19 {dict ma
91f0: 70 20 61 6e 64 20 69 6e 76 61 6c 69 64 20 64 69  p and invalid di
9200: 63 74 73 3a 20 27 64 69 63 74 20 66 6f 72 27 20  cts: 'dict for' 
9210: 62 75 67 20 31 35 33 31 31 38 34 7d 20 2d 62 6f  bug 1531184} -bo
9220: 64 79 20 7b 0d 0a 2b 20 20 20 20 64 69 5b 6c 69  dy {..+    di[li
9230: 73 74 5d 63 74 20 6d 61 70 20 7b 6b 20 76 7d 20  st]ct map {k v} 
9240: 78 20 7b 7d 0d 0a 2b 7d 20 2d 72 65 74 75 72 6e  x {}..+} -return
9250: 43 6f 64 65 73 20 31 20 2d 72 65 73 75 6c 74 20  Codes 1 -result 
9260: 7b 6d 69 73 73 69 6e 67 20 76 61 6c 75 65 20 74  {missing value t
9270: 6f 20 67 6f 20 77 69 74 68 20 6b 65 79 7d 0d 0a  o go with key}..
9280: 2b 74 65 73 74 20 64 69 63 74 2d 32 34 2e 32 30  +test dict-24.20
9290: 20 7b 64 69 63 74 20 6d 61 70 20 73 74 61 63 6b   {dict map stack
92a0: 20 73 70 61 63 65 20 63 6f 6d 70 69 6c 61 74 69   space compilati
92b0: 6f 6e 3a 20 27 64 69 63 74 20 66 6f 72 27 20 62  on: 'dict for' b
92c0: 75 67 20 31 39 30 33 33 32 35 7d 20 7b 0d 0a 2b  ug 1903325} {..+
92d0: 20 20 20 20 61 70 70 6c 79 20 7b 7b 78 20 79 20      apply {{x y 
92e0: 61 72 67 73 7d 20 7b 0d 0a 2b 09 64 69 63 74 20  args} {..+.dict 
92f0: 6d 61 70 20 7b 61 20 62 7d 20 24 78 20 7b 7d 0d  map {a b} $x {}.
9300: 0a 2b 09 63 6f 6e 63 61 74 20 22 63 3d 24 79 2c  .+.concat "c=$y,
9310: 24 61 72 67 73 22 0d 0a 2b 20 20 20 20 7d 7d 20  $args"..+    }} 
9320: 7b 7d 20 31 20 32 20 33 0d 0a 2b 7d 20 7b 63 3d  {} 1 2 3..+} {c=
9330: 31 2c 32 20 33 7d 0d 0a 2b 70 72 6f 63 20 6c 69  1,2 3}..+proc li
9340: 6e 65 6e 75 6d 62 65 72 20 7b 7d 20 7b 0d 0a 2b  nenumber {} {..+
9350: 20 20 20 20 64 69 63 74 20 67 65 74 20 5b 69 6e      dict get [in
9360: 66 6f 20 66 72 61 6d 65 20 2d 31 5d 20 6c 69 6e  fo frame -1] lin
9370: 65 0d 0a 2b 7d 0d 0a 2b 74 65 73 74 20 64 69 63  e..+}..+test dic
9380: 74 2d 32 34 2e 32 30 20 7b 64 69 63 74 20 63 6f  t-24.20 {dict co
9390: 6d 70 69 6c 61 74 69 6f 6e 20 63 72 61 73 68 3a  mpilation crash:
93a0: 20 27 64 69 63 74 20 66 6f 72 27 20 62 75 67 20   'dict for' bug 
93b0: 33 34 38 37 36 32 36 7d 20 7b 0d 0a 2b 20 20 20  3487626} {..+   
93c0: 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 61 70 70 6c   apply {{} {appl
93d0: 79 20 7b 6e 20 7b 0d 0a 2b 09 73 65 74 20 65 20  y {n {..+.set e 
93e0: 7b 7d 0d 0a 2b 09 73 65 74 20 6b 20 7b 7d 0d 0a  {}..+.set k {}..
93f0: 2b 09 64 69 63 74 20 6d 61 70 20 7b 61 20 62 7d  +.dict map {a b}
9400: 20 7b 63 20 7b 64 20 7b 65 20 7b 66 20 67 7d 7d   {c {d {e {f g}}
9410: 7d 7d 20 7b 0d 0a 2b 09 20 20 20 20 3a 3a 74 63  }} {..+.    ::tc
9420: 6c 3a 3a 64 69 63 74 3a 3a 6d 61 70 20 7b 68 20  l::dict::map {h 
9430: 69 7d 20 24 62 20 7b 0d 0a 2b 09 09 64 69 63 74  i} $b {..+..dict
9440: 20 75 70 64 61 74 65 20 69 20 65 20 6a 20 7b 0d   update i e j {.
9450: 0a 2b 09 09 20 20 20 20 3a 3a 74 63 6c 3a 3a 64  .+..    ::tcl::d
9460: 69 63 74 3a 3a 75 70 64 61 74 65 20 6a 20 66 20  ict::update j f 
9470: 6b 20 7b 0d 0a 2b 09 09 09 72 65 74 75 72 6e 20  k {..+...return 
9480: 5b 65 78 70 72 20 7b 24 6e 20 2d 20 5b 6c 69 6e  [expr {$n - [lin
9490: 65 6e 75 6d 62 65 72 5d 7d 5d 0d 0a 2b 09 09 20  enumber]}]..+.. 
94a0: 20 20 20 7d 0d 0a 2b 09 09 7d 0d 0a 2b 09 20 20     }..+..}..+.  
94b0: 20 20 7d 0d 0a 2b 09 7d 0d 0a 2b 20 20 20 20 7d    }..+.}..+    }
94c0: 7d 20 5b 6c 69 6e 65 6e 75 6d 62 65 72 5d 7d 7d  } [linenumber]}}
94d0: 0d 0a 2b 7d 20 35 0d 0a 2b 74 65 73 74 20 64 69  ..+} 5..+test di
94e0: 63 74 2d 32 34 2e 32 31 20 7b 64 69 63 74 20 63  ct-24.21 {dict c
94f0: 6f 6d 70 69 6c 61 74 69 6f 6e 20 63 72 61 73 68  ompilation crash
9500: 3a 20 27 64 69 63 74 20 66 6f 72 27 20 62 75 67  : 'dict for' bug
9510: 20 33 34 38 37 36 32 36 7d 20 6b 6e 6f 77 6e 42   3487626} knownB
9520: 75 67 20 7b 0d 0a 2b 20 20 20 20 61 70 70 6c 79  ug {..+    apply
9530: 20 7b 7b 7d 20 7b 61 70 70 6c 79 20 7b 6e 20 7b   {{} {apply {n {
9540: 0d 0a 2b 09 73 65 74 20 65 20 7b 7d 0d 0a 2b 09  ..+.set e {}..+.
9550: 73 65 74 20 6b 20 7b 7d 0d 0a 2b 09 64 69 63 74  set k {}..+.dict
9560: 20 6d 61 70 20 7b 61 20 7b 0d 0a 2b 62 0d 0a 2b   map {a {..+b..+
9570: 7d 7d 20 7b 63 20 7b 64 20 7b 65 20 7b 66 20 67  }} {c {d {e {f g
9580: 7d 7d 7d 7d 20 7b 0d 0a 2b 09 20 20 20 20 3a 3a  }}}} {..+.    ::
9590: 74 63 6c 3a 3a 64 69 63 74 3a 3a 6d 61 70 20 7b  tcl::dict::map {
95a0: 68 20 7b 0d 0a 2b 69 0d 0a 2b 7d 7d 20 24 7b 0d  h {..+i..+}} ${.
95b0: 0a 2b 62 0d 0a 2b 7d 20 7b 0d 0a 2b 09 09 64 69  .+b..+} {..+..di
95c0: 63 74 20 75 70 64 61 74 65 20 7b 0d 0a 2b 69 0d  ct update {..+i.
95d0: 0a 2b 7d 20 65 20 7b 0d 0a 2b 6a 0d 0a 2b 7d 20  .+} e {..+j..+} 
95e0: 7b 0d 0a 2b 09 09 20 20 20 20 3a 3a 74 63 6c 3a  {..+..    ::tcl:
95f0: 3a 64 69 63 74 3a 3a 75 70 64 61 74 65 20 7b 0d  :dict::update {.
9600: 0a 2b 6a 0d 0a 2b 7d 20 66 20 6b 20 7b 0d 0a 2b  .+j..+} f k {..+
9610: 09 09 09 72 65 74 75 72 6e 20 5b 65 78 70 72 20  ...return [expr 
9620: 7b 24 6e 20 2d 20 5b 6c 69 6e 65 6e 75 6d 62 65  {$n - [linenumbe
9630: 72 5d 7d 5d 0d 0a 2b 09 09 20 20 20 20 7d 0d 0a  r]}]..+..    }..
9640: 2b 09 09 7d 0d 0a 2b 09 20 20 20 20 7d 0d 0a 2b  +..}..+.    }..+
9650: 09 7d 0d 0a 2b 20 20 20 20 7d 7d 20 5b 6c 69 6e  .}..+    }} [lin
9660: 65 6e 75 6d 62 65 72 5d 7d 7d 0d 0a 2b 7d 20 35  enumber]}}..+} 5
9670: 0d 0a 2b 72 65 6e 61 6d 65 20 6c 69 6e 65 6e 75  ..+rename linenu
9680: 6d 62 65 72 20 7b 7d 0d 0a 2b 74 65 73 74 20 64  mber {}..+test d
9690: 69 63 74 2d 32 34 2e 32 32 20 7b 64 69 63 74 20  ict-24.22 {dict 
96a0: 6d 61 70 20 72 65 73 75 6c 74 73 20 28 6e 6f 6e  map results (non
96b0: 2d 63 6f 6d 70 69 6c 65 64 29 7d 20 7b 0d 0a 2b  -compiled)} {..+
96c0: 20 20 20 20 64 69 63 74 20 6d 61 70 20 7b 6b 20      dict map {k 
96d0: 76 7d 20 5b 64 69 63 74 20 6d 61 70 20 7b 6b 20  v} [dict map {k 
96e0: 76 7d 20 7b 61 20 31 20 62 20 32 20 63 20 33 20  v} {a 1 b 2 c 3 
96f0: 64 20 34 7d 20 7b 20 6c 69 73 74 20 24 76 20 24  d 4} { list $v $
9700: 6b 20 7d 5d 20 7b 0d 0a 2b 09 72 65 74 75 72 6e  k }] {..+.return
9710: 20 2d 6c 65 76 65 6c 20 30 20 22 24 6b 2c 24 76   -level 0 "$k,$v
9720: 22 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 7d 20 7b 7b  "..+    }..+} {{
9730: 31 20 61 2c 32 20 62 7d 20 7b 33 20 63 2c 34 20  1 a,2 b} {3 c,4 
9740: 64 7d 7d 0d 0a 2b 74 65 73 74 20 64 69 63 74 2d  d}}..+test dict-
9750: 32 34 2e 32 33 20 7b 64 69 63 74 20 6d 61 70 20  24.23 {dict map 
9760: 72 65 73 75 6c 74 73 20 28 63 6f 6d 70 69 6c 65  results (compile
9770: 64 29 7d 20 7b 0d 0a 2b 20 20 20 20 61 70 70 6c  d)} {..+    appl
9780: 79 20 7b 7b 7d 20 7b 0d 0a 2b 09 64 69 63 74 20  y {{} {..+.dict 
9790: 6d 61 70 20 7b 6b 20 76 7d 20 5b 64 69 63 74 20  map {k v} [dict 
97a0: 6d 61 70 20 7b 6b 20 76 7d 20 7b 61 20 31 20 62  map {k v} {a 1 b
97b0: 20 32 20 63 20 33 20 64 20 34 7d 20 7b 20 6c 69   2 c 3 d 4} { li
97c0: 73 74 20 24 76 20 24 6b 20 7d 5d 20 7b 0d 0a 2b  st $v $k }] {..+
97d0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 6c 65 76  .    return -lev
97e0: 65 6c 20 30 20 22 24 6b 2c 24 76 22 0d 0a 2b 09  el 0 "$k,$v"..+.
97f0: 7d 0d 0a 2b 20 20 20 20 7d 7d 0d 0a 2b 7d 20 7b  }..+    }}..+} {
9800: 7b 31 20 61 2c 32 20 62 7d 20 7b 33 20 63 2c 34  {1 a,2 b} {3 c,4
9810: 20 64 7d 7d 0d 0a 2b 74 65 73 74 20 64 69 63 74   d}}..+test dict
9820: 2d 32 34 2e 32 33 61 20 7b 64 69 63 74 20 6d 61  -24.23a {dict ma
9830: 70 20 72 65 73 75 6c 74 73 20 28 63 6f 6d 70 69  p results (compi
9840: 6c 65 64 29 7d 20 7b 0d 0a 2b 20 20 20 20 61 70  led)} {..+    ap
9850: 70 6c 79 20 7b 7b 6c 69 73 74 7d 20 7b 0d 0a 2b  ply {{list} {..+
9860: 09 64 69 63 74 20 6d 61 70 20 7b 6b 20 76 7d 20  .dict map {k v} 
9870: 5b 64 69 63 74 20 6d 61 70 20 7b 6b 20 76 7d 20  [dict map {k v} 
9880: 24 6c 69 73 74 20 7b 20 6c 69 73 74 20 24 76 20  $list { list $v 
9890: 24 6b 20 7d 5d 20 7b 0d 0a 2b 09 20 20 20 20 72  $k }] {..+.    r
98a0: 65 74 75 72 6e 20 2d 6c 65 76 65 6c 20 30 20 22  eturn -level 0 "
98b0: 24 6b 2c 24 76 22 0d 0a 2b 09 7d 0d 0a 2b 20 20  $k,$v"..+.}..+  
98c0: 20 20 7d 7d 20 7b 61 20 31 20 62 20 32 20 63 20    }} {a 1 b 2 c 
98d0: 33 20 64 20 34 7d 0d 0a 2b 7d 20 7b 7b 31 20 61  3 d 4}..+} {{1 a
98e0: 2c 32 20 62 7d 20 7b 33 20 63 2c 34 20 64 7d 7d  ,2 b} {3 c,4 d}}
98f0: 0d 0a 2b 74 65 73 74 20 64 69 63 74 2d 32 34 2e  ..+test dict-24.
9900: 32 34 20 7b 64 69 63 74 20 6d 61 70 20 77 69 74  24 {dict map wit
9910: 68 20 68 75 67 65 20 64 69 63 74 20 28 6e 6f 6e  h huge dict (non
9920: 2d 63 6f 6d 70 69 6c 65 64 29 7d 20 7b 0d 0a 2b  -compiled)} {..+
9930: 20 20 20 20 74 63 6c 3a 3a 6d 61 74 68 6f 70 3a      tcl::mathop:
9940: 3a 2b 20 7b 2a 7d 5b 64 69 63 74 20 6d 61 70 20  :+ {*}[dict map 
9950: 7b 6b 20 76 7d 20 5b 6c 73 65 61 72 63 68 20 2d  {k v} [lsearch -
9960: 61 6c 6c 20 5b 6c 72 65 70 65 61 74 20 31 30 30  all [lrepeat 100
9970: 30 30 30 30 20 78 5d 20 78 5d 20 7b 0d 0a 2b 09  0000 x] x] {..+.
9980: 65 78 70 72 20 7b 20 24 6b 20 2a 20 24 76 20 7d  expr { $k * $v }
9990: 0d 0a 2b 20 20 20 20 7d 5d 0d 0a 2b 7d 20 31 36  ..+    }]..+} 16
99a0: 36 36 36 36 34 31 36 36 36 36 35 30 30 30 30 30  6666416666500000
99b0: 0d 0a 2b 74 65 73 74 20 64 69 63 74 2d 32 34 2e  ..+test dict-24.
99c0: 32 35 20 7b 64 69 63 74 20 6d 61 70 20 77 69 74  25 {dict map wit
99d0: 68 20 68 75 67 65 20 64 69 63 74 20 28 63 6f 6d  h huge dict (com
99e0: 70 69 6c 65 64 29 7d 20 7b 0d 0a 2b 20 20 20 20  piled)} {..+    
99f0: 61 70 70 6c 79 20 7b 7b 6e 7d 20 7b 0d 0a 2b 09  apply {{n} {..+.
9a00: 74 63 6c 3a 3a 6d 61 74 68 6f 70 3a 3a 2b 20 7b  tcl::mathop::+ {
9a10: 2a 7d 5b 64 69 63 74 20 6d 61 70 20 7b 6b 20 76  *}[dict map {k v
9a20: 7d 20 5b 6c 73 65 61 72 63 68 20 2d 61 6c 6c 20  } [lsearch -all 
9a30: 5b 6c 72 65 70 65 61 74 20 24 6e 20 79 5d 20 79  [lrepeat $n y] y
9a40: 5d 20 7b 0d 0a 2b 09 20 20 20 20 65 78 70 72 20  ] {..+.    expr 
9a50: 7b 20 24 6b 20 2a 20 24 76 20 7d 0d 0a 2b 09 7d  { $k * $v }..+.}
9a60: 5d 0d 0a 2b 20 20 20 20 7d 7d 20 31 30 30 30 30  ]..+    }} 10000
9a70: 30 30 0d 0a 2b 7d 20 31 36 36 36 36 36 34 31 36  00..+} 166666416
9a80: 36 36 36 35 30 30 30 30 30 0d 0a 2b 0d 0a 20 0c  666500000..+.. .
9a90: 0d 0a 20 23 20 63 6c 65 61 6e 75 70 0d 0a 20 3a  .. # cleanup.. :
9aa0: 3a 74 63 6c 74 65 73 74 3a 3a 63 6c 65 61 6e 75  :tcltest::cleanu
9ab0: 70 54 65 73 74 73 0d 0a 20 72 65 74 75 72 6e 0d  pTests.. return.
9ac0: 0a 20 0d 0a 20 23 20 4c 6f 63 61 6c 20 56 61 72  . .. # Local Var
9ad0: 69 61 62 6c 65 73 3a 0d 0a 20 23 20 6d 6f 64 65  iables:.. # mode
9ae0: 3a 20 74 63 6c 0d 0a 20 23 20 45 6e 64 3a 0d 0a  : tcl.. # End:..
9af0: 0d 0a 41 44 44 45 44 5f 42 59 5f 4d 45 52 47 45  ..ADDED_BY_MERGE
9b00: 20 74 65 73 74 73 2f 6d 61 70 65 61 63 68 2e 74   tests/mapeach.t
9b10: 65 73 74 0d 0a 49 6e 64 65 78 3a 20 74 65 73 74  est..Index: test
9b20: 73 2f 6d 61 70 65 61 63 68 2e 74 65 73 74 0d 0a  s/mapeach.test..
9b30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9b40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9b50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9b60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9b70: 3d 3d 0d 0a 2d 2d 2d 20 74 65 73 74 73 2f 6d 61  ==..--- tests/ma
9b80: 70 65 61 63 68 2e 74 65 73 74 0d 0a 2b 2b 2b 20  peach.test..+++ 
9b90: 74 65 73 74 73 2f 6d 61 70 65 61 63 68 2e 74 65  tests/mapeach.te
9ba0: 73 74 0d 0a 40 40 20 2d 30 2c 30 20 2b 31 2c 34  st..@@ -0,0 +1,4
9bb0: 38 35 20 40 40 0d 0a 2b 23 20 43 6f 6d 6d 61 6e  85 @@..+# Comman
9bc0: 64 73 20 63 6f 76 65 72 65 64 3a 20 20 6d 61 70  ds covered:  map
9bd0: 65 61 63 68 2c 20 63 6f 6e 74 69 6e 75 65 2c 20  each, continue, 
9be0: 62 72 65 61 6b 0d 0a 2b 23 0d 0a 2b 23 20 54 68  break..+#..+# Th
9bf0: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
9c00: 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66   a collection of
9c10: 20 74 65 73 74 73 20 66 6f 72 20 6f 6e 65 20 6f   tests for one o
9c20: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 54 63  r more of the Tc
9c30: 6c 0d 0a 2b 23 20 62 75 69 6c 74 2d 69 6e 20 63  l..+# built-in c
9c40: 6f 6d 6d 61 6e 64 73 2e 20 20 53 6f 75 72 63 69  ommands.  Sourci
9c50: 6e 67 20 74 68 69 73 20 66 69 6c 65 20 69 6e 74  ng this file int
9c60: 6f 20 54 63 6c 20 72 75 6e 73 20 74 68 65 20 74  o Tcl runs the t
9c70: 65 73 74 73 20 61 6e 64 0d 0a 2b 23 20 67 65 6e  ests and..+# gen
9c80: 65 72 61 74 65 73 20 6f 75 74 70 75 74 20 66 6f  erates output fo
9c90: 72 20 65 72 72 6f 72 73 2e 20 20 4e 6f 20 6f 75  r errors.  No ou
9ca0: 74 70 75 74 20 6d 65 61 6e 73 20 6e 6f 20 65 72  tput means no er
9cb0: 72 6f 72 73 20 77 65 72 65 20 66 6f 75 6e 64 2e  rors were found.
9cc0: 0d 0a 2b 23 0d 0a 2b 23 20 43 6f 70 79 72 69 67  ..+#..+# Copyrig
9cd0: 68 74 20 28 63 29 20 31 39 39 31 2d 31 39 39 33  ht (c) 1991-1993
9ce0: 20 54 68 65 20 52 65 67 65 6e 74 73 20 6f 66 20   The Regents of 
9cf0: 74 68 65 20 55 6e 69 76 65 72 73 69 74 79 20 6f  the University o
9d00: 66 20 43 61 6c 69 66 6f 72 6e 69 61 2e 0d 0a 2b  f California...+
9d10: 23 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20  # Copyright (c) 
9d20: 31 39 39 34 2d 31 39 39 37 20 53 75 6e 20 4d 69  1994-1997 Sun Mi
9d30: 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e 63 2e  crosystems, Inc.
9d40: 0d 0a 2b 23 20 43 6f 70 79 72 69 67 68 74 20 28  ..+# Copyright (
9d50: 63 29 20 32 30 31 31 20 54 72 65 76 6f 72 20 44  c) 2011 Trevor D
9d60: 61 76 65 6c 0d 0a 2b 23 0d 0a 2b 23 20 53 65 65  avel..+#..+# See
9d70: 20 74 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e   the file "licen
9d80: 73 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e  se.terms" for in
9d90: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61  formation on usa
9da0: 67 65 20 61 6e 64 20 72 65 64 69 73 74 72 69 62  ge and redistrib
9db0: 75 74 69 6f 6e 0d 0a 2b 23 20 6f 66 20 74 68 69  ution..+# of thi
9dc0: 73 20 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20  s file, and for 
9dd0: 61 20 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20  a DISCLAIMER OF 
9de0: 41 4c 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0d  ALL WARRANTIES..
9df0: 0a 2b 23 0d 0a 2b 23 20 52 43 53 3a 20 40 28 23  .+#..+# RCS: @(#
9e00: 29 20 24 49 64 3a 20 24 0d 0a 2b 0d 0a 2b 69 66  ) $Id: $..+..+if
9e10: 20 7b 5b 6c 73 65 61 72 63 68 20 5b 6e 61 6d 65   {[lsearch [name
9e20: 73 70 61 63 65 20 63 68 69 6c 64 72 65 6e 5d 20  space children] 
9e30: 3a 3a 74 63 6c 74 65 73 74 5d 20 3d 3d 20 2d 31  ::tcltest] == -1
9e40: 7d 20 7b 0d 0a 2b 20 20 20 20 70 61 63 6b 61 67  } {..+    packag
9e50: 65 20 72 65 71 75 69 72 65 20 74 63 6c 74 65 73  e require tcltes
9e60: 74 0d 0a 2b 20 20 20 20 6e 61 6d 65 73 70 61 63  t..+    namespac
9e70: 65 20 69 6d 70 6f 72 74 20 2d 66 6f 72 63 65 20  e import -force 
9e80: 3a 3a 74 63 6c 74 65 73 74 3a 3a 2a 0d 0a 2b 7d  ::tcltest::*..+}
9e90: 0d 0a 2b 0d 0a 2b 63 61 74 63 68 20 7b 75 6e 73  ..+..+catch {uns
9ea0: 65 74 20 61 7d 0d 0a 2b 63 61 74 63 68 20 7b 75  et a}..+catch {u
9eb0: 6e 73 65 74 20 69 7d 0d 0a 2b 63 61 74 63 68 20  nset i}..+catch 
9ec0: 7b 75 6e 73 65 74 20 78 7d 0d 0a 2b 0d 0a 2b 23  {unset x}..+..+#
9ed0: 20 2d 2d 2d 2d 2d 20 4e 6f 6e 2d 63 6f 6d 70 69   ----- Non-compi
9ee0: 6c 65 64 20 6f 70 65 72 61 74 69 6f 6e 20 2d 2d  led operation --
9ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d  ---------------.
9f20: 0a 2b 0d 0a 2b 0d 0a 2b 23 20 42 61 73 69 63 20  .+..+..+# Basic 
9f30: 22 6d 61 70 65 61 63 68 22 20 6f 70 65 72 61 74  "mapeach" operat
9f40: 69 6f 6e 20 28 6e 6f 6e 2d 63 6f 6d 70 69 6c 65  ion (non-compile
9f50: 64 29 0d 0a 2b 0d 0a 2b 74 65 73 74 20 6d 61 70  d)..+..+test map
9f60: 65 61 63 68 2d 31 2e 31 20 7b 62 61 73 69 63 20  each-1.1 {basic 
9f70: 6d 61 70 65 61 63 68 20 74 65 73 74 73 7d 20 7b  mapeach tests} {
9f80: 0d 0a 2b 20 20 20 20 73 65 74 20 61 20 7b 7d 0d  ..+    set a {}.
9f90: 0a 2b 20 20 20 20 6d 61 70 65 61 63 68 20 69 20  .+    mapeach i 
9fa0: 7b 61 20 62 20 63 20 64 7d 20 7b 0d 0a 2b 09 73  {a b c d} {..+.s
9fb0: 65 74 20 61 20 5b 63 6f 6e 63 61 74 20 24 61 20  et a [concat $a 
9fc0: 24 69 5d 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 7d 20  $i]..+    }..+} 
9fd0: 7b 61 20 7b 61 20 62 7d 20 7b 61 20 62 20 63 7d  {a {a b} {a b c}
9fe0: 20 7b 61 20 62 20 63 20 64 7d 7d 0d 0a 2b 74 65   {a b c d}}..+te
9ff0: 73 74 20 6d 61 70 65 61 63 68 2d 31 2e 32 20 7b  st mapeach-1.2 {
a000: 62 61 73 69 63 20 6d 61 70 65 61 63 68 20 74 65  basic mapeach te
a010: 73 74 73 7d 20 7b 0d 0a 2b 20 20 20 20 6d 61 70  sts} {..+    map
a020: 65 61 63 68 20 69 20 7b 61 20 62 20 7b 7b 63 20  each i {a b {{c 
a030: 64 7d 20 65 7d 20 7b 31 32 33 20 7b 7b 78 7d 7d  d} e} {123 {{x}}
a040: 7d 7d 20 7b 0d 0a 2b 09 73 65 74 20 69 0d 0a 2b  }} {..+.set i..+
a050: 20 20 20 20 7d 0d 0a 2b 7d 20 7b 61 20 62 20 7b      }..+} {a b {
a060: 7b 63 20 64 7d 20 65 7d 20 7b 31 32 33 20 7b 7b  {c d} e} {123 {{
a070: 78 7d 7d 7d 7d 0d 0a 2b 74 65 73 74 20 6d 61 70  x}}}}..+test map
a080: 65 61 63 68 2d 31 2e 32 61 20 7b 62 61 73 69 63  each-1.2a {basic
a090: 20 6d 61 70 65 61 63 68 20 74 65 73 74 73 7d 20   mapeach tests} 
a0a0: 7b 0d 0a 2b 20 20 20 20 6d 61 70 65 61 63 68 20  {..+    mapeach 
a0b0: 69 20 7b 61 20 62 20 7b 7b 63 20 64 7d 20 65 7d  i {a b {{c d} e}
a0c0: 20 7b 31 32 33 20 7b 7b 78 7d 7d 7d 7d 20 7b 0d   {123 {{x}}}} {.
a0d0: 0a 2b 20 20 72 65 74 75 72 6e 20 2d 6c 65 76 65  .+  return -leve
a0e0: 6c 20 30 20 24 69 0d 0a 2b 20 20 20 20 7d 0d 0a  l 0 $i..+    }..
a0f0: 2b 7d 20 7b 61 20 62 20 7b 7b 63 20 64 7d 20 65  +} {a b {{c d} e
a100: 7d 20 7b 31 32 33 20 7b 7b 78 7d 7d 7d 7d 0d 0a  } {123 {{x}}}}..
a110: 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 31 2e  +test mapeach-1.
a120: 33 20 7b 62 61 73 69 63 20 6d 61 70 65 61 63 68  3 {basic mapeach
a130: 20 74 65 73 74 73 7d 20 7b 63 61 74 63 68 20 7b   tests} {catch {
a140: 6d 61 70 65 61 63 68 7d 20 6d 73 67 7d 20 31 0d  mapeach} msg} 1.
a150: 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 31  .+test mapeach-1
a160: 2e 34 20 7b 62 61 73 69 63 20 6d 61 70 65 61 63  .4 {basic mapeac
a170: 68 20 74 65 73 74 73 7d 20 7b 0d 0a 2b 20 20 20  h tests} {..+   
a180: 20 63 61 74 63 68 20 7b 6d 61 70 65 61 63 68 7d   catch {mapeach}
a190: 20 6d 73 67 0d 0a 2b 20 20 20 20 73 65 74 20 6d   msg..+    set m
a1a0: 73 67 0d 0a 2b 7d 20 7b 77 72 6f 6e 67 20 23 20  sg..+} {wrong # 
a1b0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
a1c0: 22 6d 61 70 65 61 63 68 20 76 61 72 4c 69 73 74  "mapeach varList
a1d0: 20 6c 69 73 74 20 3f 76 61 72 4c 69 73 74 20 6c   list ?varList l
a1e0: 69 73 74 20 2e 2e 2e 3f 20 63 6f 6d 6d 61 6e 64  ist ...? command
a1f0: 22 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63  "}..+test mapeac
a200: 68 2d 31 2e 35 20 7b 62 61 73 69 63 20 6d 61 70  h-1.5 {basic map
a210: 65 61 63 68 20 74 65 73 74 73 7d 20 7b 63 61 74  each tests} {cat
a220: 63 68 20 7b 6d 61 70 65 61 63 68 20 69 7d 20 6d  ch {mapeach i} m
a230: 73 67 7d 20 31 0d 0a 2b 74 65 73 74 20 6d 61 70  sg} 1..+test map
a240: 65 61 63 68 2d 31 2e 36 20 7b 62 61 73 69 63 20  each-1.6 {basic 
a250: 6d 61 70 65 61 63 68 20 74 65 73 74 73 7d 20 7b  mapeach tests} {
a260: 0d 0a 2b 20 20 20 20 63 61 74 63 68 20 7b 6d 61  ..+    catch {ma
a270: 70 65 61 63 68 20 69 7d 20 6d 73 67 0d 0a 2b 20  peach i} msg..+ 
a280: 20 20 20 73 65 74 20 6d 73 67 0d 0a 2b 7d 20 7b     set msg..+} {
a290: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
a2a0: 6f 75 6c 64 20 62 65 20 22 6d 61 70 65 61 63 68  ould be "mapeach
a2b0: 20 76 61 72 4c 69 73 74 20 6c 69 73 74 20 3f 76   varList list ?v
a2c0: 61 72 4c 69 73 74 20 6c 69 73 74 20 2e 2e 2e 3f  arList list ...?
a2d0: 20 63 6f 6d 6d 61 6e 64 22 7d 0d 0a 2b 74 65 73   command"}..+tes
a2e0: 74 20 6d 61 70 65 61 63 68 2d 31 2e 37 20 7b 62  t mapeach-1.7 {b
a2f0: 61 73 69 63 20 6d 61 70 65 61 63 68 20 74 65 73  asic mapeach tes
a300: 74 73 7d 20 7b 63 61 74 63 68 20 7b 6d 61 70 65  ts} {catch {mape
a310: 61 63 68 20 69 20 6a 7d 20 6d 73 67 7d 20 31 0d  ach i j} msg} 1.
a320: 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 31  .+test mapeach-1
a330: 2e 38 20 7b 62 61 73 69 63 20 6d 61 70 65 61 63  .8 {basic mapeac
a340: 68 20 74 65 73 74 73 7d 20 7b 0d 0a 2b 20 20 20  h tests} {..+   
a350: 20 63 61 74 63 68 20 7b 6d 61 70 65 61 63 68 20   catch {mapeach 
a360: 69 20 6a 7d 20 6d 73 67 0d 0a 2b 20 20 20 20 73  i j} msg..+    s
a370: 65 74 20 6d 73 67 0d 0a 2b 7d 20 7b 77 72 6f 6e  et msg..+} {wron
a380: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
a390: 20 62 65 20 22 6d 61 70 65 61 63 68 20 76 61 72   be "mapeach var
a3a0: 4c 69 73 74 20 6c 69 73 74 20 3f 76 61 72 4c 69  List list ?varLi
a3b0: 73 74 20 6c 69 73 74 20 2e 2e 2e 3f 20 63 6f 6d  st list ...? com
a3c0: 6d 61 6e 64 22 7d 0d 0a 2b 74 65 73 74 20 6d 61  mand"}..+test ma
a3d0: 70 65 61 63 68 2d 31 2e 39 20 7b 62 61 73 69 63  peach-1.9 {basic
a3e0: 20 6d 61 70 65 61 63 68 20 74 65 73 74 73 7d 20   mapeach tests} 
a3f0: 7b 63 61 74 63 68 20 7b 6d 61 70 65 61 63 68 20  {catch {mapeach 
a400: 69 20 6a 20 6b 20 6c 7d 20 6d 73 67 7d 20 31 0d  i j k l} msg} 1.
a410: 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 31  .+test mapeach-1
a420: 2e 31 30 20 7b 62 61 73 69 63 20 6d 61 70 65 61  .10 {basic mapea
a430: 63 68 20 74 65 73 74 73 7d 20 7b 0d 0a 2b 20 20  ch tests} {..+  
a440: 20 20 63 61 74 63 68 20 7b 6d 61 70 65 61 63 68    catch {mapeach
a450: 20 69 20 6a 20 6b 20 6c 7d 20 6d 73 67 0d 0a 2b   i j k l} msg..+
a460: 20 20 20 20 73 65 74 20 6d 73 67 0d 0a 2b 7d 20      set msg..+} 
a470: 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  {wrong # args: s
a480: 68 6f 75 6c 64 20 62 65 20 22 6d 61 70 65 61 63  hould be "mapeac
a490: 68 20 76 61 72 4c 69 73 74 20 6c 69 73 74 20 3f  h varList list ?
a4a0: 76 61 72 4c 69 73 74 20 6c 69 73 74 20 2e 2e 2e  varList list ...
a4b0: 3f 20 63 6f 6d 6d 61 6e 64 22 7d 0d 0a 2b 74 65  ? command"}..+te
a4c0: 73 74 20 6d 61 70 65 61 63 68 2d 31 2e 31 31 20  st mapeach-1.11 
a4d0: 7b 62 61 73 69 63 20 6d 61 70 65 61 63 68 20 74  {basic mapeach t
a4e0: 65 73 74 73 7d 20 7b 0d 0a 2b 20 20 20 20 6d 61  ests} {..+    ma
a4f0: 70 65 61 63 68 20 69 20 7b 7d 20 7b 0d 0a 2b 20  peach i {} {..+ 
a500: 20 20 20 20 20 73 65 74 20 69 0d 0a 2b 20 20 20       set i..+   
a510: 20 7d 0d 0a 2b 7d 20 7b 7d 0d 0a 2b 74 65 73 74   }..+} {}..+test
a520: 20 6d 61 70 65 61 63 68 2d 31 2e 31 32 20 7b 62   mapeach-1.12 {b
a530: 61 73 69 63 20 6d 61 70 65 61 63 68 20 74 65 73  asic mapeach tes
a540: 74 73 7d 20 7b 0d 0a 2b 20 20 20 20 6d 61 70 65  ts} {..+    mape
a550: 61 63 68 20 69 20 7b 7d 20 7b 0d 0a 2b 20 20 20  ach i {} {..+   
a560: 20 20 20 72 65 74 75 72 6e 20 2d 6c 65 76 65 6c     return -level
a570: 20 30 20 78 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 7d   0 x..+    }..+}
a580: 20 7b 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61   {}..+test mapea
a590: 63 68 2d 31 2e 31 33 20 7b 6d 61 70 65 61 63 68  ch-1.13 {mapeach
a5a0: 20 65 72 72 6f 72 73 7d 20 7b 0d 0a 2b 20 20 20   errors} {..+   
a5b0: 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 6d 61   list [catch {ma
a5c0: 70 65 61 63 68 20 7b 7b 61 7d 7b 62 7d 7d 20 7b  peach {{a}{b}} {
a5d0: 31 20 32 20 33 7d 20 7b 7d 7d 20 6d 73 67 5d 20  1 2 3} {}} msg] 
a5e0: 24 6d 73 67 0d 0a 2b 7d 20 7b 31 20 7b 6c 69 73  $msg..+} {1 {lis
a5f0: 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 62 72 61  t element in bra
a600: 63 65 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ces followed by 
a610: 22 7b 62 7d 22 20 69 6e 73 74 65 61 64 20 6f 66  "{b}" instead of
a620: 20 73 70 61 63 65 7d 7d 0d 0a 2b 74 65 73 74 20   space}}..+test 
a630: 6d 61 70 65 61 63 68 2d 31 2e 31 34 20 7b 6d 61  mapeach-1.14 {ma
a640: 70 65 61 63 68 20 65 72 72 6f 72 73 7d 20 7b 0d  peach errors} {.
a650: 0a 2b 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63  .+    list [catc
a660: 68 20 7b 6d 61 70 65 61 63 68 20 61 20 7b 7b 31  h {mapeach a {{1
a670: 20 32 7d 33 7d 20 7b 7d 7d 20 6d 73 67 5d 20 24   2}3} {}} msg] $
a680: 6d 73 67 0d 0a 2b 7d 20 7b 31 20 7b 6c 69 73 74  msg..+} {1 {list
a690: 20 65 6c 65 6d 65 6e 74 20 69 6e 20 62 72 61 63   element in brac
a6a0: 65 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 22  es followed by "
a6b0: 33 22 20 69 6e 73 74 65 61 64 20 6f 66 20 73 70  3" instead of sp
a6c0: 61 63 65 7d 7d 0d 0a 2b 63 61 74 63 68 20 7b 75  ace}}..+catch {u
a6d0: 6e 73 65 74 20 61 7d 0d 0a 2b 74 65 73 74 20 6d  nset a}..+test m
a6e0: 61 70 65 61 63 68 2d 31 2e 31 35 20 7b 6d 61 70  apeach-1.15 {map
a6f0: 65 61 63 68 20 65 72 72 6f 72 73 7d 20 7b 0d 0a  each errors} {..
a700: 2b 20 20 20 20 63 61 74 63 68 20 7b 75 6e 73 65  +    catch {unse
a710: 74 20 61 7d 0d 0a 2b 20 20 20 20 73 65 74 20 61  t a}..+    set a
a720: 28 30 29 20 34 34 0d 0a 2b 20 20 20 20 6c 69 73  (0) 44..+    lis
a730: 74 20 5b 63 61 74 63 68 20 7b 6d 61 70 65 61 63  t [catch {mapeac
a740: 68 20 61 20 7b 31 20 32 20 33 7d 20 7b 7d 7d 20  h a {1 2 3} {}} 
a750: 6d 73 67 20 6f 5d 20 24 6d 73 67 20 24 3a 3a 65  msg o] $msg $::e
a760: 72 72 6f 72 49 6e 66 6f 0d 0a 2b 7d 20 7b 31 20  rrorInfo..+} {1 
a770: 7b 63 61 6e 27 74 20 73 65 74 20 22 61 22 3a 20  {can't set "a": 
a780: 76 61 72 69 61 62 6c 65 20 69 73 20 61 72 72 61  variable is arra
a790: 79 7d 20 7b 63 61 6e 27 74 20 73 65 74 20 22 61  y} {can't set "a
a7a0: 22 3a 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  ": variable is a
a7b0: 72 72 61 79 0d 0a 2b 20 20 20 20 28 73 65 74 74  rray..+    (sett
a7c0: 69 6e 67 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  ing foreach loop
a7d0: 20 76 61 72 69 61 62 6c 65 20 22 61 22 29 0d 0a   variable "a")..
a7e0: 2b 20 20 20 20 69 6e 76 6f 6b 65 64 20 66 72 6f  +    invoked fro
a7f0: 6d 20 77 69 74 68 69 6e 0d 0a 2b 22 6d 61 70 65  m within..+"mape
a800: 61 63 68 20 61 20 7b 31 20 32 20 33 7d 20 7b 7d  ach a {1 2 3} {}
a810: 22 7d 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61  "}}..+test mapea
a820: 63 68 2d 31 2e 31 36 20 7b 6d 61 70 65 61 63 68  ch-1.16 {mapeach
a830: 20 65 72 72 6f 72 73 7d 20 7b 0d 0a 2b 20 20 20   errors} {..+   
a840: 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 6d 61   list [catch {ma
a850: 70 65 61 63 68 20 7b 7d 20 7b 7d 20 7b 7d 7d 20  peach {} {} {}} 
a860: 6d 73 67 5d 20 24 6d 73 67 0d 0a 2b 7d 20 7b 31  msg] $msg..+} {1
a870: 20 7b 66 6f 72 65 61 63 68 20 76 61 72 6c 69 73   {foreach varlis
a880: 74 20 69 73 20 65 6d 70 74 79 7d 7d 0d 0a 2b 63  t is empty}}..+c
a890: 61 74 63 68 20 7b 75 6e 73 65 74 20 61 7d 0d 0a  atch {unset a}..
a8a0: 2b 0d 0a 2b 0d 0a 2b 23 20 50 61 72 61 6c 6c 65  +..+..+# Paralle
a8b0: 6c 20 22 6d 61 70 65 61 63 68 22 20 6f 70 65 72  l "mapeach" oper
a8c0: 61 74 69 6f 6e 20 28 6e 6f 6e 2d 63 6f 6d 70 69  ation (non-compi
a8d0: 6c 65 64 29 0d 0a 2b 0d 0a 2b 74 65 73 74 20 6d  led)..+..+test m
a8e0: 61 70 65 61 63 68 2d 32 2e 31 20 7b 70 61 72 61  apeach-2.1 {para
a8f0: 6c 6c 65 6c 20 6d 61 70 65 61 63 68 20 74 65 73  llel mapeach tes
a900: 74 73 7d 20 7b 0d 0a 2b 20 20 20 20 6d 61 70 65  ts} {..+    mape
a910: 61 63 68 20 7b 61 20 62 7d 20 7b 31 20 32 20 33  ach {a b} {1 2 3
a920: 20 34 7d 20 7b 0d 0a 2b 09 6c 69 73 74 20 24 62   4} {..+.list $b
a930: 20 24 61 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 7d 20   $a..+    }..+} 
a940: 7b 7b 32 20 31 7d 20 7b 34 20 33 7d 7d 0d 0a 2b  {{2 1} {4 3}}..+
a950: 74 65 73 74 20 6d 61 70 65 61 63 68 2d 32 2e 32  test mapeach-2.2
a960: 20 7b 70 61 72 61 6c 6c 65 6c 20 6d 61 70 65 61   {parallel mapea
a970: 63 68 20 74 65 73 74 73 7d 20 7b 0d 0a 2b 20 20  ch tests} {..+  
a980: 20 20 6d 61 70 65 61 63 68 20 7b 61 20 62 7d 20    mapeach {a b} 
a990: 7b 31 20 32 20 33 20 34 20 35 7d 20 7b 0d 0a 2b  {1 2 3 4 5} {..+
a9a0: 09 6c 69 73 74 20 24 62 20 24 61 0d 0a 2b 20 20  .list $b $a..+  
a9b0: 20 20 7d 0d 0a 2b 7d 20 7b 7b 32 20 31 7d 20 7b    }..+} {{2 1} {
a9c0: 34 20 33 7d 20 7b 7b 7d 20 35 7d 7d 0d 0a 2b 74  4 3} {{} 5}}..+t
a9d0: 65 73 74 20 6d 61 70 65 61 63 68 2d 32 2e 33 20  est mapeach-2.3 
a9e0: 7b 70 61 72 61 6c 6c 65 6c 20 6d 61 70 65 61 63  {parallel mapeac
a9f0: 68 20 74 65 73 74 73 7d 20 7b 0d 0a 2b 20 20 20  h tests} {..+   
aa00: 20 6d 61 70 65 61 63 68 20 61 20 7b 31 20 32 20   mapeach a {1 2 
aa10: 33 7d 20 62 20 7b 34 20 35 20 36 7d 20 7b 0d 0a  3} b {4 5 6} {..
aa20: 2b 09 6c 69 73 74 20 24 62 20 24 61 0d 0a 2b 20  +.list $b $a..+ 
aa30: 20 20 20 7d 0d 0a 2b 7d 20 7b 7b 34 20 31 7d 20     }..+} {{4 1} 
aa40: 7b 35 20 32 7d 20 7b 36 20 33 7d 7d 0d 0a 2b 74  {5 2} {6 3}}..+t
aa50: 65 73 74 20 6d 61 70 65 61 63 68 2d 32 2e 34 20  est mapeach-2.4 
aa60: 7b 70 61 72 61 6c 6c 65 6c 20 6d 61 70 65 61 63  {parallel mapeac
aa70: 68 20 74 65 73 74 73 7d 20 7b 0d 0a 2b 20 20 20  h tests} {..+   
aa80: 20 6d 61 70 65 61 63 68 20 61 20 7b 31 20 32 20   mapeach a {1 2 
aa90: 33 7d 20 62 20 7b 34 20 35 20 36 20 37 20 38 7d  3} b {4 5 6 7 8}
aaa0: 20 7b 0d 0a 2b 09 6c 69 73 74 20 24 62 20 24 61   {..+.list $b $a
aab0: 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 7d 20 7b 7b 34  ..+    }..+} {{4
aac0: 20 31 7d 20 7b 35 20 32 7d 20 7b 36 20 33 7d 20   1} {5 2} {6 3} 
aad0: 7b 37 20 7b 7d 7d 20 7b 38 20 7b 7d 7d 7d 0d 0a  {7 {}} {8 {}}}..
aae0: 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 32 2e  +test mapeach-2.
aaf0: 35 20 7b 70 61 72 61 6c 6c 65 6c 20 6d 61 70 65  5 {parallel mape
ab00: 61 63 68 20 74 65 73 74 73 7d 20 7b 0d 0a 2b 20  ach tests} {..+ 
ab10: 20 20 20 6d 61 70 65 61 63 68 20 7b 61 20 62 7d     mapeach {a b}
ab20: 20 7b 61 20 62 20 41 20 42 20 61 61 20 62 62 7d   {a b A B aa bb}
ab30: 20 63 20 7b 63 20 43 20 63 63 20 43 43 7d 20 7b   c {c C cc CC} {
ab40: 0d 0a 2b 09 6c 69 73 74 20 24 61 20 24 62 20 24  ..+.list $a $b $
ab50: 63 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 7d 20 7b 7b  c..+    }..+} {{
ab60: 61 20 62 20 63 7d 20 7b 41 20 42 20 43 7d 20 7b  a b c} {A B C} {
ab70: 61 61 20 62 62 20 63 63 7d 20 7b 7b 7d 20 7b 7d  aa bb cc} {{} {}
ab80: 20 43 43 7d 7d 0d 0a 2b 74 65 73 74 20 6d 61 70   CC}}..+test map
ab90: 65 61 63 68 2d 32 2e 36 20 7b 70 61 72 61 6c 6c  each-2.6 {parall
aba0: 65 6c 20 6d 61 70 65 61 63 68 20 74 65 73 74 73  el mapeach tests
abb0: 7d 20 7b 0d 0a 2b 20 20 20 20 6d 61 70 65 61 63  } {..+    mapeac
abc0: 68 20 61 20 7b 31 20 32 20 33 7d 20 62 20 7b 31  h a {1 2 3} b {1
abd0: 20 32 20 33 7d 20 63 20 7b 31 20 32 20 33 7d 20   2 3} c {1 2 3} 
abe0: 64 20 7b 31 20 32 20 33 7d 20 65 20 7b 31 20 32  d {1 2 3} e {1 2
abf0: 20 33 7d 20 7b 0d 0a 2b 09 6c 69 73 74 20 24 61   3} {..+.list $a
ac00: 24 62 24 63 24 64 24 65 0d 0a 2b 20 20 20 20 7d  $b$c$d$e..+    }
ac10: 0d 0a 2b 7d 20 7b 31 31 31 31 31 20 32 32 32 32  ..+} {11111 2222
ac20: 32 20 33 33 33 33 33 7d 0d 0a 2b 74 65 73 74 20  2 33333}..+test 
ac30: 6d 61 70 65 61 63 68 2d 32 2e 37 20 7b 70 61 72  mapeach-2.7 {par
ac40: 61 6c 6c 65 6c 20 6d 61 70 65 61 63 68 20 74 65  allel mapeach te
ac50: 73 74 73 7d 20 7b 0d 0a 2b 20 20 20 20 6d 61 70  sts} {..+    map
ac60: 65 61 63 68 20 61 20 7b 7d 20 62 20 7b 31 20 32  each a {} b {1 2
ac70: 20 33 7d 20 63 20 7b 31 20 32 7d 20 64 20 7b 31   3} c {1 2} d {1
ac80: 20 32 20 33 20 34 7d 20 65 20 7b 7b 31 20 32 7d   2 3 4} e {{1 2}
ac90: 7d 20 7b 0d 0a 2b 09 73 65 74 20 78 20 24 61 24  } {..+.set x $a$
aca0: 62 24 63 24 64 24 65 0d 0a 2b 20 20 20 20 7d 0d  b$c$d$e..+    }.
acb0: 0a 2b 7d 20 7b 7b 31 31 31 31 20 32 7d 20 32 32  .+} {{1111 2} 22
acc0: 32 20 33 33 20 34 7d 0d 0a 2b 74 65 73 74 20 6d  2 33 4}..+test m
acd0: 61 70 65 61 63 68 2d 32 2e 38 20 7b 70 61 72 61  apeach-2.8 {para
ace0: 6c 6c 65 6c 20 6d 61 70 65 61 63 68 20 74 65 73  llel mapeach tes
acf0: 74 73 7d 20 7b 0d 0a 2b 20 20 20 20 6d 61 70 65  ts} {..+    mape
ad00: 61 63 68 20 61 20 7b 7d 20 62 20 7b 31 20 32 20  ach a {} b {1 2 
ad10: 33 7d 20 63 20 7b 31 20 32 7d 20 64 20 7b 31 20  3} c {1 2} d {1 
ad20: 32 20 33 20 34 7d 20 65 20 7b 7b 31 20 32 7d 7d  2 3 4} e {{1 2}}
ad30: 20 7b 0d 0a 2b 09 6a 6f 69 6e 20 5b 6c 69 73 74   {..+.join [list
ad40: 20 24 61 20 24 62 20 24 63 20 24 64 20 24 65 5d   $a $b $c $d $e]
ad50: 20 2e 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 7d 20 7b   ...+    }..+} {
ad60: 7b 2e 31 2e 31 2e 31 2e 31 20 32 7d 20 2e 32 2e  {.1.1.1.1 2} .2.
ad70: 32 2e 32 2e 20 2e 33 2e 2e 33 2e 20 2e 2e 2e 34  2.2. .3..3. ...4
ad80: 2e 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63  .}..+test mapeac
ad90: 68 2d 32 2e 39 20 7b 6d 61 70 65 61 63 68 20 6f  h-2.9 {mapeach o
ada0: 6e 6c 79 20 73 65 74 73 20 76 61 72 73 20 69 66  nly sets vars if
adb0: 20 72 65 70 65 61 74 69 6e 67 20 6c 6f 6f 70 7d   repeating loop}
adc0: 20 7b 0d 0a 2b 20 20 6e 61 6d 65 73 70 61 63 65   {..+  namespace
add0: 20 65 76 61 6c 20 3a 3a 6d 61 70 65 61 63 68 5f   eval ::mapeach_
ade0: 74 65 73 74 20 7b 0d 0a 2b 20 20 20 20 73 65 74  test {..+    set
adf0: 20 72 67 62 20 7b 36 35 35 33 35 20 30 20 30 7d   rgb {65535 0 0}
ae00: 0d 0a 2b 20 20 20 20 6d 61 70 65 61 63 68 20 7b  ..+    mapeach {
ae10: 72 20 67 20 62 7d 20 5b 73 65 74 20 72 67 62 5d  r g b} [set rgb]
ae20: 20 7b 7d 0d 0a 2b 20 20 20 20 73 65 74 20 3a 3a   {}..+    set ::
ae30: 78 20 22 72 3d 24 72 2c 20 67 3d 24 67 2c 20 62  x "r=$r, g=$g, b
ae40: 3d 24 62 22 0d 0a 2b 20 20 7d 0d 0a 2b 20 20 6e  =$b"..+  }..+  n
ae50: 61 6d 65 73 70 61 63 65 20 64 65 6c 65 74 65 20  amespace delete 
ae60: 3a 3a 6d 61 70 65 61 63 68 5f 74 65 73 74 0d 0a  ::mapeach_test..
ae70: 2b 20 20 73 65 74 20 78 0d 0a 2b 7d 20 7b 72 3d  +  set x..+} {r=
ae80: 36 35 35 33 35 2c 20 67 3d 30 2c 20 62 3d 30 7d  65535, g=0, b=0}
ae90: 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d  ..+test mapeach-
aea0: 32 2e 31 30 20 7b 6d 61 70 65 61 63 68 20 6f 6e  2.10 {mapeach on
aeb0: 6c 79 20 73 75 70 70 6f 72 74 73 20 6c 6f 63 61  ly supports loca
aec0: 6c 20 73 63 61 6c 61 72 20 76 61 72 69 61 62 6c  l scalar variabl
aed0: 65 73 7d 20 7b 0d 0a 2b 20 20 63 61 74 63 68 20  es} {..+  catch 
aee0: 7b 20 75 6e 73 65 74 20 61 20 7d 0d 0a 2b 20 20  { unset a }..+  
aef0: 6d 61 70 65 61 63 68 20 7b 61 28 33 29 7d 20 7b  mapeach {a(3)} {
af00: 31 20 32 20 33 20 34 7d 20 7b 73 65 74 20 7b 61  1 2 3 4} {set {a
af10: 28 33 29 7d 7d 0d 0a 2b 7d 20 7b 31 20 32 20 33  (3)}}..+} {1 2 3
af20: 20 34 7d 0d 0a 2b 63 61 74 63 68 20 7b 20 75 6e   4}..+catch { un
af30: 73 65 74 20 61 20 7d 0d 0a 2b 0d 0a 2b 0d 0a 2b  set a }..+..+..+
af40: 23 20 22 6d 61 70 65 61 63 68 22 20 77 69 74 68  # "mapeach" with
af50: 20 22 63 6f 6e 74 69 6e 75 65 22 20 61 6e 64 20   "continue" and 
af60: 22 62 72 65 61 6b 22 20 28 6e 6f 6e 2d 63 6f 6d  "break" (non-com
af70: 70 69 6c 65 64 29 0d 0a 2b 0d 0a 2b 74 65 73 74  piled)..+..+test
af80: 20 6d 61 70 65 61 63 68 2d 33 2e 31 20 7b 63 6f   mapeach-3.1 {co
af90: 6e 74 69 6e 75 65 20 74 65 73 74 73 7d 20 7b 0d  ntinue tests} {.
afa0: 0a 2b 20 20 20 20 6d 61 70 65 61 63 68 20 69 20  .+    mapeach i 
afb0: 7b 61 20 62 20 63 20 64 7d 20 7b 0d 0a 2b 09 69  {a b c d} {..+.i
afc0: 66 20 7b 5b 73 74 72 69 6e 67 20 63 6f 6d 70 61  f {[string compa
afd0: 72 65 20 24 69 20 22 62 22 5d 20 3d 3d 20 30 7d  re $i "b"] == 0}
afe0: 20 63 6f 6e 74 69 6e 75 65 0d 0a 2b 09 73 65 74   continue..+.set
aff0: 20 69 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 7d 20 7b   i..+    }..+} {
b000: 61 20 63 20 64 7d 0d 0a 2b 74 65 73 74 20 6d 61  a c d}..+test ma
b010: 70 65 61 63 68 2d 33 2e 32 20 7b 63 6f 6e 74 69  peach-3.2 {conti
b020: 6e 75 65 20 74 65 73 74 73 7d 20 7b 0d 0a 2b 20  nue tests} {..+ 
b030: 20 20 20 73 65 74 20 78 20 30 0d 0a 2b 20 20 20     set x 0..+   
b040: 20 6c 69 73 74 20 5b 6d 61 70 65 61 63 68 20 69   list [mapeach i
b050: 20 7b 61 20 62 20 63 20 64 7d 20 7b 0d 0a 2b 20   {a b c d} {..+ 
b060: 20 20 20 09 69 6e 63 72 20 78 0d 0a 2b 20 20 20     .incr x..+   
b070: 20 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 63 6f   .if {[string co
b080: 6d 70 61 72 65 20 24 69 20 22 62 22 5d 20 21 3d  mpare $i "b"] !=
b090: 20 30 7d 20 63 6f 6e 74 69 6e 75 65 0d 0a 2b 20   0} continue..+ 
b0a0: 20 20 20 09 73 65 74 20 69 0d 0a 2b 20 20 20 20     .set i..+    
b0b0: 7d 5d 20 24 78 0d 0a 2b 7d 20 7b 62 20 34 7d 0d  }] $x..+} {b 4}.
b0c0: 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 33  .+test mapeach-3
b0d0: 2e 33 20 7b 62 72 65 61 6b 20 74 65 73 74 73 7d  .3 {break tests}
b0e0: 20 7b 0d 0a 2b 20 20 20 20 73 65 74 20 78 20 30   {..+    set x 0
b0f0: 0d 0a 2b 20 20 20 20 6c 69 73 74 20 5b 6d 61 70  ..+    list [map
b100: 65 61 63 68 20 69 20 7b 61 20 62 20 63 20 64 7d  each i {a b c d}
b110: 20 7b 0d 0a 2b 20 20 20 20 20 20 69 6e 63 72 20   {..+      incr 
b120: 78 0d 0a 2b 20 20 20 20 09 69 66 20 7b 5b 73 74  x..+    .if {[st
b130: 72 69 6e 67 20 63 6f 6d 70 61 72 65 20 24 69 20  ring compare $i 
b140: 22 63 22 5d 20 3d 3d 20 30 7d 20 62 72 65 61 6b  "c"] == 0} break
b150: 0d 0a 2b 20 20 20 20 09 73 65 74 20 69 0d 0a 2b  ..+    .set i..+
b160: 20 20 20 20 7d 5d 20 24 78 0d 0a 2b 7d 20 7b 7b      }] $x..+} {{
b170: 61 20 62 7d 20 33 7d 0d 0a 2b 23 20 43 68 65 63  a b} 3}..+# Chec
b180: 6b 20 66 6f 72 20 62 75 67 20 73 69 6d 69 6c 61  k for bug simila
b190: 72 20 74 6f 20 23 34 30 36 37 30 39 0d 0a 2b 74  r to #406709..+t
b1a0: 65 73 74 20 6d 61 70 65 61 63 68 2d 33 2e 34 20  est mapeach-3.4 
b1b0: 7b 62 72 65 61 6b 20 74 65 73 74 73 7d 20 7b 0d  {break tests} {.
b1c0: 0a 2b 09 73 65 74 20 61 20 31 0d 0a 2b 09 6d 61  .+.set a 1..+.ma
b1d0: 70 65 61 63 68 20 62 20 62 20 7b 6c 69 73 74 20  peach b b {list 
b1e0: 5b 63 6f 6e 63 61 74 20 61 3b 20 62 72 65 61 6b  [concat a; break
b1f0: 5d 3b 20 69 6e 63 72 20 61 7d 0d 0a 2b 09 69 6e  ]; incr a}..+.in
b200: 63 72 20 61 0d 0a 2b 7d 20 7b 32 7d 0d 0a 2b 0d  cr a..+} {2}..+.
b210: 0a 2b 0d 0a 2b 23 20 2d 2d 2d 2d 2d 20 43 6f 6d  .+..+# ----- Com
b220: 70 69 6c 65 64 20 6f 70 65 72 61 74 69 6f 6e 20  piled operation 
b230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b260: 2d 2d 2d 2d 2d 2d 0d 0a 2b 0d 0a 2b 23 20 42 61  ------..+..+# Ba
b270: 73 69 63 20 22 6d 61 70 65 61 63 68 22 20 6f 70  sic "mapeach" op
b280: 65 72 61 74 69 6f 6e 20 28 63 6f 6d 70 69 6c 65  eration (compile
b290: 64 29 0d 0a 2b 0d 0a 2b 74 65 73 74 20 6d 61 70  d)..+..+test map
b2a0: 65 61 63 68 2d 34 2e 31 20 7b 62 61 73 69 63 20  each-4.1 {basic 
b2b0: 6d 61 70 65 61 63 68 20 74 65 73 74 73 7d 20 7b  mapeach tests} {
b2c0: 0d 0a 2b 20 20 61 70 70 6c 79 20 7b 7b 7d 20 7b  ..+  apply {{} {
b2d0: 0d 0a 2b 20 20 20 20 73 65 74 20 61 20 7b 7d 0d  ..+    set a {}.
b2e0: 0a 2b 20 20 20 20 6d 61 70 65 61 63 68 20 69 20  .+    mapeach i 
b2f0: 7b 61 20 62 20 63 20 64 7d 20 7b 0d 0a 2b 20 20  {a b c d} {..+  
b300: 20 20 20 20 73 65 74 20 61 20 5b 63 6f 6e 63 61      set a [conca
b310: 74 20 24 61 20 24 69 5d 0d 0a 2b 20 20 20 20 7d  t $a $i]..+    }
b320: 0d 0a 2b 20 20 7d 7d 0d 0a 2b 7d 20 7b 61 20 7b  ..+  }}..+} {a {
b330: 61 20 62 7d 20 7b 61 20 62 20 63 7d 20 7b 61 20  a b} {a b c} {a 
b340: 62 20 63 20 64 7d 7d 0d 0a 2b 74 65 73 74 20 6d  b c d}}..+test m
b350: 61 70 65 61 63 68 2d 34 2e 32 20 7b 62 61 73 69  apeach-4.2 {basi
b360: 63 20 6d 61 70 65 61 63 68 20 74 65 73 74 73 7d  c mapeach tests}
b370: 20 7b 0d 0a 2b 20 20 61 70 70 6c 79 20 7b 7b 7d   {..+  apply {{}
b380: 20 7b 0d 0a 2b 20 20 20 20 6d 61 70 65 61 63 68   {..+    mapeach
b390: 20 69 20 7b 61 20 62 20 7b 7b 63 20 64 7d 20 65   i {a b {{c d} e
b3a0: 7d 20 7b 31 32 33 20 7b 7b 78 7d 7d 7d 7d 20 7b  } {123 {{x}}}} {
b3b0: 0d 0a 2b 20 20 20 20 20 20 73 65 74 20 69 0d 0a  ..+      set i..
b3c0: 2b 20 20 20 20 7d 0d 0a 2b 20 20 7d 7d 0d 0a 2b  +    }..+  }}..+
b3d0: 7d 20 7b 61 20 62 20 7b 7b 63 20 64 7d 20 65 7d  } {a b {{c d} e}
b3e0: 20 7b 31 32 33 20 7b 7b 78 7d 7d 7d 7d 0d 0a 2b   {123 {{x}}}}..+
b3f0: 74 65 73 74 20 6d 61 70 65 61 63 68 2d 34 2e 32  test mapeach-4.2
b400: 61 20 7b 62 61 73 69 63 20 6d 61 70 65 61 63 68  a {basic mapeach
b410: 20 74 65 73 74 73 7d 20 7b 0d 0a 2b 20 20 61 70   tests} {..+  ap
b420: 70 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b 20 20 20 20  ply {{} {..+    
b430: 6d 61 70 65 61 63 68 20 69 20 7b 61 20 62 20 7b  mapeach i {a b {
b440: 7b 63 20 64 7d 20 65 7d 20 7b 31 32 33 20 7b 7b  {c d} e} {123 {{
b450: 78 7d 7d 7d 7d 20 7b 0d 0a 2b 20 20 20 20 20 20  x}}}} {..+      
b460: 72 65 74 75 72 6e 20 2d 6c 65 76 65 6c 20 30 20  return -level 0 
b470: 24 69 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 20 20 7d  $i..+    }..+  }
b480: 7d 0d 0a 2b 7d 20 7b 61 20 62 20 7b 7b 63 20 64  }..+} {a b {{c d
b490: 7d 20 65 7d 20 7b 31 32 33 20 7b 7b 78 7d 7d 7d  } e} {123 {{x}}}
b4a0: 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68  }..+test mapeach
b4b0: 2d 34 2e 33 20 7b 62 61 73 69 63 20 6d 61 70 65  -4.3 {basic mape
b4c0: 61 63 68 20 74 65 73 74 73 7d 20 7b 63 61 74 63  ach tests} {catc
b4d0: 68 20 7b 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 20  h { apply {{} { 
b4e0: 6d 61 70 65 61 63 68 20 7d 7d 20 7d 20 6d 73 67  mapeach }} } msg
b4f0: 7d 20 31 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61  } 1..+test mapea
b500: 63 68 2d 34 2e 34 20 7b 62 61 73 69 63 20 6d 61  ch-4.4 {basic ma
b510: 70 65 61 63 68 20 74 65 73 74 73 7d 20 7b 0d 0a  peach tests} {..
b520: 2b 20 20 20 20 63 61 74 63 68 20 7b 20 61 70 70  +    catch { app
b530: 6c 79 20 7b 7b 7d 20 7b 20 6d 61 70 65 61 63 68  ly {{} { mapeach
b540: 20 7d 7d 20 7d 20 6d 73 67 0d 0a 2b 20 20 20 20   }} } msg..+    
b550: 73 65 74 20 6d 73 67 0d 0a 2b 7d 20 7b 77 72 6f  set msg..+} {wro
b560: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
b570: 64 20 62 65 20 22 6d 61 70 65 61 63 68 20 76 61  d be "mapeach va
b580: 72 4c 69 73 74 20 6c 69 73 74 20 3f 76 61 72 4c  rList list ?varL
b590: 69 73 74 20 6c 69 73 74 20 2e 2e 2e 3f 20 63 6f  ist list ...? co
b5a0: 6d 6d 61 6e 64 22 7d 0d 0a 2b 74 65 73 74 20 6d  mmand"}..+test m
b5b0: 61 70 65 61 63 68 2d 34 2e 35 20 7b 62 61 73 69  apeach-4.5 {basi
b5c0: 63 20 6d 61 70 65 61 63 68 20 74 65 73 74 73 7d  c mapeach tests}
b5d0: 20 7b 63 61 74 63 68 20 7b 20 61 70 70 6c 79 20   {catch { apply 
b5e0: 7b 7b 7d 20 7b 20 6d 61 70 65 61 63 68 20 69 20  {{} { mapeach i 
b5f0: 7d 7d 20 7d 20 6d 73 67 7d 20 31 0d 0a 2b 74 65  }} } msg} 1..+te
b600: 73 74 20 6d 61 70 65 61 63 68 2d 34 2e 36 20 7b  st mapeach-4.6 {
b610: 62 61 73 69 63 20 6d 61 70 65 61 63 68 20 74 65  basic mapeach te
b620: 73 74 73 7d 20 7b 0d 0a 2b 20 20 20 20 63 61 74  sts} {..+    cat
b630: 63 68 20 7b 20 61 70 70 6c 79 20 7b 7b 7d 20 7b  ch { apply {{} {
b640: 20 6d 61 70 65 61 63 68 20 69 20 7d 7d 20 7d 20   mapeach i }} } 
b650: 6d 73 67 0d 0a 2b 20 20 20 20 73 65 74 20 6d 73  msg..+    set ms
b660: 67 0d 0a 2b 7d 20 7b 77 72 6f 6e 67 20 23 20 61  g..+} {wrong # a
b670: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22  rgs: should be "
b680: 6d 61 70 65 61 63 68 20 76 61 72 4c 69 73 74 20  mapeach varList 
b690: 6c 69 73 74 20 3f 76 61 72 4c 69 73 74 20 6c 69  list ?varList li
b6a0: 73 74 20 2e 2e 2e 3f 20 63 6f 6d 6d 61 6e 64 22  st ...? command"
b6b0: 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68  }..+test mapeach
b6c0: 2d 34 2e 37 20 7b 62 61 73 69 63 20 6d 61 70 65  -4.7 {basic mape
b6d0: 61 63 68 20 74 65 73 74 73 7d 20 7b 63 61 74 63  ach tests} {catc
b6e0: 68 20 7b 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 20  h { apply {{} { 
b6f0: 6d 61 70 65 61 63 68 20 69 20 6a 20 7d 7d 20 7d  mapeach i j }} }
b700: 20 6d 73 67 7d 20 31 0d 0a 2b 74 65 73 74 20 6d   msg} 1..+test m
b710: 61 70 65 61 63 68 2d 34 2e 38 20 7b 62 61 73 69  apeach-4.8 {basi
b720: 63 20 6d 61 70 65 61 63 68 20 74 65 73 74 73 7d  c mapeach tests}
b730: 20 7b 0d 0a 2b 20 20 20 20 63 61 74 63 68 20 7b   {..+    catch {
b740: 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 20 6d 61 70   apply {{} { map
b750: 65 61 63 68 20 69 20 6a 20 7d 7d 20 7d 20 6d 73  each i j }} } ms
b760: 67 0d 0a 2b 20 20 20 20 73 65 74 20 6d 73 67 0d  g..+    set msg.
b770: 0a 2b 7d 20 7b 77 72 6f 6e 67 20 23 20 61 72 67  .+} {wrong # arg
b780: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 6d 61  s: should be "ma
b790: 70 65 61 63 68 20 76 61 72 4c 69 73 74 20 6c 69  peach varList li
b7a0: 73 74 20 3f 76 61 72 4c 69 73 74 20 6c 69 73 74  st ?varList list
b7b0: 20 2e 2e 2e 3f 20 63 6f 6d 6d 61 6e 64 22 7d 0d   ...? command"}.
b7c0: 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 34  .+test mapeach-4
b7d0: 2e 39 20 7b 62 61 73 69 63 20 6d 61 70 65 61 63  .9 {basic mapeac
b7e0: 68 20 74 65 73 74 73 7d 20 7b 63 61 74 63 68 20  h tests} {catch 
b7f0: 7b 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 20 6d 61  { apply {{} { ma
b800: 70 65 61 63 68 20 69 20 6a 20 6b 20 6c 20 7d 7d  peach i j k l }}
b810: 20 7d 20 6d 73 67 7d 20 31 0d 0a 2b 74 65 73 74   } msg} 1..+test
b820: 20 6d 61 70 65 61 63 68 2d 34 2e 31 30 20 7b 62   mapeach-4.10 {b
b830: 61 73 69 63 20 6d 61 70 65 61 63 68 20 74 65 73  asic mapeach tes
b840: 74 73 7d 20 7b 0d 0a 2b 20 20 20 20 63 61 74 63  ts} {..+    catc
b850: 68 20 7b 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 20  h { apply {{} { 
b860: 6d 61 70 65 61 63 68 20 69 20 6a 20 6b 20 6c 20  mapeach i j k l 
b870: 7d 7d 20 7d 20 6d 73 67 0d 0a 2b 20 20 20 20 73  }} } msg..+    s
b880: 65 74 20 6d 73 67 0d 0a 2b 7d 20 7b 77 72 6f 6e  et msg..+} {wron
b890: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
b8a0: 20 62 65 20 22 6d 61 70 65 61 63 68 20 76 61 72   be "mapeach var
b8b0: 4c 69 73 74 20 6c 69 73 74 20 3f 76 61 72 4c 69  List list ?varLi
b8c0: 73 74 20 6c 69 73 74 20 2e 2e 2e 3f 20 63 6f 6d  st list ...? com
b8d0: 6d 61 6e 64 22 7d 0d 0a 2b 74 65 73 74 20 6d 61  mand"}..+test ma
b8e0: 70 65 61 63 68 2d 34 2e 31 31 20 7b 62 61 73 69  peach-4.11 {basi
b8f0: 63 20 6d 61 70 65 61 63 68 20 74 65 73 74 73 7d  c mapeach tests}
b900: 20 7b 0d 0a 2b 20 20 61 70 70 6c 79 20 7b 7b 7d   {..+  apply {{}
b910: 20 7b 20 6d 61 70 65 61 63 68 20 69 20 7b 7d 20   { mapeach i {} 
b920: 7b 20 73 65 74 20 69 20 7d 20 7d 7d 0d 0a 2b 7d  { set i } }}..+}
b930: 20 7b 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61   {}..+test mapea
b940: 63 68 2d 34 2e 31 32 20 7b 62 61 73 69 63 20 6d  ch-4.12 {basic m
b950: 61 70 65 61 63 68 20 74 65 73 74 73 7d 20 7b 0d  apeach tests} {.
b960: 0a 2b 20 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 20  .+  apply {{} { 
b970: 6d 61 70 65 61 63 68 20 69 20 7b 7d 20 7b 20 72  mapeach i {} { r
b980: 65 74 75 72 6e 20 2d 6c 65 76 65 6c 20 30 20 78  eturn -level 0 x
b990: 20 7d 20 7d 7d 0d 0a 2b 7d 20 7b 7d 0d 0a 2b 74   } }}..+} {}..+t
b9a0: 65 73 74 20 6d 61 70 65 61 63 68 2d 34 2e 31 33  est mapeach-4.13
b9b0: 20 7b 6d 61 70 65 61 63 68 20 65 72 72 6f 72 73   {mapeach errors
b9c0: 7d 20 7b 0d 0a 2b 20 20 20 20 6c 69 73 74 20 5b  } {..+    list [
b9d0: 63 61 74 63 68 20 7b 20 61 70 70 6c 79 20 7b 7b  catch { apply {{
b9e0: 7d 20 7b 20 6d 61 70 65 61 63 68 20 7b 7b 61 7d  } { mapeach {{a}
b9f0: 7b 62 7d 7d 20 7b 31 20 32 20 33 7d 20 7b 7d 20  {b}} {1 2 3} {} 
ba00: 7d 7d 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0d 0a  }} } msg] $msg..
ba10: 2b 7d 20 7b 31 20 7b 6c 69 73 74 20 65 6c 65 6d  +} {1 {list elem
ba20: 65 6e 74 20 69 6e 20 62 72 61 63 65 73 20 66 6f  ent in braces fo
ba30: 6c 6c 6f 77 65 64 20 62 79 20 22 7b 62 7d 22 20  llowed by "{b}" 
ba40: 69 6e 73 74 65 61 64 20 6f 66 20 73 70 61 63 65  instead of space
ba50: 7d 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63  }}..+test mapeac
ba60: 68 2d 34 2e 31 34 20 7b 6d 61 70 65 61 63 68 20  h-4.14 {mapeach 
ba70: 65 72 72 6f 72 73 7d 20 7b 0d 0a 2b 20 20 20 20  errors} {..+    
ba80: 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20 61 70  list [catch { ap
ba90: 70 6c 79 20 7b 7b 7d 20 7b 20 6d 61 70 65 61 63  ply {{} { mapeac
baa0: 68 20 61 20 7b 7b 31 20 32 7d 33 7d 20 7b 7d 20  h a {{1 2}3} {} 
bab0: 7d 7d 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0d 0a  }} } msg] $msg..
bac0: 2b 7d 20 7b 31 20 7b 6c 69 73 74 20 65 6c 65 6d  +} {1 {list elem
bad0: 65 6e 74 20 69 6e 20 62 72 61 63 65 73 20 66 6f  ent in braces fo
bae0: 6c 6c 6f 77 65 64 20 62 79 20 22 33 22 20 69 6e  llowed by "3" in
baf0: 73 74 65 61 64 20 6f 66 20 73 70 61 63 65 7d 7d  stead of space}}
bb00: 0d 0a 2b 63 61 74 63 68 20 7b 75 6e 73 65 74 20  ..+catch {unset 
bb10: 61 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63  a}..+test mapeac
bb20: 68 2d 34 2e 31 35 20 7b 6d 61 70 65 61 63 68 20  h-4.15 {mapeach 
bb30: 65 72 72 6f 72 73 7d 20 7b 0d 0a 2b 20 20 20 20  errors} {..+    
bb40: 61 70 70 6c 79 20 7b 7b 7d 20 7b 20 0d 0a 2b 20  apply {{} { ..+ 
bb50: 20 20 20 20 20 73 65 74 20 61 28 30 29 20 34 34       set a(0) 44
bb60: 0d 0a 2b 20 20 20 20 20 20 6c 69 73 74 20 5b 63  ..+      list [c
bb70: 61 74 63 68 20 7b 6d 61 70 65 61 63 68 20 61 20  atch {mapeach a 
bb80: 7b 31 20 32 20 33 7d 20 7b 7d 7d 20 6d 73 67 20  {1 2 3} {}} msg 
bb90: 6f 5d 20 24 6d 73 67 20 24 3a 3a 65 72 72 6f 72  o] $msg $::error
bba0: 49 6e 66 6f 20 0d 0a 2b 20 20 20 20 7d 7d 20 0d  Info ..+    }} .
bbb0: 0a 2b 7d 20 7b 31 20 7b 63 61 6e 27 74 20 73 65  .+} {1 {can't se
bbc0: 74 20 22 61 22 3a 20 76 61 72 69 61 62 6c 65 20  t "a": variable 
bbd0: 69 73 20 61 72 72 61 79 7d 20 7b 63 61 6e 27 74  is array} {can't
bbe0: 20 73 65 74 20 22 61 22 3a 20 76 61 72 69 61 62   set "a": variab
bbf0: 6c 65 20 69 73 20 61 72 72 61 79 0d 0a 2b 20 20  le is array..+  
bc00: 20 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e    while executin
bc10: 67 0d 0a 2b 22 6d 61 70 65 61 63 68 20 61 20 7b  g..+"mapeach a {
bc20: 31 20 32 20 33 7d 20 7b 7d 22 7d 7d 0d 0a 2b 74  1 2 3} {}"}}..+t
bc30: 65 73 74 20 6d 61 70 65 61 63 68 2d 34 2e 31 36  est mapeach-4.16
bc40: 20 7b 6d 61 70 65 61 63 68 20 65 72 72 6f 72 73   {mapeach errors
bc50: 7d 20 7b 0d 0a 2b 20 20 20 20 6c 69 73 74 20 5b  } {..+    list [
bc60: 63 61 74 63 68 20 7b 20 61 70 70 6c 79 20 7b 7b  catch { apply {{
bc70: 7d 20 7b 20 6d 61 70 65 61 63 68 20 7b 7d 20 7b  } { mapeach {} {
bc80: 7d 20 7b 7d 20 7d 7d 20 7d 20 6d 73 67 5d 20 24  } {} }} } msg] $
bc90: 6d 73 67 0d 0a 2b 7d 20 7b 31 20 7b 66 6f 72 65  msg..+} {1 {fore
bca0: 61 63 68 20 76 61 72 6c 69 73 74 20 69 73 20 65  ach varlist is e
bcb0: 6d 70 74 79 7d 7d 0d 0a 2b 63 61 74 63 68 20 7b  mpty}}..+catch {
bcc0: 75 6e 73 65 74 20 61 7d 0d 0a 2b 0d 0a 2b 0d 0a  unset a}..+..+..
bcd0: 2b 23 20 50 61 72 61 6c 6c 65 6c 20 22 6d 61 70  +# Parallel "map
bce0: 65 61 63 68 22 20 6f 70 65 72 61 74 69 6f 6e 20  each" operation 
bcf0: 28 63 6f 6d 70 69 6c 65 64 29 0d 0a 2b 0d 0a 2b  (compiled)..+..+
bd00: 74 65 73 74 20 6d 61 70 65 61 63 68 2d 35 2e 31  test mapeach-5.1
bd10: 20 7b 70 61 72 61 6c 6c 65 6c 20 6d 61 70 65 61   {parallel mapea
bd20: 63 68 20 74 65 73 74 73 7d 20 7b 0d 0a 2b 20 20  ch tests} {..+  
bd30: 61 70 70 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b 20 20  apply {{} {..+  
bd40: 20 20 6d 61 70 65 61 63 68 20 7b 61 20 62 7d 20    mapeach {a b} 
bd50: 7b 31 20 32 20 33 20 34 7d 20 7b 0d 0a 2b 20 20  {1 2 3 4} {..+  
bd60: 20 20 20 20 6c 69 73 74 20 24 62 20 24 61 0d 0a      list $b $a..
bd70: 2b 20 20 20 20 7d 0d 0a 2b 20 20 7d 7d 0d 0a 2b  +    }..+  }}..+
bd80: 7d 20 7b 7b 32 20 31 7d 20 7b 34 20 33 7d 7d 0d  } {{2 1} {4 3}}.
bd90: 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 35  .+test mapeach-5
bda0: 2e 32 20 7b 70 61 72 61 6c 6c 65 6c 20 6d 61 70  .2 {parallel map
bdb0: 65 61 63 68 20 74 65 73 74 73 7d 20 7b 0d 0a 2b  each tests} {..+
bdc0: 20 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b    apply {{} {..+
bdd0: 20 20 20 20 6d 61 70 65 61 63 68 20 7b 61 20 62      mapeach {a b
bde0: 7d 20 7b 31 20 32 20 33 20 34 20 35 7d 20 7b 0d  } {1 2 3 4 5} {.
bdf0: 0a 2b 20 20 20 20 20 20 6c 69 73 74 20 24 62 20  .+      list $b 
be00: 24 61 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 20 20 7d  $a..+    }..+  }
be10: 7d 0d 0a 2b 7d 20 7b 7b 32 20 31 7d 20 7b 34 20  }..+} {{2 1} {4 
be20: 33 7d 20 7b 7b 7d 20 35 7d 7d 0d 0a 2b 74 65 73  3} {{} 5}}..+tes
be30: 74 20 6d 61 70 65 61 63 68 2d 35 2e 33 20 7b 70  t mapeach-5.3 {p
be40: 61 72 61 6c 6c 65 6c 20 6d 61 70 65 61 63 68 20  arallel mapeach 
be50: 74 65 73 74 73 7d 20 7b 0d 0a 2b 20 20 61 70 70  tests} {..+  app
be60: 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b 20 20 20 20 6d  ly {{} {..+    m
be70: 61 70 65 61 63 68 20 61 20 7b 31 20 32 20 33 7d  apeach a {1 2 3}
be80: 20 62 20 7b 34 20 35 20 36 7d 20 7b 0d 0a 2b 20   b {4 5 6} {..+ 
be90: 20 20 20 20 20 6c 69 73 74 20 24 62 20 24 61 0d       list $b $a.
bea0: 0a 2b 20 20 20 20 7d 0d 0a 2b 20 20 7d 7d 0d 0a  .+    }..+  }}..
beb0: 2b 7d 20 7b 7b 34 20 31 7d 20 7b 35 20 32 7d 20  +} {{4 1} {5 2} 
bec0: 7b 36 20 33 7d 7d 0d 0a 2b 74 65 73 74 20 6d 61  {6 3}}..+test ma
bed0: 70 65 61 63 68 2d 35 2e 34 20 7b 70 61 72 61 6c  peach-5.4 {paral
bee0: 6c 65 6c 20 6d 61 70 65 61 63 68 20 74 65 73 74  lel mapeach test
bef0: 73 7d 20 7b 0d 0a 2b 20 20 61 70 70 6c 79 20 7b  s} {..+  apply {
bf00: 7b 7d 20 7b 0d 0a 2b 20 20 20 20 6d 61 70 65 61  {} {..+    mapea
bf10: 63 68 20 61 20 7b 31 20 32 20 33 7d 20 62 20 7b  ch a {1 2 3} b {
bf20: 34 20 35 20 36 20 37 20 38 7d 20 7b 0d 0a 2b 09  4 5 6 7 8} {..+.
bf30: 6c 69 73 74 20 24 62 20 24 61 0d 0a 2b 20 20 20  list $b $a..+   
bf40: 20 7d 0d 0a 2b 20 20 7d 7d 0d 0a 2b 7d 20 7b 7b   }..+  }}..+} {{
bf50: 34 20 31 7d 20 7b 35 20 32 7d 20 7b 36 20 33 7d  4 1} {5 2} {6 3}
bf60: 20 7b 37 20 7b 7d 7d 20 7b 38 20 7b 7d 7d 7d 0d   {7 {}} {8 {}}}.
bf70: 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 35  .+test mapeach-5
bf80: 2e 35 20 7b 70 61 72 61 6c 6c 65 6c 20 6d 61 70  .5 {parallel map
bf90: 65 61 63 68 20 74 65 73 74 73 7d 20 7b 0d 0a 2b  each tests} {..+
bfa0: 20 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b    apply {{} {..+
bfb0: 20 20 20 20 6d 61 70 65 61 63 68 20 7b 61 20 62      mapeach {a b
bfc0: 7d 20 7b 61 20 62 20 41 20 42 20 61 61 20 62 62  } {a b A B aa bb
bfd0: 7d 20 63 20 7b 63 20 43 20 63 63 20 43 43 7d 20  } c {c C cc CC} 
bfe0: 7b 0d 0a 2b 20 20 20 20 20 20 6c 69 73 74 20 24  {..+      list $
bff0: 61 20 24 62 20 24 63 0d 0a 2b 20 20 20 20 7d 0d  a $b $c..+    }.
c000: 0a 2b 20 20 7d 7d 0d 0a 2b 7d 20 7b 7b 61 20 62  .+  }}..+} {{a b
c010: 20 63 7d 20 7b 41 20 42 20 43 7d 20 7b 61 61 20   c} {A B C} {aa 
c020: 62 62 20 63 63 7d 20 7b 7b 7d 20 7b 7d 20 43 43  bb cc} {{} {} CC
c030: 7d 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63  }}..+test mapeac
c040: 68 2d 35 2e 36 20 7b 70 61 72 61 6c 6c 65 6c 20  h-5.6 {parallel 
c050: 6d 61 70 65 61 63 68 20 74 65 73 74 73 7d 20 7b  mapeach tests} {
c060: 0d 0a 2b 20 20 61 70 70 6c 79 20 7b 7b 7d 20 7b  ..+  apply {{} {
c070: 0d 0a 2b 20 20 20 20 6d 61 70 65 61 63 68 20 61  ..+    mapeach a
c080: 20 7b 31 20 32 20 33 7d 20 62 20 7b 31 20 32 20   {1 2 3} b {1 2 
c090: 33 7d 20 63 20 7b 31 20 32 20 33 7d 20 64 20 7b  3} c {1 2 3} d {
c0a0: 31 20 32 20 33 7d 20 65 20 7b 31 20 32 20 33 7d  1 2 3} e {1 2 3}
c0b0: 20 7b 0d 0a 2b 20 20 20 20 20 20 6c 69 73 74 20   {..+      list 
c0c0: 24 61 24 62 24 63 24 64 24 65 0d 0a 2b 20 20 20  $a$b$c$d$e..+   
c0d0: 20 7d 0d 0a 2b 20 20 7d 7d 0d 0a 2b 7d 20 7b 31   }..+  }}..+} {1
c0e0: 31 31 31 31 20 32 32 32 32 32 20 33 33 33 33 33  1111 22222 33333
c0f0: 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68  }..+test mapeach
c100: 2d 35 2e 37 20 7b 70 61 72 61 6c 6c 65 6c 20 6d  -5.7 {parallel m
c110: 61 70 65 61 63 68 20 74 65 73 74 73 7d 20 7b 0d  apeach tests} {.
c120: 0a 2b 20 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 0d  .+  apply {{} {.
c130: 0a 2b 20 20 20 20 6d 61 70 65 61 63 68 20 61 20  .+    mapeach a 
c140: 7b 7d 20 62 20 7b 31 20 32 20 33 7d 20 63 20 7b  {} b {1 2 3} c {
c150: 31 20 32 7d 20 64 20 7b 31 20 32 20 33 20 34 7d  1 2} d {1 2 3 4}
c160: 20 65 20 7b 7b 31 20 32 7d 7d 20 7b 0d 0a 2b 20   e {{1 2}} {..+ 
c170: 20 20 20 20 20 73 65 74 20 78 20 24 61 24 62 24       set x $a$b$
c180: 63 24 64 24 65 0d 0a 2b 20 20 20 20 7d 0d 0a 2b  c$d$e..+    }..+
c190: 20 20 7d 7d 0d 0a 2b 7d 20 7b 7b 31 31 31 31 20    }}..+} {{1111 
c1a0: 32 7d 20 32 32 32 20 33 33 20 34 7d 0d 0a 2b 74  2} 222 33 4}..+t
c1b0: 65 73 74 20 6d 61 70 65 61 63 68 2d 35 2e 38 20  est mapeach-5.8 
c1c0: 7b 70 61 72 61 6c 6c 65 6c 20 6d 61 70 65 61 63  {parallel mapeac
c1d0: 68 20 74 65 73 74 73 7d 20 7b 0d 0a 2b 20 20 61  h tests} {..+  a
c1e0: 70 70 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b 20 20 20  pply {{} {..+   
c1f0: 20 6d 61 70 65 61 63 68 20 61 20 7b 7d 20 62 20   mapeach a {} b 
c200: 7b 31 20 32 20 33 7d 20 63 20 7b 31 20 32 7d 20  {1 2 3} c {1 2} 
c210: 64 20 7b 31 20 32 20 33 20 34 7d 20 65 20 7b 7b  d {1 2 3 4} e {{
c220: 31 20 32 7d 7d 20 7b 0d 0a 2b 20 20 20 20 20 20  1 2}} {..+      
c230: 6a 6f 69 6e 20 5b 6c 69 73 74 20 24 61 20 24 62  join [list $a $b
c240: 20 24 63 20 24 64 20 24 65 5d 20 2e 0d 0a 2b 20   $c $d $e] ...+ 
c250: 20 20 20 7d 0d 0a 2b 20 20 7d 7d 0d 0a 2b 7d 20     }..+  }}..+} 
c260: 7b 7b 2e 31 2e 31 2e 31 2e 31 20 32 7d 20 2e 32  {{.1.1.1.1 2} .2
c270: 2e 32 2e 32 2e 20 2e 33 2e 2e 33 2e 20 2e 2e 2e  .2.2. .3..3. ...
c280: 34 2e 7d 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61  4.}..+test mapea
c290: 63 68 2d 35 2e 39 20 7b 6d 61 70 65 61 63 68 20  ch-5.9 {mapeach 
c2a0: 6f 6e 6c 79 20 73 65 74 73 20 76 61 72 73 20 69  only sets vars i
c2b0: 66 20 72 65 70 65 61 74 69 6e 67 20 6c 6f 6f 70  f repeating loop
c2c0: 7d 20 7b 0d 0a 2b 20 20 20 20 61 70 70 6c 79 20  } {..+    apply 
c2d0: 7b 7b 7d 20 7b 0d 0a 2b 20 20 20 20 20 20 20 20  {{} {..+        
c2e0: 73 65 74 20 72 67 62 20 7b 36 35 35 33 35 20 30  set rgb {65535 0
c2f0: 20 30 7d 0d 0a 2b 20 20 20 20 20 20 20 20 6d 61   0}..+        ma
c300: 70 65 61 63 68 20 7b 72 20 67 20 62 7d 20 5b 73  peach {r g b} [s
c310: 65 74 20 72 67 62 5d 20 7b 7d 0d 0a 2b 20 20 20  et rgb] {}..+   
c320: 20 20 20 20 20 72 65 74 75 72 6e 20 22 72 3d 24       return "r=$
c330: 72 2c 20 67 3d 24 67 2c 20 62 3d 24 62 22 0d 0a  r, g=$g, b=$b"..
c340: 2b 20 20 20 20 7d 7d 0d 0a 2b 7d 20 7b 72 3d 36  +    }}..+} {r=6
c350: 35 35 33 35 2c 20 67 3d 30 2c 20 62 3d 30 7d 0d  5535, g=0, b=0}.
c360: 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 35  .+test mapeach-5
c370: 2e 31 30 20 7b 6d 61 70 65 61 63 68 20 6f 6e 6c  .10 {mapeach onl
c380: 79 20 73 75 70 70 6f 72 74 73 20 6c 6f 63 61 6c  y supports local
c390: 20 73 63 61 6c 61 72 20 76 61 72 69 61 62 6c 65   scalar variable
c3a0: 73 7d 20 7b 0d 0a 2b 20 20 20 20 61 70 70 6c 79  s} {..+    apply
c3b0: 20 7b 7b 7d 20 7b 0d 0a 2b 20 20 20 20 20 20 20   {{} {..+       
c3c0: 20 6d 61 70 65 61 63 68 20 7b 61 28 33 29 7d 20   mapeach {a(3)} 
c3d0: 7b 31 20 32 20 33 20 34 7d 20 7b 73 65 74 20 7b  {1 2 3 4} {set {
c3e0: 61 28 33 29 7d 7d 0d 0a 2b 20 20 20 20 7d 7d 0d  a(3)}}..+    }}.
c3f0: 0a 2b 7d 20 7b 31 20 32 20 33 20 34 7d 0d 0a 2b  .+} {1 2 3 4}..+
c400: 0d 0a 2b 0d 0a 2b 23 20 22 6d 61 70 65 61 63 68  ..+..+# "mapeach
c410: 22 20 77 69 74 68 20 22 63 6f 6e 74 69 6e 75 65  " with "continue
c420: 22 20 61 6e 64 20 22 62 72 65 61 6b 22 20 28 63  " and "break" (c
c430: 6f 6d 70 69 6c 65 64 29 0d 0a 2b 0d 0a 2b 74 65  ompiled)..+..+te
c440: 73 74 20 6d 61 70 65 61 63 68 2d 36 2e 31 20 7b  st mapeach-6.1 {
c450: 63 6f 6e 74 69 6e 75 65 20 74 65 73 74 73 7d 20  continue tests} 
c460: 7b 0d 0a 2b 20 20 61 70 70 6c 79 20 7b 7b 7d 20  {..+  apply {{} 
c470: 7b 0d 0a 2b 20 20 20 20 6d 61 70 65 61 63 68 20  {..+    mapeach 
c480: 69 20 7b 61 20 62 20 63 20 64 7d 20 7b 0d 0a 2b  i {a b c d} {..+
c490: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
c4a0: 67 20 63 6f 6d 70 61 72 65 20 24 69 20 22 62 22  g compare $i "b"
c4b0: 5d 20 3d 3d 20 30 7d 20 63 6f 6e 74 69 6e 75 65  ] == 0} continue
c4c0: 0d 0a 2b 20 20 20 20 20 20 73 65 74 20 69 0d 0a  ..+      set i..
c4d0: 2b 20 20 20 20 7d 0d 0a 2b 20 20 7d 7d 0d 0a 2b  +    }..+  }}..+
c4e0: 7d 20 7b 61 20 63 20 64 7d 0d 0a 2b 74 65 73 74  } {a c d}..+test
c4f0: 20 6d 61 70 65 61 63 68 2d 36 2e 32 20 7b 63 6f   mapeach-6.2 {co
c500: 6e 74 69 6e 75 65 20 74 65 73 74 73 7d 20 7b 0d  ntinue tests} {.
c510: 0a 2b 20 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 0d  .+  apply {{} {.
c520: 0a 2b 20 20 20 20 6c 69 73 74 20 5b 6d 61 70 65  .+    list [mape
c530: 61 63 68 20 69 20 7b 61 20 62 20 63 20 64 7d 20  ach i {a b c d} 
c540: 7b 0d 0a 2b 20 20 20 20 20 20 69 6e 63 72 20 78  {..+      incr x
c550: 0d 0a 2b 20 20 20 20 09 69 66 20 7b 5b 73 74 72  ..+    .if {[str
c560: 69 6e 67 20 63 6f 6d 70 61 72 65 20 24 69 20 22  ing compare $i "
c570: 62 22 5d 20 21 3d 20 30 7d 20 63 6f 6e 74 69 6e  b"] != 0} contin
c580: 75 65 0d 0a 2b 20 20 20 20 09 73 65 74 20 69 0d  ue..+    .set i.
c590: 0a 2b 20 20 20 20 7d 5d 20 24 78 0d 0a 2b 20 20  .+    }] $x..+  
c5a0: 7d 7d 0d 0a 2b 7d 20 7b 62 20 34 7d 0d 0a 2b 74  }}..+} {b 4}..+t
c5b0: 65 73 74 20 6d 61 70 65 61 63 68 2d 36 2e 33 20  est mapeach-6.3 
c5c0: 7b 62 72 65 61 6b 20 74 65 73 74 73 7d 20 7b 0d  {break tests} {.
c5d0: 0a 2b 20 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 0d  .+  apply {{} {.
c5e0: 0a 2b 20 20 20 20 6c 69 73 74 20 5b 6d 61 70 65  .+    list [mape
c5f0: 61 63 68 20 69 20 7b 61 20 62 20 63 20 64 7d 20  ach i {a b c d} 
c600: 7b 0d 0a 2b 20 20 20 20 20 20 69 6e 63 72 20 78  {..+      incr x
c610: 0d 0a 2b 20 20 20 20 09 69 66 20 7b 5b 73 74 72  ..+    .if {[str
c620: 69 6e 67 20 63 6f 6d 70 61 72 65 20 24 69 20 22  ing compare $i "
c630: 63 22 5d 20 3d 3d 20 30 7d 20 62 72 65 61 6b 0d  c"] == 0} break.
c640: 0a 2b 20 20 20 20 09 73 65 74 20 69 0d 0a 2b 20  .+    .set i..+ 
c650: 20 20 20 7d 5d 20 24 78 0d 0a 2b 20 20 7d 7d 0d     }] $x..+  }}.
c660: 0a 2b 7d 20 7b 7b 61 20 62 7d 20 33 7d 0d 0a 2b  .+} {{a b} 3}..+
c670: 23 20 43 68 65 63 6b 20 66 6f 72 20 62 75 67 20  # Check for bug 
c680: 73 69 6d 69 6c 61 72 20 74 6f 20 23 34 30 36 37  similar to #4067
c690: 30 39 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63  09..+test mapeac
c6a0: 68 2d 36 2e 34 20 7b 62 72 65 61 6b 20 74 65 73  h-6.4 {break tes
c6b0: 74 73 7d 20 7b 0d 0a 2b 20 20 20 20 61 70 70 6c  ts} {..+    appl
c6c0: 79 20 7b 7b 7d 20 7b 0d 0a 2b 09 73 65 74 20 61  y {{} {..+.set a
c6d0: 20 31 0d 0a 2b 09 6d 61 70 65 61 63 68 20 62 20   1..+.mapeach b 
c6e0: 62 20 7b 6c 69 73 74 20 5b 63 6f 6e 63 61 74 20  b {list [concat 
c6f0: 61 3b 20 62 72 65 61 6b 5d 3b 20 69 6e 63 72 20  a; break]; incr 
c700: 61 7d 0d 0a 2b 09 69 6e 63 72 20 61 0d 0a 2b 20  a}..+.incr a..+ 
c710: 20 20 20 7d 7d 0d 0a 2b 7d 20 7b 32 7d 0d 0a 2b     }}..+} {2}..+
c720: 0d 0a 2b 0d 0a 2b 0d 0a 2b 23 20 2d 2d 2d 2d 2d  ..+..+..+# -----
c730: 20 53 70 65 63 69 61 6c 20 63 61 73 65 73 20 61   Special cases a
c740: 6e 64 20 62 75 67 73 20 2d 2d 2d 2d 2d 2d 2d 2d  nd bugs --------
c750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 2b 0d 0a 2b 0d  ---------..+..+.
c780: 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 37  .+test mapeach-7
c790: 2e 31 20 7b 63 6f 6d 70 69 6c 65 64 20 6d 61 70  .1 {compiled map
c7a0: 65 61 63 68 20 62 61 63 6b 77 61 72 64 20 6a 75  each backward ju
c7b0: 6d 70 20 77 6f 72 6b 73 20 63 6f 72 72 65 63 74  mp works correct
c7c0: 6c 79 7d 20 7b 0d 0a 2b 20 20 20 20 63 61 74 63  ly} {..+    catc
c7d0: 68 20 7b 75 6e 73 65 74 20 78 7d 0d 0a 2b 20 20  h {unset x}..+  
c7e0: 20 20 61 72 72 61 79 20 73 65 74 20 78 20 7b 30    array set x {0
c7f0: 20 7a 65 72 6f 20 31 20 6f 6e 65 20 32 20 74 77   zero 1 one 2 tw
c800: 6f 20 33 20 74 68 72 65 65 7d 0d 0a 2b 20 20 20  o 3 three}..+   
c810: 20 6c 73 6f 72 74 20 5b 61 70 70 6c 79 20 7b 7b   lsort [apply {{
c820: 61 72 72 61 79 4e 61 6d 65 7d 20 7b 0d 0a 2b 20  arrayName} {..+ 
c830: 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24         upvar 1 $
c840: 61 72 72 61 79 4e 61 6d 65 20 61 0d 0a 2b 20 20  arrayName a..+  
c850: 20 20 20 20 20 20 6d 61 70 65 61 63 68 20 6d 65        mapeach me
c860: 6d 62 65 72 20 5b 61 72 72 61 79 20 6e 61 6d 65  mber [array name
c870: 73 20 61 5d 20 7b 0d 0a 2b 20 20 20 20 20 20 20  s a] {..+       
c880: 20 20 20 20 20 6c 69 73 74 20 24 6d 65 6d 62 65       list $membe
c890: 72 20 5b 73 65 74 20 61 28 24 6d 65 6d 62 65 72  r [set a($member
c8a0: 29 5d 0d 0a 2b 20 20 20 20 20 20 20 20 7d 0d 0a  )]..+        }..
c8b0: 2b 20 20 20 20 7d 7d 20 78 5d 0d 0a 2b 7d 20 5b  +    }} x]..+} [
c8c0: 6c 73 6f 72 74 20 7b 7b 30 20 7a 65 72 6f 7d 20  lsort {{0 zero} 
c8d0: 7b 31 20 6f 6e 65 7d 20 7b 32 20 74 77 6f 7d 20  {1 one} {2 two} 
c8e0: 7b 33 20 74 68 72 65 65 7d 7d 5d 0d 0a 2b 0d 0a  {3 three}}]..+..
c8f0: 2b 74 65 73 74 20 6d 61 70 65 61 63 68 2d 37 2e  +test mapeach-7.
c900: 32 20 7b 6e 6f 6e 63 6f 6d 70 69 6c 65 64 20 6d  2 {noncompiled m
c910: 61 70 65 61 63 68 20 61 6e 64 20 73 68 61 72 65  apeach and share
c920: 64 20 76 61 72 69 61 62 6c 65 20 6f 72 20 76 61  d variable or va
c930: 6c 75 65 20 6c 69 73 74 20 6f 62 6a 65 63 74 73  lue list objects
c940: 20 74 68 61 74 20 61 72 65 20 63 6f 6e 76 65 72   that are conver
c950: 74 65 64 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ted to another t
c960: 79 70 65 7d 20 7b 0d 0a 2b 20 20 20 20 63 61 74  ype} {..+    cat
c970: 63 68 20 7b 75 6e 73 65 74 20 78 7d 0d 0a 2b 20  ch {unset x}..+ 
c980: 20 20 20 6d 61 70 65 61 63 68 20 7b 31 32 2e 30     mapeach {12.0
c990: 7d 20 7b 61 20 62 20 63 7d 20 7b 0d 0a 2b 20 20  } {a b c} {..+  
c9a0: 20 20 20 20 20 20 73 65 74 20 78 20 31 32 2e 30        set x 12.0
c9b0: 0d 0a 2b 20 20 20 20 20 20 20 20 73 65 74 20 78  ..+        set x
c9c0: 20 5b 65 78 70 72 20 24 78 20 2b 20 31 5d 0d 0a   [expr $x + 1]..
c9d0: 2b 20 20 20 20 7d 0d 0a 2b 7d 20 7b 31 33 2e 30  +    }..+} {13.0
c9e0: 20 31 33 2e 30 20 31 33 2e 30 7d 0d 0a 2b 0d 0a   13.0 13.0}..+..
c9f0: 2b 23 20 54 65 73 74 20 66 6f 72 20 69 6e 63 6f  +# Test for inco
ca00: 72 72 65 63 74 20 22 64 6f 75 62 6c 65 20 65 76  rrect "double ev
ca10: 61 6c 75 61 74 69 6f 6e 22 20 73 65 6d 61 6e 74  aluation" semant
ca20: 69 63 73 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61  ics..+test mapea
ca30: 63 68 2d 37 2e 33 20 7b 64 65 6c 61 79 65 64 20  ch-7.3 {delayed 
ca40: 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 66 20  substitution of 
ca50: 62 6f 64 79 7d 20 7b 0d 0a 2b 20 20 20 20 61 70  body} {..+    ap
ca60: 70 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b 20 20 20 20  ply {{} {..+    
ca70: 20 20 20 73 65 74 20 61 20 30 0d 0a 2b 20 20 20     set a 0..+   
ca80: 20 20 20 20 6d 61 70 65 61 63 68 20 61 20 5b 6c      mapeach a [l
ca90: 69 73 74 20 31 20 32 20 33 5d 20 22 0d 0a 2b 20  ist 1 2 3] "..+ 
caa0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 78 20            set x 
cab0: 24 61 0d 0a 2b 20 20 20 20 20 20 20 22 0d 0a 2b  $a..+       "..+
cac0: 20 20 20 20 20 20 20 73 65 74 20 78 0d 0a 2b 20         set x..+ 
cad0: 20 20 20 7d 7d 0d 0a 2b 7d 20 7b 30 7d 0d 0a 2b     }}..+} {0}..+
cae0: 0d 0a 2b 23 20 52 65 6c 61 74 65 64 20 74 6f 20  ..+# Related to 
caf0: 22 66 6f 72 65 61 63 68 22 20 74 65 73 74 20 66  "foreach" test f
cb00: 6f 72 20 5b 42 75 67 20 31 31 38 39 32 37 34 5d  or [Bug 1189274]
cb10: 3b 20 63 72 61 73 68 20 6f 6e 20 66 61 69 6c 75  ; crash on failu
cb20: 72 65 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63  re..+test mapeac
cb30: 68 2d 37 2e 34 20 7b 65 6d 70 74 79 20 6c 69 73  h-7.4 {empty lis
cb40: 74 20 68 61 6e 64 6c 69 6e 67 7d 20 7b 0d 0a 2b  t handling} {..+
cb50: 20 20 20 20 70 72 6f 63 20 63 72 61 73 68 20 7b      proc crash {
cb60: 7d 20 7b 0d 0a 2b 09 72 65 6e 61 6d 65 20 63 72  } {..+.rename cr
cb70: 61 73 68 20 7b 7d 0d 0a 2b 09 73 65 74 20 61 20  ash {}..+.set a 
cb80: 22 78 20 79 20 7a 22 0d 0a 2b 09 73 65 74 20 62  "x y z"..+.set b
cb90: 20 22 22 0d 0a 2b 09 6d 61 70 65 61 63 68 20 61   ""..+.mapeach a
cba0: 61 20 24 61 20 62 62 20 24 62 20 7b 20 73 65 74  a $a bb $b { set
cbb0: 20 78 20 22 61 61 20 3d 20 24 61 61 20 62 62 20   x "aa = $aa bb 
cbc0: 3d 20 24 62 62 22 20 7d 0d 0a 2b 20 20 20 20 7d  = $bb" }..+    }
cbd0: 0d 0a 2b 20 20 20 20 63 72 61 73 68 0d 0a 2b 7d  ..+    crash..+}
cbe0: 20 7b 7b 61 61 20 3d 20 78 20 62 62 20 3d 20 7d   {{aa = x bb = }
cbf0: 20 7b 61 61 20 3d 20 79 20 62 62 20 3d 20 7d 20   {aa = y bb = } 
cc00: 7b 61 61 20 3d 20 7a 20 62 62 20 3d 20 7d 7d 0d  {aa = z bb = }}.
cc10: 0a 2b 0d 0a 2b 23 20 52 65 6c 61 74 65 64 20 74  .+..+# Related t
cc20: 6f 20 5b 42 75 67 20 31 36 37 31 31 33 38 5d 3b  o [Bug 1671138];
cc30: 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20 77   infinite loop w
cc40: 69 74 68 20 65 6d 70 74 79 20 76 61 72 20 6c 69  ith empty var li
cc50: 73 74 20 69 6e 20 62 79 74 65 63 6f 6d 70 69 6c  st in bytecompil
cc60: 65 64 20 76 65 72 73 69 6f 6e 0d 0a 2b 74 65 73  ed version..+tes
cc70: 74 20 6d 61 70 65 61 63 68 2d 37 2e 35 20 7b 63  t mapeach-7.5 {c
cc80: 6f 6d 70 69 6c 65 64 20 65 6d 70 74 79 20 76 61  ompiled empty va
cc90: 72 20 6c 69 73 74 7d 20 7b 0d 0a 2b 20 20 20 20  r list} {..+    
cca0: 70 72 6f 63 20 66 6f 6f 20 7b 7d 20 7b 0d 0a 2b  proc foo {} {..+
ccb0: 09 6d 61 70 65 61 63 68 20 7b 7d 20 78 20 7b 0d  .mapeach {} x {.
ccc0: 0a 2b 09 20 20 20 20 65 72 72 6f 72 20 22 72 65  .+.    error "re
ccd0: 61 63 68 65 64 20 62 6f 64 79 22 0d 0a 2b 09 7d  ached body"..+.}
cce0: 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 20 20 20 20 6c  ..+    }..+    l
ccf0: 69 73 74 20 5b 63 61 74 63 68 20 7b 20 66 6f 6f  ist [catch { foo
cd00: 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0d 0a 2b 7d   } msg] $msg..+}
cd10: 20 7b 31 20 7b 66 6f 72 65 61 63 68 20 76 61 72   {1 {foreach var
cd20: 6c 69 73 74 20 69 73 20 65 6d 70 74 79 7d 7d 0d  list is empty}}.
cd30: 0a 2b 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63  .+..+test mapeac
cd40: 68 2d 37 2e 36 20 7b 6d 61 70 65 61 63 68 3a 20  h-7.6 {mapeach: 
cd50: 72 65 6c 61 74 65 64 20 74 6f 20 22 66 6f 72 65  related to "fore
cd60: 61 63 68 22 20 5b 42 75 67 20 31 36 37 31 30 38  ach" [Bug 167108
cd70: 37 5d 7d 20 2d 73 65 74 75 70 20 7b 0d 0a 2b 20  7]} -setup {..+ 
cd80: 20 20 20 70 72 6f 63 20 64 65 6d 6f 20 7b 7d 20     proc demo {} 
cd90: 7b 0d 0a 2b 09 73 65 74 20 76 61 6c 73 20 7b 31  {..+.set vals {1
cda0: 20 32 20 33 20 34 7d 0d 0a 2b 09 74 72 61 63 65   2 3 4}..+.trace
cdb0: 20 61 64 64 20 76 61 72 69 61 62 6c 65 20 78 20   add variable x 
cdc0: 77 72 69 74 65 20 7b 73 74 72 69 6e 67 20 6c 65  write {string le
cdd0: 6e 67 74 68 20 24 76 61 6c 73 20 3b 23 20 7d 0d  ngth $vals ;# }.
cde0: 0a 2b 09 6d 61 70 65 61 63 68 20 7b 78 20 79 7d  .+.mapeach {x y}
cdf0: 20 24 76 61 6c 73 20 7b 66 6f 72 6d 61 74 20 24   $vals {format $
ce00: 79 7d 0d 0a 2b 20 20 20 20 7d 0d 0a 2b 7d 20 2d  y}..+    }..+} -
ce10: 62 6f 64 79 20 7b 0d 0a 2b 20 20 20 20 64 65 6d  body {..+    dem
ce20: 6f 0d 0a 2b 7d 20 2d 63 6c 65 61 6e 75 70 20 7b  o..+} -cleanup {
ce30: 0d 0a 2b 20 20 20 20 72 65 6e 61 6d 65 20 64 65  ..+    rename de
ce40: 6d 6f 20 7b 7d 0d 0a 2b 7d 20 2d 72 65 73 75 6c  mo {}..+} -resul
ce50: 74 20 7b 32 20 34 7d 0d 0a 2b 0d 0a 2b 23 20 48  t {2 4}..+..+# H
ce60: 75 67 65 20 6c 69 73 74 73 20 6d 75 73 74 20 6e  uge lists must n
ce70: 6f 74 20 6f 76 65 72 66 6c 6f 77 20 74 68 65 20  ot overflow the 
ce80: 62 79 74 65 63 6f 64 65 20 69 6e 74 65 72 70 72  bytecode interpr
ce90: 65 74 65 72 20 28 64 65 76 65 6c 6f 70 6d 65 6e  eter (developmen
cea0: 74 20 62 75 67 29 0d 0a 2b 74 65 73 74 20 6d 61  t bug)..+test ma
ceb0: 70 65 61 63 68 2d 37 2e 37 20 7b 68 75 67 65 20  peach-7.7 {huge 
cec0: 6c 69 73 74 20 6e 6f 6e 2d 63 6f 6d 70 69 6c 65  list non-compile
ced0: 64 7d 20 7b 0d 0a 2b 20 20 73 65 74 20 78 20 5b  d} {..+  set x [
cee0: 6d 61 70 65 61 63 68 20 61 20 5b 6c 72 65 70 65  mapeach a [lrepe
cef0: 61 74 20 31 30 30 30 30 30 30 20 78 5d 20 7b 20  at 1000000 x] { 
cf00: 73 65 74 20 62 20 79 24 61 20 7d 5d 0d 0a 2b 20  set b y$a }]..+ 
cf10: 20 6c 69 73 74 20 24 62 20 5b 6c 6c 65 6e 67 74   list $b [llengt
cf20: 68 20 24 78 5d 20 5b 73 74 72 69 6e 67 20 6c 65  h $x] [string le
cf30: 6e 67 74 68 20 24 78 5d 0d 0a 2b 7d 20 7b 79 78  ngth $x]..+} {yx
cf40: 20 31 30 30 30 30 30 30 20 32 39 39 39 39 39 39   1000000 2999999
cf50: 7d 0d 0a 2b 0d 0a 2b 74 65 73 74 20 6d 61 70 65  }..+..+test mape
cf60: 61 63 68 2d 37 2e 38 20 7b 68 75 67 65 20 6c 69  ach-7.8 {huge li
cf70: 73 74 20 63 6f 6d 70 69 6c 65 64 7d 20 7b 0d 0a  st compiled} {..
cf80: 2b 20 20 73 65 74 20 78 20 5b 61 70 70 6c 79 20  +  set x [apply 
cf90: 7b 7b 74 69 6d 65 73 7d 20 7b 20 6d 61 70 65 61  {{times} { mapea
cfa0: 63 68 20 61 20 5b 6c 72 65 70 65 61 74 20 24 74  ch a [lrepeat $t
cfb0: 69 6d 65 73 20 78 5d 20 7b 20 73 65 74 20 62 20  imes x] { set b 
cfc0: 79 24 61 20 7d 7d 7d 20 31 30 30 30 30 30 30 5d  y$a }}} 1000000]
cfd0: 0d 0a 2b 20 20 6c 69 73 74 20 24 62 20 5b 6c 6c  ..+  list $b [ll
cfe0: 65 6e 67 74 68 20 24 78 5d 20 5b 73 74 72 69 6e  ength $x] [strin
cff0: 67 20 6c 65 6e 67 74 68 20 24 78 5d 0d 0a 2b 7d  g length $x]..+}
d000: 20 7b 79 78 20 31 30 30 30 30 30 30 20 32 39 39   {yx 1000000 299
d010: 39 39 39 39 7d 0d 0a 2b 0d 0a 2b 0d 0a 2b 23 20  9999}..+..+..+# 
d020: 2d 2d 2d 2d 2d 20 43 6f 72 6f 75 74 69 6e 65 73  ----- Coroutines
d030: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
d040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a  --------------..
d070: 2b 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68  +..+test mapeach
d080: 2d 38 2e 31 20 7b 6d 61 70 65 61 63 68 20 6e 6f  -8.1 {mapeach no
d090: 6e 2d 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  n-compiled with 
d0a0: 63 6f 72 6f 75 74 69 6e 65 73 7d 20 7b 0d 0a 2b  coroutines} {..+
d0b0: 20 20 63 6f 72 6f 75 74 69 6e 65 20 63 6f 72 6f    coroutine coro
d0c0: 20 61 70 70 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b 20   apply {{} {..+ 
d0d0: 20 20 20 73 65 74 20 76 61 6c 75 65 73 20 5b 79     set values [y
d0e0: 69 65 6c 64 20 5b 69 6e 66 6f 20 63 6f 72 6f 75  ield [info corou
d0f0: 74 69 6e 65 5d 5d 0d 0a 2b 20 20 20 20 65 76 61  tine]]..+    eva
d100: 6c 20 6d 61 70 65 61 63 68 20 69 20 5b 6c 69 73  l mapeach i [lis
d110: 74 20 24 76 61 6c 75 65 73 5d 20 7b 7b 20 79 69  t $values] {{ yi
d120: 65 6c 64 20 24 69 20 7d 7d 0d 0a 2b 20 20 7d 7d  eld $i }}..+  }}
d130: 20 3b 23 20 72 65 74 75 72 6e 73 20 27 63 6f 72   ;# returns 'cor
d140: 6f 27 0d 0a 2b 20 20 63 6f 72 6f 20 7b 61 20 62  o'..+  coro {a b
d150: 20 63 20 64 20 65 20 66 7d 20 3b 23 20 2d 3e 20   c d e f} ;# -> 
d160: 61 0d 0a 2b 20 20 63 6f 72 6f 20 31 20 3b 23 20  a..+  coro 1 ;# 
d170: 2d 3e 20 62 0d 0a 2b 20 20 63 6f 72 6f 20 32 20  -> b..+  coro 2 
d180: 3b 23 20 2d 3e 20 63 0d 0a 2b 20 20 63 6f 72 6f  ;# -> c..+  coro
d190: 20 33 20 3b 23 20 2d 3e 20 64 0d 0a 2b 20 20 63   3 ;# -> d..+  c
d1a0: 6f 72 6f 20 34 20 3b 23 20 2d 3e 20 65 0d 0a 2b  oro 4 ;# -> e..+
d1b0: 20 20 63 6f 72 6f 20 35 20 3b 23 20 2d 3e 20 66    coro 5 ;# -> f
d1c0: 0d 0a 2b 20 20 6c 69 73 74 20 5b 63 6f 72 6f 20  ..+  list [coro 
d1d0: 36 5d 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  6] [info command
d1e0: 73 20 63 6f 72 6f 5d 0d 0a 2b 7d 20 7b 7b 31 20  s coro]..+} {{1 
d1f0: 32 20 33 20 34 20 35 20 36 7d 20 7b 7d 7d 0d 0a  2 3 4 5 6} {}}..
d200: 2b 0d 0a 2b 74 65 73 74 20 6d 61 70 65 61 63 68  +..+test mapeach
d210: 2d 38 2e 32 20 7b 6d 61 70 65 61 63 68 20 63 6f  -8.2 {mapeach co
d220: 6d 70 69 6c 65 64 20 77 69 74 68 20 63 6f 72 6f  mpiled with coro
d230: 75 74 69 6e 65 73 7d 20 7b 0d 0a 2b 20 20 63 6f  utines} {..+  co
d240: 72 6f 75 74 69 6e 65 20 63 6f 72 6f 20 61 70 70  routine coro app
d250: 6c 79 20 7b 7b 7d 20 7b 0d 0a 2b 20 20 20 20 73  ly {{} {..+    s
d260: 65 74 20 76 61 6c 75 65 73 20 5b 79 69 65 6c 64  et values [yield
d270: 20 5b 69 6e 66 6f 20 63 6f 72 6f 75 74 69 6e 65   [info coroutine
d280: 5d 5d 0d 0a 2b 20 20 20 20 6d 61 70 65 61 63 68  ]]..+    mapeach
d290: 20 69 20 24 76 61 6c 75 65 73 20 7b 20 79 69 65   i $values { yie
d2a0: 6c 64 20 24 69 20 7d 0d 0a 2b 20 20 7d 7d 20 3b  ld $i }..+  }} ;
d2b0: 23 20 72 65 74 75 72 6e 73 20 27 63 6f 72 6f 27  # returns 'coro'
d2c0: 0d 0a 2b 20 20 63 6f 72 6f 20 7b 61 20 62 20 63  ..+  coro {a b c
d2d0: 20 64 20 65 20 66 7d 20 3b 23 20 2d 3e 20 61 0d   d e f} ;# -> a.
d2e0: 0a 2b 20 20 63 6f 72 6f 20 31 20 3b 23 20 2d 3e  .+  coro 1 ;# ->
d2f0: 20 62 0d 0a 2b 20 20 63 6f 72 6f 20 32 20 3b 23   b..+  coro 2 ;#
d300: 20 2d 3e 20 63 0d 0a 2b 20 20 63 6f 72 6f 20 33   -> c..+  coro 3
d310: 20 3b 23 20 2d 3e 20 64 0d 0a 2b 20 20 63 6f 72   ;# -> d..+  cor
d320: 6f 20 34 20 3b 23 20 2d 3e 20 65 0d 0a 2b 20 20  o 4 ;# -> e..+  
d330: 63 6f 72 6f 20 35 20 3b 23 20 2d 3e 20 66 0d 0a  coro 5 ;# -> f..
d340: 2b 20 20 6c 69 73 74 20 5b 63 6f 72 6f 20 36 5d  +  list [coro 6]
d350: 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
d360: 63 6f 72 6f 5d 0d 0a 2b 7d 20 7b 7b 31 20 32 20  coro]..+} {{1 2 
d370: 33 20 34 20 35 20 36 7d 20 7b 7d 7d 0d 0a 2b 0d  3 4 5 6} {}}..+.
d380: 0a 2b 0d 0a 2b 23 20 63 6c 65 61 6e 75 70 0d 0a  .+..+# cleanup..
d390: 2b 63 61 74 63 68 20 7b 75 6e 73 65 74 20 61 7d  +catch {unset a}
d3a0: 0d 0a 2b 63 61 74 63 68 20 7b 75 6e 73 65 74 20  ..+catch {unset 
d3b0: 78 7d 0d 0a 2b 63 61 74 63 68 20 7b 72 65 6e 61  x}..+catch {rena
d3c0: 6d 65 20 66 6f 6f 20 7b 7d 7d 0d 0a 2b 3a 3a 74  me foo {}}..+::t
d3d0: 63 6c 74 65 73 74 3a 3a 63 6c 65 61 6e 75 70 54  cltest::cleanupT
d3e0: 65 73 74 73 0d 0a 2b 72 65 74 75 72 6e 0d 0a 0d  ests..+return...
d3f0: 0a                                               .