TCL蜷缩在一起

时间:2013-11-28 16:11:40

标签: tcl

如何构建一个混乱结构,以一种挤出条带生成{a {b}} {c {d}}的方式?

例如

#create as a dict
% set bb [huddle create a b c d]
HUDDLE {D {a {s b} c {s d}}}

#create as a list
% set cc [huddle list e f g h]
HUDDLE {L {{s e} {s f} {s g} {s h}}}

% set bbcc [huddle create bb $bb cc $cc]
HUDDLE {D {bb {D {a {s b} c {s d}}} cc {L {{s e} {s f} {s g} {s h}}}}}

% set folding [huddle list $bbcc p [huddle list q r] s]
HUDDLE {L {{D {bb {D {a {s b} c {s d}}} cc {L {{s e} {s f} {s g} {s h}}}}} {s p} {L {{s q} {s r}}} {s s}}}

#normal Tcl's notation
% huddle strip $folding
{bb {a b c d} cc {e f g h}} p {q r} s

(见http://tcllib.sourceforge.net/doc/huddle.html

2 个答案:

答案 0 :(得分:1)

Huddle是一种使用结构注释编码Tcl值的方法;它在概念上类似于JSON和YAML,但细节不同。

您面临的主要问题是a {b}不是规范列表或字典(尽管它确实是有效列表和有效的字典)。也就是说,你永远不会从listdict create(或任何其他结构化值合成命令)得到它。要获得它,你必须更直接地创造价值:

set val [format "%s {%s}" a b]

获得该值后,将其放入Huddle列表中就可以很好地封装它:

set hud [huddle list [format "%s {%s}" a b] [format "%s {%s}" c d]]

然后你可以剥离它以获得你想要的值:

puts [huddle strip $hud]
#==> {a {b}} {c {d}}

高级建筑

当你不“需要”它们时强制添加大括号 是非常棘手的,如果你想让Tcl做正确的事情。最简单的(原始)机制是:

if {[list $val] eq $val} {format "{%s}" $val} {list $val}

你需要这样做,因为否则你会彻底错误的不是裸字的值。 (如果你的值中有不平衡的大括号,则尤其如此;在这种情况下,由于添加了反斜杠,结果是丑陋,但它们有效。)

然后,我们可以构建要在Huddle中使用的值,如下所示:

proc braceitem val {
    if {[list $val] eq $val} {format "{%s}" $val} {list $val}
}
set val [concat [list a] [braceitem b]]

大多数Tcl程序员都不这样做。这是很多工作,代码更冗长。它比仅使用list(或dict create)并接受默认使用的格式更容易出错。

答案 1 :(得分:0)

使用huddle wrap TYPE VALUE:)

% set abcd {{a {b}} {c {d}}}
{a {b}} {c {d}}
% set hud [huddle wrap s $abcd]
HUDDLE {s {{a {b}} {c {d}}}}
% huddle strip $hud
{a {b}} {c {d}}

huddle wrap是一个API,可生成由TAG专门标记的标记值(例如'' L'或' D' ;