Проблемы с построением правил 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))

0 ответов

Другие вопросы по тегам