首页 > 解决方案 > 在 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正确使用?

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

标签: packageiterationlispcommon-lispasdf

解决方案


(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?你的复古给我留下了深刻的印象。)


推荐阅读