我有一个简单的球拍定义,用于将二进制数相乘。它使用经过良好测试的“ addWithCarry”定义,该定义带有三个参数:两个列表和一个进位数字,并返回二进制和。二进制数以相反的顺序表示为列表。
我使用调试器逐步完成了测试行,并且正确地进行了递归。每次适当缩小y列表时,它都会执行multBins,然后按预期进行addWithCarry函数。当它返回堆栈时,突然抛出异常“应用程序:不是过程,应为可以应用于自变量的过程”,其参数为'(0 0 0 1 0 1 1),这是最高值“ x”添加到总数中。我知道当您尝试将函数结果应用为带有参数的函数时,会发生此错误,但是我在这里看不到此错误。看着调试器,直到最后一切似乎都运转良好。有任何想法吗?
(define (multBins x y)
(cond
((null? y) '() )
((= (first y) 0) ((multBins (cons 0 x) (rest y))))
(#t ((addWithCarry x (multBins (cons 0 x) (rest y)) 0)))))
(test (multBins '(1 0 1 1)'(1 1 0 1))'(1 1 1 1 0 0 0 1))
这是addWithCarry定义:
(define (addWithCarry x y carry)
(cond
((and (null? x)(null? y)) (if (= carry 0) '() '(1)))
((null? x) (addWithCarry '(0) y carry))
((null? y) (addWithCarry x '(0) carry))
( #t (let ((bit1 (first x))
(bit2 (first y)))
(cond
((= (+ bit1 bit2 carry) 0) (cons 0 (addWithCarry (rest x) (rest y) 0)))
((= (+ bit1 bit2 carry) 1) (cons 1 (addWithCarry (rest x) (rest y) 0)))
((= (+ bit1 bit2 carry) 2) (cons 0 (addWithCarry (rest x) (rest y) 1)))
( #t (cons 1 (addWithCarry (rest x) (rest y) 1))))))))
PIPIONE