我正在查看一个使用parsley解析其语法的 clojure 重构库。我将欧芹升级到 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 无法创建空: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)之后问题就消失了。