麻烦理解Common Lisp中的包的概念

时间:2014-12-11 13:04:40

标签: common-lisp packages

前一段时间我开始学习Common Lisp,但现在我已经来到了我的第一个真正的绊脚石,理解了一个概念。我开始改变我的学习项目,从单个文件源转移到包。到目前为止,一切都按预期进行了,但后来,我偶然发现了一个文件,一个我编码的数独游戏,其他行为就像我想的那样。您可以在此处找到它:https://github.com/Silberbogen/cl-sudoku

当我通过(in-package:cl-sudoku)切换到包内后开始(spiele-sudoku),一切正常,但是当我通过(cl-sudoku:spiele-sudoku)启动它时,只有我的除了输入坐标之外,其他任何输入似乎都没有被解释。

我想念什么概念,所以我可以通过(cl-sudoku:spiele)开始游戏?

1 个答案:

答案 0 :(得分:1)

您使用read-from-string来阅读您的输入。这将把作为符号遇到的任何单词实习到当前包中。

在您的主要功能中,您使用case与符号进行比较,但这些符号会嵌入到cl-sudoku包中。因此,如果您当前的包是cl-sudoku,它将起作用,否则不起作用。

您不应该使用readread-form-string来解析用户输入(如果您绝对必须,至少将*read-eval*绑定为nil)。而是自己调用intern(可能在组合string-upcase中)以在正确的包中创建符号。如果您想使用与程序包无关的符号,请将它们插入到KEYWORD包中,以便您可以对关键字执行case

使用ecaseccase可能会有所帮助,或者至少在无效输入上记录一些调试信息。