Aggiungere questo le risposte di cui sopra:
lavoro attraverso la SICP section on Streams. Fornisce una buona spiegazione sia di call-by-name che di call-by-need. Mostra anche come implementare quelli in Scheme. A proposito, se siete alla ricerca di una soluzione rapida: ecco un call-by-need attuato in regime di base:
;; 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))
Un esempio di esecuzione:
> (define lazy (delay (+ 3 4)))
> (force lazy)
computing ... ;; Computes 3 + 4 and memoizes the result.
7
> (my-force lazy)
7 ;; Returns the memoized value.
fonte
2010-06-03 05:09:20
ho già implementato chiamata dal bisogno, e quando lo stavo facendo la prima implementazione era senza cache, non ho senso per me che il professore mi chieda di fare qualcosa che ho già fatto, perché voglio capire la vera differenza tra call by need e call by name – forellana
ho confermato con il professore, che è chiamato per nome, ero confuso perché già scriviamo quel codice e ora ci sta chiedendo di nuovo per quello – forellana