首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在通用Lisp中使用迭代包的正确方法

在通用Lisp中使用迭代包的正确方法
EN

Stack Overflow用户
提问于 2021-02-05 19:00:22
回答 1查看 251关注 0票数 2

在使用sbcl-1.4.14的Windows框上,我使用

代码语言:javascript
复制
(load "C:\\Program Files\\clisp-2.49\\asdf\\asdf.lisp")
(require :asdf)
(push "C:\\Documents and Settings\\mayhem\\lisp\\iterate\\" asdf:*central-registry*)

SLIME

代码语言:javascript
复制
(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关于非常类似的问题,但没有帮助。关于这个问题的帖子和文章不多。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-06 09:51:34

在尝试引用iterate包中的非限定符号之前,您需要说iterate

在你的案子里发生了这样的事。

您已经将"ITERATE".

  • In系统加载到正在运行的Lisp中,创建了一个名为package.

  • There --您输入了(iterate ...)"CL-USER"包--的包,读者发现它需要找到或创建一个符号,其名称为"ITERATE",并且在"CL-USER" package.

  • There中可访问的符号不是这样的符号,所以它创建了一个新的符号,CL-USER::ITERATE.

  • This不是ITERATE:ITERATE,所以当它试图计算函数的参数时(它不存在,但它还不知道),所以从评估器得到了一个错误。实际上,在计算(for i ...)子表单中的第一个参数时,您所得到的错误是。

  • ,现在您说(use-package :iterate)让系统将"ITERATE"包添加到"CL-USER"的搜索列表中。

  • 现在有一个冲突:iterate是指现有的CL-USER::ITERATE还是新访问的ITERATE::ITERATE?(还有一些其他的冲突,probably).

  • So系统发出错误信号,应该有一些有用的方法来处理,其中之一可能是“消除所有相互冲突的"CL-USER"符号”,但我想你没有选择。

  • 所以现在一切都搞砸了。

答案是:在尝试引用那些不合格的符号之前,使用要引用不合格符号的包。

(也是: Windows?你的反悔给我留下了深刻的印象。)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66069102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档