anchor.diff:                       (1- (length string))))))
       (nsubstitute #\- #\ (subseq string start end))))
   
  +(defvar *ano-dados-comvest*)
   (defvar *cursos-comvest*)
   (defvar *cidades-comvest*)
   (defvar *questoes-comvest*)
   (defvar *grupos-comvest*)
   
   (defun extrair-opcoes-comvest (ano)
  -  (let ((opcoes '("opcao" "cid_inscricao" "questao" "grupo"))
  -        (variaveis '(*cursos-comvest* *cidades-comvest* *questoes-comvest*
  -                     *grupos-comvest*))
  -        (texto
  -         (http-request
  -          (format nil "http://www.comvest.unicamp.br/estatisticas/~d/quest/quest1.php"
  -                  ano))))
  -    (loop for opcao in opcoes
  -       for variavel in variaveis
  -       for subtexto = (scan-to-strings (regex-opcoes-comvest opcao) texto)
  -       do (setf (symbol-value variavel)
  -                (loop for (start end register-start register-end)
  -                     = (multiple-value-list (scan *regex-opcoes-comvest-single*
  -                                                  subtexto :start (or end 0)))
  -                   while start collect
  -                     (cons (subseq subtexto (aref register-start 0)
  -                                   (aref register-end 0))
  -                           (normalize-text
  -                            (subseq subtexto (aref register-start 1)
  -                                    (aref register-end 1)))))))))
  +  (unless (and (boundp '*ano-dados-comvest*)
  +               (= ano *ano-dados-comvest*))
  +    (setf *ano-dados-comvest* ano)
  +    (let ((opcoes '("opcao" "cid_inscricao" "questao" "grupo"))
  +          (variaveis '(*cursos-comvest* *cidades-comvest* *questoes-comvest*
  +                       *grupos-comvest*))
  +          (texto
  +           (http-request
  +            (format nil "http://www.comvest.unicamp.br/estatisticas/~d/quest/quest1.php"
  +                    ano))))
  +      (loop for opcao in opcoes
  +         for variavel in variaveis
  +         for subtexto = (scan-to-strings (regex-opcoes-comvest opcao) texto)
  +         do (setf (symbol-value variavel)
  +                  (loop for (start end register-start register-end)
  +                       = (multiple-value-list (scan *regex-opcoes-comvest-single*
  +                                                    subtexto :start (or end 0)))
  +                     while start collect
  +                       (cons (subseq subtexto (aref register-start 0)
  +                                     (aref register-end 0))
  +                             (normalize-text
  +                              (subseq subtexto (aref register-start 1)
  +                                      (aref register-end 1))))))))))
   
   (defparameter *regex-comvest-single*
     `(:sequence
  
positive.code:                                                   ano linhas tipo))
                                           :defaults diretorio)
                            :direction :output :if-exists :supersede)
        (dados-comvest ano :linhas linhas :tipo tipo :stream file))))
  
negative.code:                    (:numero "Número total"))
                   (string-downcase grupo)))))
  
  (defun dados-comvest-arquivos (diretorio anos &key (linhas :cursos) (tipo :porcentagem)
                                 questoes)
    (dolist (ano (ensure-list anos))
      (with-open-file (file (make-pathname :name
                                           (string-downcase
  