好吧,所以我总结出来
- `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 的 datafy 实现方式,我们可以假设我们得到以下结果
{: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)
概述页面作为coll(将概述页面数据化)
概述页面)
这是正确的吗?或者你应该实际上从`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)]
概述页面)
谢谢!