前一段时间我开始学习Common Lisp,但现在我已经来到了我的第一个真正的绊脚石,理解了一个概念。我开始改变我的学习项目,从单个文件源转移到包。到目前为止,一切都按预期进行了,但后来,我偶然发现了一个文件,一个我编码的数独游戏,其他行为就像我想的那样。您可以在此处找到它:https://github.com/Silberbogen/cl-sudoku
当我通过(in-package:cl-sudoku)切换到包内后开始(spiele-sudoku),一切正常,但是当我通过(cl-sudoku:spiele-sudoku)启动它时,只有我的除了输入坐标之外,其他任何输入似乎都没有被解释。
我想念什么概念,所以我可以通过(cl-sudoku:spiele)开始游戏?
答案 0 :(得分:1)
您使用read-from-string
来阅读您的输入。这将把作为符号遇到的任何单词实习到当前包中。
在您的主要功能中,您使用case
与符号进行比较,但这些符号会嵌入到cl-sudoku
包中。因此,如果您当前的包是cl-sudoku
,它将起作用,否则不起作用。
您不应该使用read
或read-form-string
来解析用户输入(如果您绝对必须,至少将*read-eval*
绑定为nil)。而是自己调用intern
(可能在组合string-upcase
中)以在正确的包中创建符号。如果您想使用与程序包无关的符号,请将它们插入到KEYWORD
包中,以便您可以对关键字执行case
。
使用ecase
或ccase
可能会有所帮助,或者至少在无效输入上记录一些调试信息。