Clojure:地图列表的地图...如何纠缠任何匿名数据结构

jay*_*100 1 defensive-programming clojure

大家好:在java中,我们都有使用我们的ide来"遍历"复杂数据类型深度的经验:

dog.getCollar().getCollarTag().getName(); 
Run Code Online (Sandbox Code Playgroud)

然而,在Clojure中,由于缺乏静态类型,这变得非常简单.我们如何"防御"或反对可能从嵌套数据结构到达的复杂性?

1)对clojure数据结构深度的可取"限制"?

2)处理非常深层嵌套的数据结构的常用习惯用法,它可以防止诸如将列表误认为映射之类的错误,或者无法正确地降低/大写变量名称?

请原谅我,如果我在这里听起来有点偏离范例......可能是这样的错误通过在REPL中不断测试而得到有效抑制.但是,我想知道是否还有其他方法可以确保,在编译时,代码尽可能正确(即单元测试,IDE/emacs插件等......)

Art*_*ldt 6

关键字是你的朋友

(def my-animals  { :dog {:collar {:tag {:name "fido"}}}})
Run Code Online (Sandbox Code Playgroud)

试着坚持使用地图,因为它们更具有自我描述性.
然后先使用线程和..macroes

(-> my-animals :dog :collar :tag :name)
Run Code Online (Sandbox Code Playgroud)

并利用关键字也是在地图中看起来自己的功能这一事实.

当您在具有代码完成功能的IDE中工作时,它会解析代码,然后构建有关该代码的数据,然后解析该数据以生成它的建议.如果你的数据是自我声明的(它可以是"读取"),那么即使没有IDE,你也可以得到它.

ps:这导致关于"代码就是数据"的标准咆哮已经被比我更聪明的人多次表达过了:)