PyClips clips.BatchStar() 和 Clips (batch ...) 不能一起工作

PyClips clips.BatchStar() and Clips (batch ...) do not work together

我有三个文件:

1.) 一个python文件test.py:

import clips
PATH_TO_CLP_FILE = r'd:\temp\batch_bug.clp'
clips.BatchStar(PATH_TO_CLP_FILE)
clips.PrintFacts()

2.) 一个文件 batch_bug.clp:

(assert (asdf0))
(batch "D:\temp\batchbug2.clp")
(assert (asdf1))
(printout t (facts))

最后一个文件 batchbug2.clp:

(assert (fdsa))


运行 python test.py 结果如下:

f-0     (initial-fact)
f-1     (asdf0)
f-2     (asdf1)
For a total of 3 facts.

[ENVRNMNT8] Environment data not fully deallocated.

[ENVRNMNT8] MemoryAmount = 22.

[ENVRNMNT8] MemoryCalls = 1.

这不是我所期望的,因为没有 (fdsa) 事实,即调用 (batch "D:\temp\batchbug2.clp") 无效。此外,还有 [ENVRNMNT8] 消息。这是怎么回事?

编辑:

我发现了 CLIPS batch*(...) 命令。并使用它而不是 batch(...) 按预期工作。这是为什么?

当从标准输入(键盘)请求字符时,批处理命令打开一个文件并使用它的内容。当您以交互方式使用 CLIPS 时,字符请求由 read/evaluate/print 循环(CLIPS> 命令提示符)的标准输入以及代码中的任何 read 或 readline 函数调用发出。

当您像这个 PyCLIPS 示例中那样嵌入 CLIPS 时,没有 read/evaluate/print 循环,因此对来自标准输入的字符的唯一请求将来自 read 和 readline 函数。由于此示例不从标准输入发出任何字符请求,因此永远不会处理批处理文件的内容。

batch*命令打开一个文件,直接解析其内容为命令,然后立即执行--执行命令不需要从标准输入请求字符。

批处理命令对于来自命令提示符的 运行 测试用例很有用,因为您可以模拟所有键盘输入。当您无法立即访问命令提示符(因为您正在嵌入 CLIPS 或 CLIPS 当前正在执行)或者您不希望执行的命令和它们的 return 值回显到标准输出。

当 CLIPS 退出时出现 ENVRNMNT8 错误消息,它确定所有分配的内存都没有被正确释放。在这种情况下,未处理的批处理文件的释放代码中存在一个错误,该文件不释放包含批处理文件名的字符串(对于 CLIPS 6.30)。已在 SourceForge 的 CLIPS SVN 存储库中签入了一个修复程序。