В CLIPS C API есть способ выполнить команду в контексте определенного модуля? - PullRequest
0 голосов
/ 30 сентября 2018

Используя C API, как я могу выполнить команду CLIPS в контексте определенного модуля?Например, если я определил шаблон факта в модуле FOO, как я могу утверждать экземпляр этого факта?Оценка (set-current-module FOO) не обрезает его, если я делаю это, а затем оцениваю (printout t (get-current-module) crlf), то я получаю вывод MAIN

1 Ответ

0 голосов
/ 03 октября 2018

Я не могу сказать, что вы сделали неправильно, поскольку вы не включили никакого кода, но использование set-current-module прекрасно работает как в CLIPS 6.3, так и в 6.4.

Код для CLIPS 6.3:

int main(
  int argc,
  char *argv[])
  {
   void *theEnv;
   DATA_OBJECT theValue;

   theEnv = CreateEnvironment();

   EnvEval(theEnv,"(printout t (get-current-module) crlf)",&theValue); // Should be MAIN
   EnvBuild(theEnv,"(defmodule FOO)");
   EnvEval(theEnv,"(printout t (get-current-module) crlf)",&theValue); // Should be FOO
   EnvEval(theEnv,"(set-current-module MAIN)",&theValue);
   EnvEval(theEnv,"(printout t (get-current-module) crlf)",&theValue); // Should be MAIN
   EnvEval(theEnv,"(set-current-module FOO)",&theValue);
   EnvEval(theEnv,"(printout t (get-current-module) crlf)",&theValue); // Should be FOO

   DestroyEnvironment(theEnv); 

   return(-1);
  }

Код для CLIPS 6.4:

int main(
  int argc,
  char *argv[])
  {
   Environment *theEnv;

   theEnv = CreateEnvironment();

   Eval(theEnv,"(printout t (get-current-module) crlf)",NULL); // Should be MAIN
   Build(theEnv,"(defmodule FOO)");
   Eval(theEnv,"(printout t (get-current-module) crlf)",NULL); // Should be FOO
   Eval(theEnv,"(set-current-module MAIN)",NULL);
   Eval(theEnv,"(printout t (get-current-module) crlf)",NULL); // Should be MAIN
   Eval(theEnv,"(set-current-module FOO)",NULL);
   Eval(theEnv,"(printout t (get-current-module) crlf)",NULL); // Should be FOO

   DestroyEnvironment(theEnv);

   return -1;
  }
...