二进制算术程序中的“应用程序:不是程序”

我有一个简单的球拍定义,用于将二进制数字相乘。 它使用一个经过充分testing的“addWithCarry”定义,它有三个参数:两个列表和一个进位数字,并返回二进制和。 二进制数字以相反的顺序表示为列表。

我用debugging器遍历testing线,并正确执行recursion。 它会在每次缩小y列表时执行multBins,然后按照预期执行addWithCarry函数。 当它重新堆栈时,它突然抛出一个exception“应用程序:不是一个过程,期望可以应用于参数的过程”,参数“(0 0 0 1 0 1 1)”是最高的值“x”加在总数上。 我知道这个错误可能会发生,当你试图将一个函数的结果作为一个函数与一个参数,但我没有看到这里。 看着debugging器,一切似乎都完美地工作,直到最后。 有任何想法吗?

(define (multBins xy) (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 xy 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)))))))) 

在这一行中,你用(cons 0 x)(rest y)调用multBins ,得到一些结果r ,然后试图调用r

 ((= (first y) 0) ((multBins (cons 0 x) (rest y)))) ; ^ ^ ; +--- function application -----+ 

在下一行发生同样的事情,你用一些参数调用addWithCarry ,得到结果r ,并试图调用r

 (#t ((addWithCarry x (multBins (cons 0 x) (rest y)) 0))))) ; ^ ^ ; +-------------- function application -------------+ 

假设不适用的值'(0 0 0 1 0 1 1)由其中之一返回。

在一个非常简化的情况下,请考虑DrRacket REPL的这个抄本:

 > (define (value) ; a function that returns the '(0 0 0 1 0 1 1)) ; same value that yours should > (value) ; calling it produces the value (0 0 0 1 0 1 1) > ((value)) ; calling it and then calling ; return value causes the same ; error that you're seeing ; application: not a procedure; ; expected a procedure that can be applied to arguments ; given: (0 0 0 1 0 1 1) ; arguments...: [none] 

你没有提到你使用的是什么编辑器/ IDE /debugging器,但有些应该使这个更容易被发现。 例如,当我加载你的代码(减去要test的调用,我没有的定义,以及firstrest定义)时,DrRacket突出了这个调用的位置:

在DrRacket IDE中突出显示错误的代码

虽然我指出的两个有问题的电话都需要解决,但是现在你所看到的错误发生在二者中的第二个。