亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

二進制算術過程中的“應用程序:不是過程”

二進制算術過程中的“應用程序:不是過程”

ABOUTYOU 2019-10-12 13:41:02
我有一個簡單的球拍定義,用于將二進制數相乘。它使用經過良好測試的“ 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))))))))
查看完整描述

1 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

在這一行中,您multBins使用(cons 0 x)和進行調用(rest y),并得到一些結果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 /調試器,但是其中一些應該使它更容易發現。例如,當我打開你的代碼(減去調用test,其定義我沒有,用的定義first和rest),DrRacket凸顯違規調用的位置:

http://img1.sycdn.imooc.com//5da1679000012f3b09580763.jpg

雖然我已經指出了兩個有問題的調用,但都需要修復,但是您現在看到的錯誤是在這兩個中的第二個發生。


查看完整回答
反對 回復 2019-10-12
  • 1 回答
  • 0 關注
  • 397 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號