使用Quicklisp安装后使用iterate

时间:2013-05-20 16:18:05

标签: common-lisp quicklisp

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

3 个答案:

答案 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")

它似乎很好用。