Jess 7.2p2——Java平台规则引擎官方文档翻译2
Jess 7.2p2——Java平臺規則引擎官方文檔翻譯2
本博客是本人接著[本體小本營][1]之前關于Jess的官方文檔的補充翻譯,前一部分請看轉載的Jess 7.2p2——Java平臺規則引擎官方文檔翻譯1。因為對JESS理解有限,如有失誤,敬請留言。
4.定義函數
4.1.Deffunctions
你能定義自己的函數,用deffunction結構,deffunction的結構如下所示:
(deffunction <function-name> [<doc-comment>] (<parameter>*)<expr>* [<return-specifier>])必須是符號。每個必須是變量名。可選的是一個雙引號字符串,可以描述函數的用途。可能有任意數量表達式。可選的給出的函數的返回值。它可以是返回函數的顯式使用,也可以是任意值或表達式。在deffunctions的控制流是通過控制流函數如foreach實現的,如果,雖然。以下例子是deffunction實現返回它的兩個數值中較大的一個:
Jess> (deffunction max (?a ?b)(if (> ?a ?b) then(return ?a)else(return ?b))) TRUE注意以上函數也可以同時寫成如下形式:
Jess> (deffunction max (?a ?b)(if (> ?a ?b) then?aelse?b)) TRUE這個功能現在可以被任何一個Jess函數調用來使用。例如:
Jess> (printout t "The greater of 3 and 5 is " (max 3 5) "." crlf) The greater of 3 and 5 is 5.通常一個deffunction包含特定的參數數目。寫一個deffunction,其中包含任意數量的參數,使最后的形式參數是一個多變量的前綴——“$”字符。當deffunction被調用,多變量將包含所有剩余的參數作為一個列表傳遞給函數。一個deffunction可以接受不超過一個通配符,通配符必須在函數的最后一個參數。
您還可以用java編寫的函數自定義Jess語言。這些與內置函數沒有什么區別,事實上,您使用定義內置函數的統一口來編寫它們。詳情見這里。
4.2. Defadvice
有時一個Jess函數不會表現得完全像你希望的那樣。defadvice結構讓你寫一些Jess代碼,這些代碼將在每一次Jess函數被調用的之前或者之后運行。defadvice可以讓你輕松地“包裝”額外的代碼在任何Jess的功能,例如它執行在(因此可以改變被真正的函數看到的參數列表,或者通過返回其自身價值來達到其完全的短路)之前或執行在真正的函數之后(因此可以看到真正的函數的返回值并可能改變它。)defadvice 提供了一個好的方式對于那些Jess附件內容作者,它擴展了Jess而不需要改變任何內部代碼。
這是一些例子展示了defadvice如何使用。
這個攔截調用’plus’ (+) 并且增加了另外的參數 ‘1’, 因此 (+ 2 2) 變成了 (+ 2 2 1) -> 5. 變量 ‘$?argv’ 是特殊指定的. 它通常是指真正的Jess函數被調用時將收到的參數列表。
這個例子使得所有的加法等于1(即所謂的短路)。defadvice通過返回值,使得函數每次被調用時都保持真正的函數功能。
Jess> (defadvice before + (return 1)) TRUE Jess> (+ 2 2) 1這個例子從+函數的返回值中減去1,?retval是另一個有意思的變量——它是真正函數的返回值。當我們完成后,我們利用undefadvice移除advice。
Jess> (defadvice after + (return (- ?retval 1))) TRUE Jess> (+ 2 2) 3 Jess> (undefadvice +) Jess> (+ 2 2) 4總結
以上是生活随笔為你收集整理的Jess 7.2p2——Java平台规则引擎官方文档翻译2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jess的各种小问题
- 下一篇: Qt环境报错-Project ERROR