Common Lisp中迭代包的正确使用方法

问题描述

在装有 sbcl-1.4.14 的 Windows XP 机器上,我使用

安装了 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 和其他函数)停止工作,它们给出 { {1}} 类型的错误,例如。

如果我执行 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)))

注意:我已经看到 the post 关于非常相似的问题,但它没有帮助。关于这个特定问题的帖子或文章并不多。

解决方法

在尝试引用 (use-package :iterate) 包中的非限定符号之前,您需要先说 iterate

你的情况是这样的。

  1. 您已将 iterate 系统加载到正在运行的 Lisp 中,创建了一个名为 "ITERATE" 的包。
  2. "CL-USER" 包中,您输入了 (iterate ...),并且读者已经计算出需要查找或创建名称为 "ITERATE" 并且可以在"CL-USER" 包。
  3. 没有这样的符号,所以它创建了一个新的,CL-USER::ITERATE
  4. 这不是 ITERATE:ITERATE,因此您从评估器收到错误,因为它试图评估函数的参数(该函数不存在,但它还不知道)。事实上,您得到的错误是在评估 (for i ...) 子表单中的第一个参数时。
  5. 现在您说 (use-package :iterate) 来告诉系统将 "ITERATE" 包添加到 "CL-USER" 的搜索列表中。
  6. 现在有一个冲突:iterate 是指现有的 CL-USER::ITERATE 还是新访问的 ITERATE::ITERATE? (可能还有其他一些冲突)。
  7. 因此系统发出错误信号,应该有一些有用的方法可以解决这个问题,其中之一可能是“取消所有冲突的 "CL-USER" 符号”,但您没有选择该选项,我假设。
  8. 所以现在一切都搞砸了。

答案是:在尝试引用非限定符号之前,先使用要引用非限定符号的包。

(还有:Windows XP?我对你的复古印象深刻。)