那么,我总结一下:
- “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集合。并且我们使用正常的Clojure集合函数对其进行了深入挖掘。当我们达到另一个可导航值时,我们调用nav来获取下一页。
我只有一点不太明白。如果你看到我的例子,我假设nav返回一个数据化的结果。但Sean说它不应该这样。但这在我的例子中甚至都不合理。我从URL开始。我可以导航到那个URL以获取页面,但没有“coll”上下文。并且我可以让nav返回非数据化的东西,但我没有这样的东西,仅因其奇 modulus而编造一个似乎很奇怪。
所以我这里假设nav可以返回数据或可数据化的东西,这并不重要。并且假设无论如何都会调用datafy,如果它已经是数据,datafy将仅返回数据,因为这是Map的默认实现。
所以你会继续这样做
(let [url (as-url "
https://clojure.org")
clojure-page-as-coll (datafy url)
overview-url (get-in coll [:links :overview])
概览页面(nav clojure-page-as-coll [:links :概览] overview-url)
概览页面-as-coll(datafy 概览页面)
概览页面)
这是正确的吗?还是你应该实际从 `nav` 开始?或者可能我的例子不好,因为在这种情况下,
(let [clojure-page (nav nil nil (as-url "
https://clojure.org")))
overview-url (get-in clojure-page [:links :概览])
概览页面 (nav clojure-page [:links :概览] overview-url)]
概览页面)
感谢!