añadir esto a las respuestas anteriores:
trabajo a través de la SICP section on Streams. Ofrece una buena explicación tanto de la llamada por nombre como de la llamada por necesidad. También muestra cómo implementarlos en Scheme. Por cierto, si usted está buscando una solución rápida que aquí hay una llamada por necesidad implementado en el esquema básico:
;; 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))
una muestra de ejecución:
> (define lazy (delay (+ 3 4)))
> (force lazy)
computing ... ;; Computes 3 + 4 and memoizes the result.
7
> (my-force lazy)
7 ;; Returns the memoized value.
ya he implementado llamada por necesidad, y cuando Lo estaba haciendo la primera implementación sin almacenamiento en caché, no tengo sentido para mí que el profesor me pida que haga algo que ya hice, porque quiero entender la verdadera diferencia entre llamar por necesidad y llamar por nombre – forellana
confirmé con el profesor, que es llamada por nombre, estaba confundido porque ya escribimos ese código y ahora nos está preguntando nuevamente por ese – forellana