我正在使用Ripper sexp表达式,它看起来像这样:
[:program,
[[:class,
[:const_ref, [:@const, "A", [1, 6]]],
nil,
[:bodystmt,
[[:class,
[:const_ref, [:@const, "B", [1, 15]]],
nil,
[:bodystmt,
[[:def,
[:@ident, "test", [1, 22]],
[:params, nil, nil, nil, nil, nil],
[:bodystmt, [[:void_stmt]], nil, nil, nil]]],
nil,
nil,
nil]]],
nil,
nil,
nil]]]]
我正在使用数组作为获取sexp表达式元素的路径。例如
path = [1,0,1,1] => sexp[1][0][1][1]
会得到我
[:@const, "A", [1, 6]]
通过这条路径,我可以获得下一个,前一个,父元素等等。
但我想知道是否有更适合这类任务的数据结构?
答案 0 :(得分:2)
除了明显的树木,您可能还想看拉链:
http://en.wikipedia.org/wiki/Zipper_(data_structure)
最近有人为Clojure实现了form-zip,如果你想看一个例子: