Common lisp 在Common Lisp中理解包概念的困难

Common lisp 在Common Lisp中理解包概念的困难,common-lisp,packages,Common Lisp,Packages,不久前我开始学习CommonLisp,但现在我遇到了第一个真正的绊脚石,理解了一个概念。我开始改变我的学习项目,从单一文件源转移到软件包。到目前为止,一切都按预期进行,但后来,我偶然发现了一个文件,一个我编写的数独游戏,它的行为与我想象的不同。你可以在这里找到它: 当我在包内通过(包内:cl sudoku)切换后启动(Spile sudoku)时,一切正常,但当我通过(cl sudoku:Spile sudoku)启动时,只有我的坐标输入被排除在外,而任何其他输入似乎都不会被解释 我错过了什么概

不久前我开始学习CommonLisp,但现在我遇到了第一个真正的绊脚石,理解了一个概念。我开始改变我的学习项目,从单一文件源转移到软件包。到目前为止,一切都按预期进行,但后来,我偶然发现了一个文件,一个我编写的数独游戏,它的行为与我想象的不同。你可以在这里找到它:

当我在包内通过(包内:cl sudoku)切换后启动(Spile sudoku)时,一切正常,但当我通过(cl sudoku:Spile sudoku)启动时,只有我的坐标输入被排除在外,而任何其他输入似乎都不会被解释


我错过了什么概念,这样我就可以通过(cl数独:Spile)启动游戏了?

您可以使用
读取字符串来读取输入。这将把作为符号遇到的任何单词插入到当前包中

在main函数中,您使用
case
与符号进行比较,但是这些符号被插入到
cl数独
包中。因此,如果您当前的软件包是
cl数独
,那么它就可以工作,否则就不行

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


使用
ecase
ccase
,或者至少记录一些关于无效输入的调试信息,可能会有所帮助。

谢谢您的快速回答,Svante。起初我使用intern,但在查找错误时,我将其改为从字符串读取,希望能找到错误。现在我使用了ecase而不是case,我可以看到我的输入并不像我想的那样,比如说HINWEIS,而是CL-SUDOKU::HINWEIS。看来,我现在必须学习如何实习他们的关键字包。你帮了我很多,所以,非常感谢你@SaschaBiermanns:
intern
将包名作为附加参数。完成。谢谢,你的回答完全解决了我的问题。我修复了我的错误,现在它可以工作了。它可能回答这个问题,也可能不回答这个问题,但它往往是一个很好的、信息丰富的指南,很多人说它为他们消除了很多困惑。我刚刚下载了它。非常感谢你的提示,约书亚!