我正在使用Clips作为专家系统制作应用程序。我想知道是否有可能收集?result变量的值,或者如何执行一段代码然后得到结果。
- (void)viewDidLoad {
[super viewDidLoad];
clipsEnv = CreateEnvironment();
if (clipsEnv == NULL) return;
DATA_OBJECT theDO;
EnvEval(clipsEnv,"(bind ?result (numberp (member$ 'Yes' (create$ 'Yes' ))))",&theDO);
}
我上面提到的是一个例子。我的应用程序使用大的.clp,我无法消除变量,因为它用于进行其他计算。
例如,我想保留?totalDays?inputDays和?variableResultado而不修改任何代码。
(bind ?totalDays (+ (* (nth$ 1 (GetDate)) 365)(* (nth$ 2 (GetDate)) (/ 365 12))(nth$ 3 (GetDate))))(bind ?inputDays (+ (* (- (Decimal (sub-string 7 10 ?FechaNacimiento)) 1900) 365)(* (Decimal (sub-string 4 5 ?FechaNacimiento)) (/ 365 12))(Decimal (sub-string 1 2 ?FechaNacimiento))))(bind ?variableResultado (* (/ (- ?totalDays ?inputDays) 365) 12))
答案 0 :(得分:0)
回答我自己的问题。一种可能的解决方案是在外部文件中定义全局变量而不是普通变量,然后使用EnvFindDefglobal()
和EnvGetDefglobalValue()
获取结果。这是我找到的可能方法之一。
clipsEnv = CreateEnvironment();
EnvReset(clipsEnv);
if (clipsEnv == NULL){
string = @"Error";
return string;
}
filePath = [[NSBundle mainBundle] pathForResource: @"try" ofType: @"clp"];
cFilePath = (char *) [filePath UTF8String];
EnvLoad(clipsEnv,cFilePath);
DATA_OBJECT theDO;
EnvFindDefglobal(clipsEnv, "?*variable*");
EnvGetDefglobalValue(clipsEnv, "variable", &theDO);
string = [NSString stringWithUTF8String:ValueToString(GetValue(theDO))];
return string;
在try.clp文件中:
(bind ?result (numberp (member$ 'Yes' (create$ 'Yes' ))));
(defglobal ?*variable* = ?result);
答案 1 :(得分:0)
您不需要将函数的返回值绑定到变量以使用EnvEval检索它:
void *clipsEnv;
DATA_OBJECT theDO;
const char *theString;
clipsEnv = CreateEnvironment();
EnvEval(clipsEnv,"(numberp (member$ 'Yes' (create$ 'Yes' )))",&theDO);
theString = DOToString(theDO);