Использование iterate после установки с помощью Quicklisp

Когда я загружаю пакет «итерации» с помощью Quicklisp ( (ql:quickload "iterate") ), кажется, что он загружается нормально, но ни одна из функций не работает. Когда я ввожу (iterate:iter (for i from 0 to 10) (collect i)), я получаю сообщение об ошибке «Переменная I не привязана» и несколько предупреждений о стиле, говорящих о том, что COLLECT и FOR — это неопределенные функции, а FROM — неопределенная переменная. То же самое произойдет, если я попытаюсь использовать ITER или ITERATE вместо ITERATE:ITER. Я использую СБКЛ.


person lightlike    schedule 20.05.2013    source источник


Ответы (3)


«Операторы» предложений также находятся в пакете iterate:

(iterate:iter (iterate:for i from 1 to 10) (iterate:collect i))

Iterate — это пакет, который часто удобен для use-package (или :use в определении пакета).

person Svante    schedule 20.05.2013
comment
Спасибо. Я поставил :use в начале своего файла, но он не компилируется и выдает предупреждение о том, что пакет также экспортирует следующие символы: (preprocess-clause define-clause config2 ...) и огромный список символов . В начале моего файла у меня есть (defpackage :foo (:use :cl :iterate)) (in-package :foo). Вся документация, которую я читал об этом, кажется, указывает на то, что это должно работать, но по какой-то причине это не так. - person lightlike; 21.05.2013

Это не рабочее решение, но мне очень любопытно найти его самому, так что, возможно, мне тоже кто-то поможет :)

(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...

person Community    schedule 21.05.2013

определение его как части пакета с помощью :use вероятно является лучшим способом с точки зрения стиля, но я просто использовал

(use-package "ITERATE")

и это, казалось, работало очень хорошо.

person Joel M Ward    schedule 10.07.2019