java代码降低噪声 java减少运行时间( 六 )


Jess (+ 2 3)
5
Jess (+ (+ 2 3) (* 3 3))
14
注意你可以嵌套调用函数;外部函数是形成内部函数调用计算的因素 。
Jess自身带有大量的内置函数 , 它们可以用来做一切事情,如数学计算,程序控制和字符处理 , 让你能够使用Java的API函数 。当然你也可以在Jess语言或者是Java语言中定义自己的函数 。
其中一个最经常用的函数是printout,它是用来发送文本到Jess的标准输出窗口,或者是输出到一个文件中 。完善的解释你必须等待 , 但是现在,你所要了解的都包含在下面这个例子中:
Jess (printout t "The answer is " 42 "!" crlf)
The answer is 42!
另一个常用的函数是batch , 它是用来计算一个包含Jess代码文件的 。要运行Jess源文件examples/jess/hello.clp,你可以键入:
ess (batch "examples/jess/hello.clp")
Hello, world!
Jess自带的其他的所有函数的详细说明都在Jess function guide. 。
3.7.变量
Jess中程序变量是以问号开始的标识符 。问号也是变量名的一部分 。名字可以包括字母 , 数字,破折号,下划线,分号和星号的任何组合 。
一个变量可以看作是一个简单的符号 , 数字,字符串或者是一个列表 。你可以用bind函数来为变量指定一个值 。
Jess (bind ?x "The value")
"The value"
变量在第一次使用前不需要声明(全局变量除外) 。
想在Jess提示符后看到变量 的值,你只需要键入变量的名字:
Jess (bind ?a 123)
123
Jess ?a
123
3.7.1.全局变量(默认全局)
你在Jess提示符后或者任何Jess语言程序顶层创建的所有变量,当重置命令运行的时候都将被清除 。这样就使它们稍嫌短暂,对于暂时性变量它们很好用,在标准理解的前提下不是永久全局变量 。要创建不被reset销毁的全局变量,你可以用全局结构:
(defglobal [?global-name = value]+)
全局变量的名称必须是以星号开头以星号结束 。合法的全局变量如下:
?*a*?*all-values*?*counter*
当全局变量建立以后 , 它会被初始化赋值 。当reset命令随后执行的时候,这个变量可能会用相同的值重新设置,当然这取决于reset-globals的属性设置 。有一个称为set-reset-globals的函数可以用来设置这个属性 。如例所示:
Jess (defglobal ?*x* = 3)
TRUE
Jess ?*x*
3
Jess (bind ?*x* 4)
4
Jess ?*x*
4
Jess (reset)
TRUE
Jess ?*x*
3
Jess (bind ?*x* 4)
4
Jess (set-reset-globals nil)
FALSE
Jess (reset)
TRUE
Jess ?*x*
4
您可以阅读Jess function guide.中有关set-reset-globals和相关的get-reset-globals函数的信息 。
3.8.控制流
Java中控制流(分支和循环,异常处理等)都是由一些特殊的语法和关键字如if,while,for,和try等来引导的 。在Jess中,就如我们前面说过的 , 所有的一切都是函数调用,控制流也不例外 。因此 , Jess包含有那些名为if , while , for,和try以及foreach等函数 。这些函数就和Java体系中相同名称的结构工作起来类似 。
3.8.1.简单循环
例如,如下 是Jess中的一个“while”循环示例:
Jess (bind ?i 3)
3
Jess (while ( ?i 0)
(printout t ?i crlf)
(-- ?i))
3
2
1
FALSE
While循环的第一个参数是一个布尔表达式 。While函数计算它的第一个参数,如果它为真,就计算它所有其他的参数 。它一直进行这个过程直到它的线一个参数值为假 。一个while循环总是返回FALSE.
Jess中内置有一些其他的循环函数 。详情参看Jess function index.中关于for和foreach的有关描述 。Jess中有一个break函数 , 可以有来跳出循环,也可以很早的从一个规则的右手边返回