好吧,那么我总结一下
- `v` 是我们要导航到的位置。
- `coll` 是通过调用 `datafy` 得到的结果。
- `v` 应该包含在 `coll` 中,可以通过 `k` 获取。
因此,一个使用场景会是
(let [coll (datafy some-obj)
k :next-thing
v (get coll k)]
(nav coll k v))
这将返回另一个事物(即任意可数据化的对象),这是通过导航到 `v` 获取的。
在这个意义上,`v` 应该是一个超链接,它实际上不是一个集合,这就是为什么我们要导航到超链接指向的地方,从而返回另一个事物,我们可以在以后也将其数据化,并且可以进一步导航。
因此,一个完整的例子可能是
(let [url (as-url "
https://clojure.org")
clojure-page-as-coll (datafy url) ...
在这个阶段,根据URL的数据化实现,我们可以假设我们得到了以下结果
{:content
:links {:get-started (as-url "
https://clojure.org/guides/getting_started")
:overview (as-url "
https://clojure.org/about/rationale")
...}
...}
因此,如果我们想导航到 [:links :overview],我们会做
(let [url (as-url "
https://clojure.org")
clojure-page-as-coll (datafy url)
overview-url (get-in coll [:links :overview])
overview-page (nav clojure-page-as-coll [:links :overview] overview-url) ...
所以在这点上,我们已将URL作为Clojure coll数据化。并且使用正常的Clojure集合函数对其进行深入挖掘。当我们达到另一个可导航值时,我们调用 nav 来获取下一个页面。
我有点困惑的是,如果你看我的例子,我假设 nav 返回一个数据化的结果。但Sean提到它不应该这样做。但这在我的例子中也不合理。我从URL开始,我可以导航到这个URL以获取页面,但没有 `coll` 环境。我本可以 nav 返回一些不是已经数据化的东西,但我没有这样的东西,仅仅是凭空捏造一个看起来也很奇怪。
所以这里我假设 `nav` 可以返回数据或者可数据化的事物,这并不重要。并且假设无论如何都会对它调用 `datafy`,但如果它已经是数据,`datafy` 就会直接返回数据,因为这是 Map 的默认实现。
所以你会继续这样做
(let [url (as-url "
https://clojure.org")
clojure-page-as-coll (datafy url)
overview-url (get-in coll [:links :overview])
overview-page (nav clojure-page-as-coll [:links :overview] overview-url)
overview-page-as-coll (datafy overview-page)]
overview-page)
这是正确的吗?或者你应该实际上从 `nav` 开始?也许我的例子不好,因为在这种情况下,`datafy` 看起来是多余的,因为可以简单地做
(let [clojure-page (nav nil nil (as-url "
https://clojure.org"))
overview-url (get-in clojure-page [:links :overview])
overview-page (nav clojure-page [:links :overview] overview-url)]
overview-page)
谢谢!