如何找到 Scheme 调用 integer-less 的地方?

How to find where Scheme calls integer-less?

我正在做 exercise 2.29 from SICP,使用 MIT/GNU 方案(9.1.1 版)。目前我正在调试以下解决方案

(define (balanced mobile)
  ; weight-b returns weight of mobile if it is balanced, otherwise - negative value
  (define (weight-b mobile)
    (if (pair? mobile)
      (let ((lb (weight-b (branch-structure (left-branch mobile))))) ; compute left balance
        (if (< lb 0)
          -1 ; left submobile is not balanced, so this mobile too
          (let ((rb (weight-b (branch-structure (right-branch mobile))))) ; compute right balance
            (display "rb ") (display lb) (newline) ; DEBUG log
            (if (< rb 0)
              -1 ; right submobile is not balanced, so this mobile too
              (if (=
                (* lb (branch-length (left-branch mobile)))
                (* rb (branch-length (right-branch mobile)))
              )
                (+ lb rb) ; finally, completely balanced case, return total weight
                -1 ; submobiles are balanced, but torques are different
              )
            )
          )
        )
      )
    )
    mobile ; single weight is already balanced by itself
  )
  (> (weight-b mobile) 0)
)

它给我错误“作为第一个参数传递给无整数的对象 ((1 5) (1 5)) 不是正确的类型。”起初,from name integer-less? 假设它是 (< lb 0)(< rb 0) 的问题,但我记录了 lb 和 rb,它们是整数。

我的代码没有显式调用 integer-less?,所以我不知道该去哪里找。你能告诉我什么是 ingeger-less?,在我的程序中哪里可以找到它,或者一般来说,如何在发生错误的 Scheme 代码中找到行号。

我在 REPL 中尝试 integer-less?,但它以“未绑定变量:无整数?”响应,谷歌搜索也不成功。

我猜 integer-less? 是你方案实现的一部分,当 < 比较整数时被调用。如果是这样,您将需要查看方案的源代码。

如果是这种情况,那么它可能会抱怨,因为它希望 < 的两个参数都是整数,但至少有一个不是。这可能是因为 weight-b 并不总是 return 整数。

我不认为 (if (pair? mobile) ... 有替代子句,所以如果 mobile 不是一对那么 weight-b 的结果可能是未定义的(确切的行为取决于版本您正在使用的方案)。