jcw 2011-01-30
Here is a utility function which makes it possible to replace this type of multi-line construct:
set value [list \ abc $myvar {$1 per day} \ def [bleep "x y z"] ghi \ "some text with expansion of $var and [my code] inside" \ ]
with:
set value [larg { # this is an example abc $myvar {$1 per day} def [bleep "x y z"] ghi # comments lines starting with # will be stripped "some text with expansion of $var and [my code] inside" }]
It avoids having to escape each newline, and allows command-like comments inside.
Other uses:
foreach x [larg { ... }] { ... } dict merge $dict [larg { ... }] myproc arg1 arg2 {*}[larg { ... }]
The definition of larg is:
proc ::larg list { # Returns list, with each list item evaluated and comment lines removed. regsub -line -all {^\s*#.*$} $list {} list ;# same as Ju unComment # The trick is to allow newlines between list items, but this only works # when embedded newlines in any of the arguments are replaced with \n's. uplevel "list [string map {\n { }} $list]" }
aspect 2014-07-05: Scripted List presents a very similar idea.
PYK 2016-02-11: ::larg doesn't properly parse all Tcl scripts. For example, A a # after a newline in braces or quotes would throw it off. Scripted List presents a correct approach to this task.