gpt4 book ai didi

clojure - Om Next 的 query->ast 和 ast->query 函数

转载 作者:行者123 更新时间:2023-12-04 14:10:34 26 4
gpt4 key购买 nike

根据 Om Next's documentation :

query->ast

(om.next/query->ast '[(:foo {:bar 1})])

Given a query expression return the AST.

ast->query

(om.next/ast->query ast)

Given a query expression AST, unparse it into a query expression.


问题:为什么需要这些功能?也就是说,为什么需要直接在 om 中操作查询抽象语法树(我假设它是代表查询树的 clojure 映射以及一些元数据)?

最佳答案

在某些情况下,您需要直接操作查询 ast。在远程解析模式下,解析器希望您的读取函数返回 {:remote-name true } 或(可能已修改){:remote-name AST-node}(在 env 中作为 :ast 出现)。大多数情况下,您必须修改 AST 以重构它或添加一些数据。

示例 1:
您有疑问:[{:widget {:list [:name :created]}}]:widget部分是纯 UI 相关的,您的服务器不需要知道它的存在,它只关心/知道 :list .
基本上你必须在解析器中修改 AST:

(defmethod read :list
[{:keys [ast query state]} key _ ]
(let [st @state]
{:value (om/db->tree query (get st key) st)
:remote (assoc ast :query-root true)}))

如果您使用 om/process-roots在您的发送函数中,它会接收 :query-root退出 ast 并重写来自 [{:widget {:list [:name :created]}}] 的查询至 [{:list [:name :created]}] .

示例 2:
另一个例子是当你想在远程改变某些东西时:
(defmethod mutate 'item/update
[{:keys [state ast]} key {:keys [id title]}]
{:remote (assoc ast :params {:data {:id id :title title })})

这里需要明确告诉 Om 将要发送的数据包含在 AST 中。然后在您的 Remote 上拆开 :data更新给定 id 的标题

大多数情况下,您不会直接使用您在问题中描述的功能。 env在解析器的每个方法中可用的都有 ast在里面。

关于clojure - Om Next 的 query->ast 和 ast->query 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35675766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com