当我使用Quicklisp((ql:quickload "iterate")
)加载“iterate”包时,似乎加载正常,但没有一个函数真正起作用。当我输入(iterate:iter (for i from 0 to 10) (collect i))
时,我收到一条错误,上面写着“变量I未绑定”,并且有几个样式警告说COLLECT和FOR是未定义的函数,FROM是未定义的变量。如果我尝试使用ITER或ITERATE而不是ITERATE:ITER,会发生同样的事情。我正在使用SBCL。
答案 0 :(得分:3)
条款的“运算符”也位于iterate
包中:
(iterate:iter (iterate:for i from 1 to 10) (iterate:collect i))
Iterate是一个通常方便use-package
(或包定义中:use
)的包。
答案 1 :(得分:1)
这不是一个有效的解决方案,但我非常好奇自己找到一个,所以,也许有人也会帮我:)
(defun old-package () (package-name *package*))
(defmacro i++ (&body body)
(let ((old (package-name *package*))
(new (package-name (find-package 'iterate))))
(in-package #.(package-name (find-package 'iterate)))
(prog1
`(unwind-protect
(progn
(in-package ,new)
(iter ,@body))
(in-package ,old))
(in-package #.(old-package)))))
现在,这不起作用,因为身体的符号在旧的(cl-user
例如)包中定义,然后一旦您尝试在iterate
包中使用它们,它就会中断。但必须有某种方式......除了替换iterate
包中的所有符号......
答案 2 :(得分:0)
使用:use将其定义为软件包的一部分是可能的最佳方式, 但是我只是用
(use-package "ITERATE")
它似乎很好用。