“Applicazione: non una procedura” nelle procedure aritmetiche binarie

Ho una semplice definizione di Racket per moltiplicare i numeri binari insieme. Utilizza una ben collaudata definizione “addWithCarry” che accetta tre parametri: due elenchi e una cifra carry e restituisce la sum binaria. I numeri binari sono rappresentati come elenchi in ordine inverso.

Ho fatto un passo attraverso la linea di test con il debugger, e attraversa correttamente la ricorsione. Esegue i multBin ogni volta riducendo la y list in modo appropriato, quindi esegue le funzioni addWithCarry come previsto. Quando sale di nuovo sullo stack, lancia improvvisamente un’eccezione “application: not a procedure, prevede una procedura che può essere applicata agli argomenti” con il parametro ‘(0 0 0 1 0 1 1) che è il valore del più alto “x” aggiunta al totale. So che questo errore può verificarsi quando si tenta di applicare il risultato di una funzione come funzione con un parametro, ma non lo vedo qui. Guardando il debugger, tutto sembra funzionare perfettamente fino alla fine. Qualche idea?

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

Ecco la definizione 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)))))))) 

In questa riga, stai chiamando multBins con (cons 0 x) e (rest y) , e ottenendo alcuni risultati r , e quindi provando a chiamare r :

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

Lo stesso tipo di cose sta accadendo nella riga successiva, dove stai chiamando addWithCarry con alcuni argomenti, ottenendo un risultato r , e provando a chiamare r :

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

Presumibilmente il valore inapplicabile '(0 0 0 1 0 1 1) viene restituito da uno di questi.

In un caso molto semplificato, considera questa trascrizione da 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] 

Non hai menzionato quale editor / IDE / debugger stai usando, ma alcuni avrebbero dovuto renderlo un po ‘più facile da individuare. Ad esempio, quando carico il codice (meno la chiamata da test , di cui non ho la definizione, e con le definizioni di first e rest ), DrRacket evidenzia la posizione della chiamata offensiva:

codice errato evidenziato in DrRacket IDE

Mentre entrambe le chiamate problematiche che ho indicato devono essere corrette, l’errore che stai vedendo in questo momento si sta verificando nel secondo dei due.