“Aplicación: no es un procedimiento” en procedimientos aritméticos binarios

Tengo una definición simple de Racket para multiplicar números binarios. Utiliza una definición bien probada de “addWithCarry” que toma tres parámetros: dos listas y un dígito carry y devuelve la sum binaria. Los números binarios se representan como listas en orden inverso.

Pasé por la línea de prueba con el depurador, y se procesa correctamente la recursividad. Realiza multBins cada vez que reduce la lista y, según corresponda, y luego lleva a cabo las funciones addWithCarry como se esperaba. A medida que sube una copia de seguridad de la stack, lanza de repente una “aplicación de excepción: no es un procedimiento, se espera un procedimiento que pueda aplicarse a argumentos” con el parámetro “(0 0 0 1 0 1 1) que es el valor de la más alta “x” agregado al total. Sé que este error puede ocurrir cuando intentas aplicar el resultado de una función como una función con un parámetro, pero no veo esto aquí. Viendo el depurador, todo parece funcionar perfectamente hasta el final. ¿Algunas ideas?

(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)) 

Aquí está la definición de 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)))))))) 

En esta línea, llamas a multBins con (cons 0 x) y (rest y) , y obtienes algún resultado r , y luego tratas de llamar a r :

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

El mismo tipo de cosas sucede en la siguiente línea, donde llama a addWithCarry con algunos argumentos, obtiene un resultado r , y trata de llamar a r :

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

Presumiblemente, uno de estos devuelve el valor inaplicable '(0 0 0 1 0 1 1) .

En un caso muy simplificado, considere esta transcripción de 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] 

No mencionó qué editor / IDE / depurador está utilizando, pero algunos deberían haber hecho esto un poco más fácil de detectar. Por ejemplo, cuando cargo su código (menos la llamada a test , cuya definición no tengo, y con las definiciones de first y rest ), DrRacket resalta la ubicación de la llamada ofensiva:

código incorrecto resaltado en DrRacket IDE

Si bien las dos llamadas problemáticas que he señalado deben corregirse, el error que está viendo en este momento se produce en el segundo de los dos.