我遵循了这个示例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))