Próbuję pobrać dane z mapy przy użyciu Clojure core.logic. Ten kod działa jak chcę go do:Wyodrębnianie elementów mapy z 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"])
Jednakże jeśli dodać kilka innych elementów do mapy to nie pasuje:
(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}
])))
rozumiem dlaczego matcho
nie działa jak mapach nie już tak samo. Moje pytanie brzmi: jak mogę to zmienić, aby działało ponownie? Jak mogę go dopasować tylko do niektórych kluczy na mapie lub w jaki sposób mogę go dopasować do dowolnych losowych kluczy, jakie może posiadać mapa?
EDIT:
Dostałem go do pracy przy użyciu patial-map
(dzięki 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}
])))
Jednak znalazłem notatkę że featurec
powinien być używany zamiast partial-map
. Moje nowe pytanie: jak to zmienić, aby używać featurec
?
Dodałem treść kodu testowego, którego używałem: https://gist.github.com/4454548 –