【发布时间】:2013-06-02 02:43:41
【问题描述】:
我正在查看一个使用 parsley 解析其语法的 clojure 重构库。 我将 parsley 升级到 0.9.1,然后一个功能失败了。
这是该函数的作用:
假设我们有"(defn a [b] (:foo b))",重构工具将解析参数并映射查找:[b] 和(:foo b)。然后将(:foo b) 转换为地图:{b (foo :foo)} 并将[b] 中的符号b 替换为地图的值(foo :foo)。我终于应该得到{(foo :foo)}。
以下代码用于最后一步:
clojure.walk/postwalk-replace {#net.cgrand.parsley.Node{:tag :atom, :content ["b"]} #net.cgrand.parsley.Node{:tag :map, :content ["{" #net.cgrand.parsley.Node{:tag :atom, :content ["foo"]} #net.cgrand.parsley.Node{:tag :whitespace, :content [" "]} #net.cgrand.parsley.Node{:tag :atom, :content [":foo"]} #net.cgrand.parsley.Node{:tag :whitespace, :content [" "]} "}"]}}
#net.cgrand.parsley.Node{:tag :vector, :content ["[" #net.cgrand.parsley.Node{:tag :atom, :content ["b"]} "]"]}
它报告:`UnsupportedOperationException Can't create empty: net.cgrand.parsley.Node net.cgrand.parsley.Node (parsley.clj:19)
但是,当我 pprint {#net.cgrand.parsley.Node{:tag :atom, :content ["b"]} #net.cgrand.parsley.Node{:tag :map, :content ["{" #net.cgrand.parsley.Node{:tag :atom, :content ["foo"]} #net.cgrand.parsley.Node{:tag :whitespace, :content [" "]} #net.cgrand.parsley.Node{:tag :atom, :content [":foo"]} #net.cgrand.parsley.Node{:tag :whitespace, :content [" "]} "}"]}}
和
#net.cgrand.parsley.Node{:tag :vector, :content ["[" #net.cgrand.parsley.Node{:tag :atom, :content ["b"]} "]"]}
然后将它们传递给 postwalk:
(clojure.walk/postwalk-replace {{:tag :atom, :content ["b"]}
{:tag :map,
:content
["{"
{:tag :atom, :content ["foo"]}
{:tag :whitespace, :content [" "]}
{:tag :atom, :content [":foo"]}
{:tag :whitespace, :content [" "]}
"}"]}}
{:tag :vector, :content ["[" {:tag :atom, :content ["b"]} "]"]})
一切都很好,我得到了我想要的{:content
["["
{:content
["{"
{:content ["foo"], :tag :atom}
{:content [" "], :tag :whitespace}
{:content [":foo"], :tag :atom}
{:content [" "], :tag :whitespace}
"}"],
:tag :map}
"]"],
:tag :vector}
我的问题是:#net.cgrand.parsley.Node 在欧芹中是什么意思?为什么在我删除这些符号(使用 pprint)之后问题就消失了。
【问题讨论】:
标签: parsing xml-parsing clojure