1

我遵循了这个示例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 访问 Customer name 属性并在 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))
4

0 回答 0