Странное поведение log4cl и итерации - PullRequest
0 голосов
/ 23 февраля 2019

Я начинаю использовать log4cl и сталкиваюсь со странной проблемой при использовании его внутри цикла iterate.Хотя working показывает название метода, оно пусто для not-working.

Я что-то упускаю здесь очевидное?Или есть ошибка в комбинации iterate и log4cl?

(ql:quickload "iterate")
(ql:quickload "log4cl")

(defpackage :minimal
  (:use #:cl #:iterate)) 

(in-package :minimal)

(defclass test ()
  ((a :documentation "test-a"
      :initform (make-array '(3 3)
                :element-type 'integer
                :initial-element 0)
      :initarg :a)))

(defvar *a* (make-instance 'test))

(defmethod not-working ((test test))
  (with-slots (a) test
    (iter
      (for i below 3)
      (iter
        (for j below 3)
        (unless (= 10 (aref a i j)) 
          (log:info "R: ~D C: ~D" i j))))))

(defmethod working ((test test))
  (with-slots (a) test
    (loop
      for i below 3
      do (loop
           for j below 3
           unless (= 10 (aref a i j))
             do (log:info "I: ~D J: ~D" i j)))))

(not-working *a*)
(working *a*)

РЕДАКТИРОВАТЬ

Я вижу проблему только на sbcl.При использовании ccl имя метода отображается правильно.Кроме того, пропуск оператора (are...) внутри unless приводит к рабочей версии:

(defmethod also-working ((test test))
  (with-slots (a) test
    (iter
      (for i below 3)
      (iter
        (for j below 3)
        (unless (= 10 j) 
          (log:info "R: ~D C: ~D" i j))))))
...