Я начинаю использовать 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))))))