在 Common Lisp 中使用迭代包的正确方法
Correct way to use the iterate package in Common Lisp
在我的 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
?
注意:我已经看到 the post 非常相似的问题,但没有帮助。关于这个特定问题的帖子或文章不多。
在尝试引用 iterate
包中的不合格符号之前,您需要说 (use-package :iterate)
。
你的情况是这样的。
- 您已经将
iterate
系统加载到 运行 Lisp 中,创建了一个名为 "ITERATE"
. 的包
- 在
"CL-USER"
包中,您输入了 (iterate ...)
,reader 计算出它需要查找或创建一个名称为 "ITERATE"
的符号并且可以在 "CL-USER"
包中访问。
- 没有这样的符号,所以创建一个新的,
CL-USER::ITERATE
。
- 这不是
ITERATE:ITERATE
,因此当计算器尝试计算函数的参数时,您会收到一个错误(该函数不存在,但它还不知道)。实际上,您遇到的错误是在评估 (for i ...)
子表单中的第一个参数时出现的。
- 现在你说
(use-package :iterate)
告诉系统将 "ITERATE"
包添加到 "CL-USER"
的搜索列表中。
- 现在有一个冲突:
iterate
应该引用现有的 CL-USER::ITERATE
还是新可访问的 ITERATE::ITERATE
? (可能还有其他一些冲突)。
- 所以系统发出错误信号,应该有一些有用的方法可以从中继续,其中之一可能是 'unintern all the conflicting
"CL-USER"
symbols',但我想你没有选择那个选项。
- 所以现在一切都搞砸了。
答案是:在你尝试引用那些不合格的符号之前,使用你想要引用的包来引用不合格的符号。
(另外:Windows XP?你的复古给我留下了深刻的印象。)
在我的 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
?
注意:我已经看到 the post 非常相似的问题,但没有帮助。关于这个特定问题的帖子或文章不多。
在尝试引用 iterate
包中的不合格符号之前,您需要说 (use-package :iterate)
。
你的情况是这样的。
- 您已经将
iterate
系统加载到 运行 Lisp 中,创建了一个名为"ITERATE"
. 的包
- 在
"CL-USER"
包中,您输入了(iterate ...)
,reader 计算出它需要查找或创建一个名称为"ITERATE"
的符号并且可以在"CL-USER"
包中访问。 - 没有这样的符号,所以创建一个新的,
CL-USER::ITERATE
。 - 这不是
ITERATE:ITERATE
,因此当计算器尝试计算函数的参数时,您会收到一个错误(该函数不存在,但它还不知道)。实际上,您遇到的错误是在评估(for i ...)
子表单中的第一个参数时出现的。 - 现在你说
(use-package :iterate)
告诉系统将"ITERATE"
包添加到"CL-USER"
的搜索列表中。 - 现在有一个冲突:
iterate
应该引用现有的CL-USER::ITERATE
还是新可访问的ITERATE::ITERATE
? (可能还有其他一些冲突)。 - 所以系统发出错误信号,应该有一些有用的方法可以从中继续,其中之一可能是 'unintern all the conflicting
"CL-USER"
symbols',但我想你没有选择那个选项。 - 所以现在一切都搞砸了。
答案是:在你尝试引用那些不合格的符号之前,使用你想要引用的包来引用不合格的符号。
(另外:Windows XP?你的复古给我留下了深刻的印象。)