2012-10-02 104 views
0

我在計劃計劃函數返回意外的值

(define (m-m f) 
     (let ((count 0)) 
     (define (h-m-c?) count) 
     (define (r-c) (begin (set! count 0) count)) 
     (define (m-f m) 
     (cond ((eq? m 'h-m-c?) (h-m-c)) 
       ((eq? m 'r-c) (r-c)) 
       (else (set! count (+ 1 count)) f))) 
     m-f)) 

有一個函數,其中M-F是返回的功能。

然而,而不是返回一個值,則返回

#<procedure:m-f> 

這似乎在與代碼沒有錯誤,那麼爲什麼不這樣返回可用值?

+0

作爲一個值的過程有什麼問題? – dyoo

回答

2

你告訴它返回m-f。這是您定義的過程的名稱,因此它將返回該過程。要使用此返回值,您需要將其分配給另一個變量。

(define thing1 (m-m 'unused)) 
(define thing2 (m-m 'who-cares)) 
(thing1 'h-m-c?) 
(thing1 'increment) 
(thing1 'h-m-c?) 
(thing2 'h-m-c?) 

其他一些評論:

?結束

程序名稱用於該報告真/假謂詞。

你不需要begin(r-c)。過程體允許多個表達式,並按begin的順序執行它們。

爲什麼您沒有爲count遞增的情況定義一個函數,就像您對其他情況一樣?

使用默認值進行遞增似乎不合適,您應該要求具體的m參數。

f參數的用途是什麼?它唯一使用的是在增量時返回? count的新值不會是更有用的返回值嗎?它似乎是打算成爲實例的「名字」;如果是這樣,也許你應該添加一個新的操作來返回名稱,而不是在增量時執行此操作。

編輯:

基於下面的答案,我懷疑你濫用f參數。這可能應該是您在執行增量時調用的函數。因此,您需要將其作爲lambda表達式提供,並返回(f)而不僅僅是f

+0

謝謝Barmar,我是新來的計劃。我以錯誤的方式使用了該程序。也感謝您的提示。此過程計算另一個過程被調用的次數,因此它將過程作爲參數。例如,給出這些調用mm:(定義mm(製造監控(sqrt 100))) ;(mm'重置計數) ;(mm(sqrt 100)) ;(mm'how-many-來電?)再次感謝您的提示! – Matt

+0

查看最新編輯。 – Barmar