Проблемы с построением правил Клары динамически с использованием instaparse - PullRequest
1 голос
/ 24 февраля 2020

Я последовал этому примеру Insta декларативный DSL , где мы используем Клару с 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))
...