5

当我使用 Quicklisp ( (ql:quickload "iterate")) 加载“迭代”包时,它似乎加载得很好,但没有一个函数真正起作用。当我输入时(iterate:iter (for i from 0 to 10) (collect i)),我收到一条错误消息“我未绑定的变量”和几个样式警告说 COLLECT 和 FOR 是未定义的函数,而 FROM 是未定义的变量。如果我尝试使用 ITER 或 ITERATE 而不是 ITERATE:ITER,也会发生同样的事情。我正在使用 SBCL。

4

3 回答 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 回答