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 存储库中签入了一个修复程序。
我有三个文件:
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 存储库中签入了一个修复程序。