在 Common Lisp 中使用 iterate 包的正确方法

Lar*_*een 2 lisp iteration common-lisp asdf package

在我的 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*)
Run Code Online (Sandbox Code Playgroud)

SLIME

(require :iterate)
(iterate (for i from 1 to 5) (collect (* i i)))
Run Code Online (Sandbox Code Playgroud)

给出变量 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正确使用?

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

小智 5

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