我是否以正确的方式更改 defglobal 的值?

Do I change the value of a defglobal in a correct way?

我正在编写一个应用程序,它应该在某个时候获取 defglobal 变量的值并更改它。为此,我执行以下操作:

    DATA_OBJECT cur_time_q;
    if (!EnvGetDefglobalValue(CLIEnvironment, cur_timeq_kw, &cur_time_q)) return CUR_TIME_GLBVAR_MISSING;
    uint64_t cur_time = t_left;
    SetType(cur_time_q, INTEGER);
    void* val = EnvAddLong(CLIEnvironment, cur_time);
    SetValue(cur_time_q, val);
    EnvSetDefglobalValue(CLIEnvironment, cur_timeq_kw, &cur_time_q);

我部分采用了 "Advanced Programming Guide" 的这种方法,效果很好,但我有一些问题:

  1. 是否EnvAddLong(...)添加一个值,该值会保留在内存中,直到环境被破坏?它可能会消耗内存并增加其他 API 函数的执行时间,例如 EnvRun(...),如果调用具有此代码片段的函数,比如说,几千次迭代?
  2. 是不是太过分了?我应该选择 EnvEval("(bind ...)") 之类的东西吗?

CLIPS 高级编程指南中有关于 CLIPS 如何处理垃圾收集的信息。 API 用于创建值以传递给其他 API 函数的 EnvAddLong 调用不会触发垃圾回收。通常,API 导致代码执行或释放数据结构(例如 运行、Reset、Clear 和 Eval)的调用会触发垃圾回收,并将释放由 EnvAddLong 等函数创建的任何瞬态数据。因此,如果您的程序设计反复为全局变量赋值然后运行,那么一旦数据被确认为垃圾并且不再被任何 CLIPS 数据结构引用,您分配的任何 CLIPS 数据结构最终将被释放。

如果您可以轻松构造一个字符串以传递给 Eval 函数,那么这样做通常比多次 API 调用来获得相同结果更容易。

API 在 6.4 版中进行了大修,因此许多任务(例如为 defglobal 赋值)可以通过一步而不是几步完成。

   CLIPSValue rv;
   Defglobal *global;
   mainEnv = CreateEnvironment();

   Build(mainEnv,"(defglobal ?*x* = 3.1)");
   Eval(mainEnv,"?*x*",&rv);
   printf("%lf\n",rv.floatValue->contents);
   global = FindDefglobal(mainEnv,"x");
   if (global != NULL)
     {
      DefglobalSetInteger(global,343433);
      Eval(mainEnv,"(println ?*x*)",NULL);
      DefglobalGetValue(global,&rv);
      printf("%lf\n",rv.floatValue->contents);
     }