Common Lisp - 我的调试器出了什么问题?

Common Lisp - What's wrong with my debugger?

我正在尝试 运行 此代码:

(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 for https://adventofcode.com/2019/day/8)

返回 nil,不知道为什么(文件包含一行 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),没有别的吗?而且几乎没有定义变量!

此外,如果我按 "e" 来计算某些表达式,即使有时某些变量没有出现在堆栈跟踪中,在这种情况下它会报告它们根本没有定义。

关于调试器为什么会出现这种奇怪行为的任何想法?或者只是我的代码完全坏了?尽管如此,调试器在这种情况下如果有效的话将是最有帮助的:)

可能是你的编译器太聪明了。当您仔细观察时,由于反转的 push 形式,您只能将 layerlayers 设置为 nil。有一次,layer 变成了 (nil),之后又直接恢复为 nil。如果所有这些 no-ops 都被扔掉了,那么剩下的步骤就不多了。

您可以尝试使用 disassemble.

反汇编已编译的函数来了解是否属于这种情况