Common Lisp - Что не так с моим отладчиком? - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь запустить этот код:

(defparameter *digits-string* (uiop:read-file-string "day08.txt"))

(defparameter shape '(25 6))

(defun read-file-into-layers (filepath layer-w layer-h)
  (with-open-file (stream filepath)
    (do ((char (read-char stream) (read-char stream))
         (layer-size (* layer-w layer-h))
         (layers nil)
         (layer nil)
         (i nil))
        ((not (digit-char-p char)) layers)
      (when (null layer) (setf layer (make-array layer-size)
                               i 0))
      (setf (aref layer i) (digit-char-p char))
      (incf i)
      (when (= i layer-size) (progn (push layers layer)
                                    (setf layer nil
                                          i 0))))))

(https://github.com/AlbertoEAF/advent_of_code_2019/blob/d0a331157cbb3f37a16ae92f3cc2c56a35b3e00e/common-lisp/day08.lisp#L14 -L28 + day08.txt для https://adventofcode.com/2019/day/8 )

, который возвращает ноль, не знаю почему (файл содержит одну строку с 15k цифрами и символом новой строки в конце).

Я пытаюсь отладить с помощью:

;; 1) Set maximum debug level
(declaim (optimize (speed 0) (space 0) (debug 3)))
;; 2) Recompile the full module + C-u C-c C-c on that function (don't know if that last part is needed)
;; 3) step:
(step (READ-file-into-layers "day08.txt" 25 6))

Я до сих пор не вижу почти никакой переменной, и шаг только останавливается на (read-char stream) и (incf i), больше ничего? И почти никакие переменные не определены!

enter image description here

Кроме того, если я нажму «e» для оценки некоторых выражений, хотя иногда некоторые переменные этого не делают появляются на трассировке стека, в этом случае она сообщает, что они вообще не определены.

Есть идеи, почему отладчик ведет себя так странно? Или это просто мой код, который полностью сломан? Тем не менее, отладчик был бы наиболее полезен в этом случае, если бы он работал:

1 Ответ

2 голосов
/ 05 апреля 2020

Возможно, ваш компилятор слишком умен. Если вы внимательно посмотрите, то из-за перевернутой формы push вы всегда устанавливаете layer и layers на nil. В какой-то момент layer становится (nil) только для возврата к nil непосредственно после этого. Если все эти неактивные операции выкинуты, осталось мало что сделать.

Вы можете попытаться выяснить, так ли это, разобрав вашу скомпилированную функцию, используя disassemble.

...