package - 在 Common Lisp 中使用 iterate 包的正确方法
问题描述
在我的 Windows XP 机器上,sbcl-1.4.14
我安装了ASDF
使用
(load "C:\\Program Files\\clisp-2.49\\asdf\\asdf.lisp")
(require :asdf)
(push "C:\\Documents and Settings\\mayhem\\lisp\\iterate\\" asdf:*central-registry*)
在SLIME
(require :iterate)
(iterate (for i from 1 to 5) (collect (* i i)))
给出变量 I 未绑定错误
如果我这样做(in-package :iterate)
了,上面的代码可以正常工作,但是这次熟悉的函数(例如exit
,我定义的其他函数)将.sbclrc
停止工作,The function ITERATE::EXIT is undefined
例如,它们会给出错误类型。
如果我这样做(use-package :iterate)
,那么它会给出[Condition of type NAME-CONFLICT]
错误。
所以我开始像这样使用这个包:
(iterate:iterate (iterate:for i from 1 to 5) (iterate:collect (* i i)))
但我想你会同意这是一种糟糕的风格。
如何iterate
正确使用?
注意:我看过关于非常相似的问题的帖子,但没有帮助。关于这个特定问题的帖子或文章并不多。
解决方案
(use-package :iterate)
在尝试引用包中的不合格符号之前,您需要说一下iterate
。
你的情况是这样的。
- 您已经将
iterate
系统加载到正在运行的 Lisp 中,创建了一个名为"ITERATE"
. - 在
"CL-USER"
您键入的包中(iterate ...)
,读者发现它需要查找或创建一个符号,其名称为"ITERATE"
并且可在"CL-USER"
包中访问。 - 没有这样的符号,所以它创建了一个新符号,
CL-USER::ITERATE
. - 这并不是
ITERATE:ITERATE
因为评估器正在尝试评估函数的参数(该函数不存在,但它还不知道),因此您会从评估器那里得到错误。实际上,您遇到的错误是在评估(for i ...)
子表单中的第一个参数时。 - 现在您说
(use-package :iterate)
告诉系统将"ITERATE"
包添加到"CL-USER"
的搜索列表。 - 现在有一个冲突:应该
iterate
引用现有的CL-USER::ITERATE
还是新的可访问的ITERATE::ITERATE
?(可能还有其他一些冲突)。 - 所以系统发出错误信号,应该有一些有用的方法可以从中继续,其中之一可能是“取消所有冲突的
"CL-USER"
符号”,但我想你没有选择那个选项。 - 所以现在一切都搞砸了。
答案是:在尝试引用不合格符号之前,先使用要引用不合格符号的包。
(另外:Windows XP?你的复古给我留下了深刻的印象。)
推荐阅读
- c# - 如何继续从我的 Socket 读取数据以附加我的缓冲区
- python - 为什么python的del()会被特殊处理?
- ios - Swiftui 按钮切换
- spring - 为什么 Spring 与 Mongo 反应使用这么多连接
- feathersjs - 如何在羽毛中间件中添加用户身份验证?
- python - Google OR-tools 员工调度中的最大轮班长度系列
- python - 如何删除 \xa0 和 nan?
- .net - 从 Visual Studio 部署到特定 AWS ec2 实例
- javascript - 访问nodejs中的resonse结果
- python - 为什么我安装的beautifulsoup 无法导入?