Команда CLIPS (очистить) завершается неудачно / выдает исключение в pyclips

У меня есть программа pyclips / clips, для которой я написал несколько модульных тестов с использованием pytest. Каждый тестовый случай включает в себя начальный clips.Clear() с последующим выполнением реальных клипов COOL-кода через clips.Load(rule_file.clp), Запуск каждого теста в отдельности работает нормально.

Тем не менее, когда Pytest указывает запустить все тесты, некоторые ClipsError: S03: environment could not be cleared, На самом деле, это зависит от порядка тестов в.py файле. Кажется, есть тестовые случаи, которые вызывают последующий тестовый случай, чтобы вызвать исключение.

Может быть, код некоторых клипов все еще используется, поэтому очистка не удалась? Я прочитал здесь, что (clear)

Очищает зажимы. Удаляет все конструкции и все связанные структуры данных (например, факты и экземпляры) из среды CLIPS. Очистка может быть выполнена безопасно в любое время, однако некоторые конструкции не позволят удалить себя во время использования.

Может ли это быть здесь? Что вызывает (clear) Команда потерпеть неудачу?

РЕДАКТИРОВАТЬ:

Я смог сузить проблему. Это происходит при следующих обстоятельствах:

test_case_A идет прямо перед test_case_B. В test_case_A есть test такие как

(test (eq (type ?f_bio_puts) clips_FUNCTION))

но f_bio_puts был установлен на

(slot f_bio_puts (default [nil]))

Таким образом, тестирование типа переменной слота, который был установлен в [nil] первоначально, кажется, вызывает (clear) Команда потерпеть неудачу. Есть идеи?

РЕДАКТИРОВАТЬ 2

Я думаю, я знаю, что является причиной проблемы. Это test линия. Я адаптировал свой код, чтобы он запускался в диалогах клипа Windows. И я получил эту ошибку при загрузке через (batch ...)

[INSFUN2] No such instance nil in function type.
[DRIVE1] This error occurred in the join network
   Problem resided in associated join
       Of pattern #1 in rule part_1

Я думаю, что это ошибка pyclips, что это замаскировано.

1 ответ

Решение

Измените функцию EnvClear в файле исходного кода CLIPS construct.c, добавив следующие строки кода для сброса флагов ошибок:

globle void EnvClear(
  void *theEnv)
  {
   struct callFunctionItem *theFunction;

   /*==============================*/
   /* Clear error flags if issued  */
   /* from an embedded controller. */
   /*==============================*/

   if ((EvaluationData(theEnv)->CurrentEvaluationDepth == 0) && 
       (! CommandLineData(theEnv)->EvaluatingTopLevelCommand) &&
       (EvaluationData(theEnv)->CurrentExpression == NULL))
     {
      SetEvaluationError(theEnv,FALSE);
      SetHaltExecution(theEnv,FALSE);
     }
Другие вопросы по тегам