Je travaille avec datomic.api de clojure. Je souhaite refactoriser une requête datalog quelque peu complexe comme ceci:Définition de composants de requête datalog en dehors de (datomic.api/q '[])
(datomic.api/q '[:find [?value ...] :in $ ?uid ?component :where
[...some clause...]
[...some other clause...]
(or-join [?entitlement ?component]
(and [...some conditional stuff...])
(and [...some other conditional stuff...]))]
db uid component)
... en quelque chose de plus lisible. Mon souhait est de lier localement les composants (and...)
de la requête à l'intérieur d'un let
et de s'y référer par un nom à l'intérieur de la liste des données. Comme si:
(datomic.api/q '[:find [?value ...] :in $ ?uid ?component :where
[...some clause...]
[...some other clause...]
(or-join [?entitlement ?component]
entitled-for-component
entitled-for-application)]
db uid component)
Divers citant dans let
(et unquoting à l'intérieur de la liste datomic.api/q) n'ont pas travaillé. Aucune suggestion?
Oui. L'approche de type citant/désapproprie fonctionne si vous utilisez des guillemets de syntaxe, mais vous finirez avec des éléments comme * et * remplacés par des symboles qualifiés d'espace de noms, ce qui va le casser de façon différente. Votre réponse ci-dessous est la façon de s'y prendre. –
J'aime la réponse ci-dessous, pour utiliser les règles. Pour quasiquote dans Clojure comme vous le feriez dans d'autres lisps, essayez le formulaire 'template' dans [backtick] (https://github.com/brandonbloom/backtick). –