如何创建PersistentArrayMap防止评估?

问题描述 投票:0回答:1

我的问题很简单,但同时又很奇怪,我想创建一个PersistentArrayMap避免同时求值,而我想在其中获取值。最好的解决方案是什么?我的意思是

想象一下我有这个定义:

(def queen "catherine the great")

并且想做这样的事情:

'{:queen queen}

确定输出是=> {:queen queen}

但是我希望做这样的事情=> {:queen "catherine the great"}

我知道我可以做到

(array-map :queen queen)

但是,在我的情况下,我只想评估一些信息,因为我的地图更加复杂,例如自动查询:

'{:find  [(pull $ ?c [*])]
    :with  []
    :in    [$ ?queen-name]
    :where [
            [$ ?c :queen/name ?queen-name]
            ]
    :args [queen-name]} 

在这种情况下,我只想评估女王的名字。

我的问题是,有一种简单的方法吗?也许使用更新?

这样的东西?

(update '{:find  [(pull $ ?c [*])]
          :with  []
          :in    [$ ?queen-name]
          :where [
                  [$ ?c :queen/name ?queen-name]
                  ]
          :args []} :args ["catherine the great"])
replace clojure datomic
1个回答
1
投票

对于两个示例,您都可以使用syntax-quote and unquote

user=> (def queen-name "catherine the great")
#'user/queen-name
user=> `{:queen ~queen-name}
{:queen "catherine the great"}
user> `{:find  [(pull $ ?c [*])]
    :with  []
    :in    [$ ?queen-name]
    :where [
            [$ ?c :queen/name ?queen-name]
            ]
    :args [~queen-name]}
{:args ["catherine the great"],
 :find [(user/pull user/$ user/?c [clojure.core/*])],
 :where [[user/$ user/?c :queen/name user/?queen-name]],
 :with [],
 :in [user/$ user/?queen-name]} 
© www.soinside.com 2019 - 2024. All rights reserved.