0

我有三个文件:

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]​​言。这里发生了什么?

编辑:

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

4

1 回答 1

1

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

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

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

批处理命令对于从命令提示符运行测试用例很有用,因为您可以模拟所有键盘输入。当您无法立即访问命令提示符(因为您正在嵌入 CLIPS 或 CLIPS 当前正在执行)或者您不想回显执行的命令及其返回值时,batch* 命令对于运行命令脚本很有用到标准输出。

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

于 2017-03-29T19:18:55.037 回答