2010-06-03 328 views
14

我正在做一個家庭作業,我們被要求實施一種名爲「按姓名打電話」的評估策略,並使用我們開發的某種語言(使用Scheme)。什麼是「按名稱呼叫」?

我們獲得了example in Scala,但我不明白「名稱呼叫」是如何工作的以及它與「按需呼叫」有何不同?

回答

23

按需呼叫是按名稱的備忘錄版本(請參閱wikipedia)。

在名稱調用中,每次使用時,參數的評估值爲,而在需要調用時,首次使用該參數時會進行評估,並記錄該值以便隨後需要不被重新評估。

+0

我已經實施的需要呼叫,而當我是這樣做的第一個實現沒有緩存,我不明白教授要求我做一些我已經完成的工作,因爲我想了解真正的需求調用和按名稱調用 – forellana 2010-06-03 14:09:34

+0

我向教授證實,這是名字叫,我很困惑,因爲我們已經寫了代碼,現在他又問我們那 – forellana 2010-06-03 21:02:13

9

通過名稱調用是一種參數傳遞方案,其中參數在使用時進行評估,而不是在調用該函數時評估。這是僞C中的一個示例:

int i; 
char array[3] = { 0, 1, 2 }; 

i = 0; 
f(a[i]); 

int f(int j) 
{ 
    int k = j; // k = 0 
    i = 2;  // modify global i 
    k = j;  // The argument expression (a[i]) is re-evaluated, giving 2. 
} 

當使用參數表達式的當前值進行訪問時,參數表達式會被延遲評估。通過SICP section on Streams

工作:

+0

懶惰評估至多評估一次,按名稱評估爲零,一次或多次。 – 2010-06-03 03:11:50

+0

不一定是這樣的:http://en.wikipedia.org/wiki/Lazy_evaluation – 2010-06-03 03:36:16

+0

我不瞭解Scheme,但是在Scala(沒有惰性參數)中,這種區別是完全準確的。 – 2010-06-03 14:15:59

2

此添加到上述答案。它給出了名稱和按需呼叫的很好解釋。它還展示瞭如何在Scheme中實現這些功能。順便說一句,如果你正在尋找在這裏一個快速的解決方案是一個基本呼叫按需要在方案實施:

;; Returns a promise to execute a computation. (implements call-by-name) 
;; Caches the result (memoization) of the computation on its first evaluation 
;; and returns that value on subsequent calls. (implements call-by-need) 
(define-syntax delay 
    (syntax-rules() 
     ((_ (expr ...)) 
     (let ((proc (lambda() (expr ...))) 
      (already-evaluated #f) 
      (result null)) 
     (lambda() 
      (if (not already-evaluated) 
       (begin 
       (display "computing ...") (newline) 
       (set! result (proc)) 
       (set! already-evaluated #t))) 
      result))))) 

;; Forces the evaluation of a delayed computation created by 'delay'. 
(define (my-force proc) (proc)) 

樣品運行:

> (define lazy (delay (+ 3 4))) 
> (force lazy) 
computing ... ;; Computes 3 + 4 and memoizes the result. 
7 
> (my-force lazy) 
7 ;; Returns the memoized value. 
+0

'delay'和'force'是r5rs,但?實際上,至少和r3rs一樣古老。 – 2010-06-03 06:26:11

+0

@sgm是的,它們是標準的一部分。我只是想展示他們如何實施。 – 2010-06-03 09:21:09

相關問題