THIS PAGE IS OBSOLETE! |
---|
It documents a proposal that was ultimately not adopted by the TCT. Modern Tcl code should use the expansion syntax {*}… instead. |
First of all, the patch for this is available from:http://sourceforge.net/tracker/index.php?func=detail&aid=684534&group_id=10894&atid=310894lconvert command, expands lists inline...This patch adds a new command called lconvert and a new Tcl_ObjType called "plist". A "plist" or "parameter list" is identical to a list with the LARGE exception that when a "plist" is used in ANY command, it is expanded to as many "real arguments" as it has list elements.The syntax of the lconvert command is as follows:
- lconvert varName ?type?
This does not work as some people would expect. And to those uninitiated in the Zen Mastery of Tcl, it's non-obvious how to fix it:
% set x [list 1 2 3 4] 1 2 3 4 % file join $x 1 2 3 4Now, let's try with lconvert:
% set x [list 1 2 3 4] 1 2 3 4 % lconvert x plist 1 2 3 4 % file join $x 1/2/3/4Normally, file join takes a variable number of arguments and joins them together with a path separator. In this case, we only passed one real argument (a "plist") and it was expanded automatically to four "real arguments". This can also be accomplished with eval, although that is not as safe.This is the current "solution" to this situation (use eval):
% set x [list 1 2 3 4] 1 2 3 4 % eval file join $x 1/2/3/4REVISION HISTORY
JJM 2003/02/11 -- initial version 1.
MS remarks that this approach does change Tcl's syntax rules, and in particular voids rule 11 in the Endekalogue. If the meaning is to also allow its usage as
file join [lconvert $x]as I surmise, it does so by having [lconvert $x] return more than one word (in the sense of the syntax rules), which violates rule 6.Let me also remark that if the method requires a new type of Tcl_Obj, then it most certainly violates some rule in the Endekalogue, i.e., introduces new syntax. Tcl_Obj's are an implementation detail, but do not appear in Tcl's syntax by design. Except for optimisation issues, the script writer can be completely oblivious to their existence. The short version: everything is a string. Tcl's words are like black holes, they have no hair ...RS 2008-10-06: Isn't this made obsolete, by 8.5 and a new syntax rule, in that the now built-in
file join {*}$xserves the same purpose?