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 .