如何构建一个混乱结构,以一种挤出条带生成{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
答案 0 :(得分:1)
Huddle是一种使用结构注释编码Tcl值的方法;它在概念上类似于JSON和YAML,但细节不同。
您面临的主要问题是a {b}
不是规范列表或字典(尽管它确实是有效列表和有效的字典)。也就是说,你永远不会从list
或dict 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' ; 强>)