当我使用 Quicklisp ( (ql:quickload "iterate")
) 加载“迭代”包时,它似乎加载得很好,但没有一个函数真正起作用。当我输入时(iterate:iter (for i from 0 to 10) (collect i))
,我收到一条错误消息“我未绑定的变量”和几个样式警告说 COLLECT 和 FOR 是未定义的函数,而 FROM 是未定义的变量。如果我尝试使用 ITER 或 ITERATE 而不是 ITERATE:ITER,也会发生同样的事情。我正在使用 SBCL。
问问题
949 次
3 回答
3
子句的“运算符”也位于iterate
包中:
(iterate:iter (iterate:for i from 1 to 10) (iterate:collect i))
Iterate 是一个通常方便use-package
(或:use
在包定义中)的包。
于 2013-05-20T20:26:28.747 回答
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
包装中可能存在的所有符号......
于 2013-05-21T05:38:13.223 回答
1
使用 :use 将其定义为包的一部分可能是最好的方式,但我只是使用
(use-package "ITERATE")
它似乎工作得很好。
于 2019-07-10T21:17:02.907 回答