Проблемы с построением правил Clara динамически с помощью instaparse
Я последовал этому примеру Insta Declarative DSL, где мы используем Clara с instaparse для использования DSL и генерации правил.
у меня все работает как положено, но одна проблема. Я не могу получить доступ к привязке переменной из условия, выраженного в lhs, и использовать его в rhs. Например, вот фрагмент кода из приведенного выше примера.
(def shopping-transforms
{:NUMBER #(Integer/parseInt %)
:OPERATOR operators
:FACTTYPE fact-types
:CONDITION (fn [fact-type field operator value]
{:type fact-type
:constraints [(list operator (symbol field) value)]})
;; Convert promotion strings to keywords.
:PROMOTIONTYPE keyword
:DISCOUNT (fn [name percent & conditions]
{:name name
:lhs conditions
:rhs `(insert! (->Discount ~name ~percent))})
:PROMOTION (fn [name promotion-type & conditions]
{:name name
:lhs conditions
:rhs `(insert! (->Promotion ~name ~promotion-type))})})
теперь, если мне нужно получить доступ к атрибуту имени клиента из lhs и использовать его в операции вставки в rhs, как мне изменить указанную выше функцию преобразования для достижения того же.
Мне нужно написать функцию преобразования, которая должна выдавать правило, подобное приведенному ниже.
(defrule temperature-alert
"Issue a temperature alert. This rule joins the current temperature with the location
and gathers additional information to fire an alert with context."
[CurrentTemperature (> value high-threshold)
(= ?location-id location)
(= ?value value)]
[Location (= ?location-id id)
(= ?sector sector)]
=>
(alert-temperature! ?value ?location-id ?sector))