Sto cercando di estrarre i dati da una mappa utilizzando Clojure core.logic. Questo codice fa come voglio che:Estrazione di elementi di una mappa da Clojure core.logic
(run 10 [q]
(fresh [?id ?type ?name]
(membero ?type [:t2 :t1])
(== q [?id ?name])
(membero {:id ?id :type ?type :name ?name}
[
{:id 1 :type :t1 :name "one"}
{:id 2 :type :t2 :name "two"}
])))
=> ([2 "two"] [1 "one"])
Tuttavia, se aggiungo alcuni altri elementi alla mappa poi non riesce a corrispondere:
(run 10 [q]
(fresh [?id ?type ?name]
(membero ?type [:t2 :t1])
(== q [?id ?name])
(membero {:id ?id :type ?type :name ?name}
[
{:id 1 :type :t1 :name "one" :other1 :o1}
{:id 2 :type :t2 :name "two" :other2 :o2}
])))
capisco perché matcho
non funziona come le mappe non più lungo lo stesso. Il mio quesiton è, come posso cambiare questo in modo che funzioni di nuovo? Come faccio a farlo corrispondere solo su alcuni dei tasti di una mappa o come posso farlo per abbinare qualsiasi chiave casuale che una mappa può avere?
EDIT:
ho preso a lavorare con patial-map
(grazie a https://github.com/clojure/core.logic/pull/10)
(run 10 [q]
(fresh [?id ?type ?name]
(membero ?type [:t2 :t1])
(== q [?id ?name])
(membero (partial-map {:id ?id :type ?type :name ?name})
[
{:id 1 :type :t1 :name "one" :other1 :o2}
{:id 2 :type :t2 :name "two" :other2 :o1}
])))
Tuttavia ho trovato una nota che featurec
dovrebbe essere usato al posto di partial-map
. La mia nuova domanda: come cambiarlo per usare featurec
?
Ho aggiunto un Gist del codice di prova che stavo usando: https://gist.github.com/4454548 –