如何找到 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
的结果可能是未定义的(确切的行为取决于版本您正在使用的方案)。
我正在做 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
的结果可能是未定义的(确切的行为取决于版本您正在使用的方案)。