2013-05-20 1 views
3

Lorsque je charge le package "itérer" à l'aide de Quicklisp ((ql:quickload "iterate")), il semble se charger correctement mais aucune des fonctions ne fonctionne réellement. Lorsque j'entre (iterate:iter (for i from 0 to 10) (collect i)), j'obtiens une erreur indiquant "La variable I n'est pas liée" et plusieurs avertissements de style indiquant que COLLECT et FOR sont des fonctions non définies et FROM une variable indéfinie. La même chose se produit si j'essaie d'utiliser ITER ou ITERATE au lieu d'ITERATE: ITER. J'utilise SBCL.Utilisation de iterate après l'installation avec Quicklisp

Répondre

3

Les "opérateurs" des clauses résident également dans le package iterate:

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

Itérer est un package qui est souvent commode de use-package (ou :use dans la définition du paquet).

+0

Merci. J'ai mis ': use' au début de mon fichier, mais il ne compile pas et donne un avertissement que le paquet" exporte aussi les symboles suivants: (preprocess-clause define-clause config2 ...) "et une énorme liste de symboles. Au début de mon fichier, j'ai '(defpackage: foo (: use: cl: itérer)) (in-package: foo)'. Toute la documentation que j'ai lu à ce sujet semble indiquer que cela devrait fonctionner, mais ce n'est pas le cas. – lightlike

2

Ce n'est pas une solution de travail, mais je suis très curieux de trouver moi-même, donc, peut-être quelqu'un me hep aussi :)

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

Maintenant, cela ne fonctionnera pas parce que les symboles de le corps est défini dans l'ancien paquet (cl-user par exemple) et une fois que vous essayez de les utiliser dans le paquet iterate, tout est cassé. Mais il doit y avoir un moyen ... à côté de remplacer tous les symboles potentiellement dans iterate paquet ...