Что такое "Звонок по имени"?
Я работаю над домашним заданием, и профессор попросил меня реализовать стратегию оценки, названную "вызов по имени" в схеме на определенном языке, который мы разработали, и он привел пример в http://www.scala-lang.org/node/138 на языке scala, но я не понимаю, в чем состоит стратегия вызова по названию? какие различия у него есть с вызовом?
спасибо, приветствия
Ответы
Ответ 1
Call-by-need - это memoized версия call-by-name (см. wikipedia).
При вызове по имени аргумент оценивается каждый раз, когда он используется, тогда как по запросу по запросу он оценивается при первом использовании, а значение записывается так, что впоследствии оно не должно быть повторно -evaluated.
Ответ 2
Вызов по имени - это схема передачи параметров, где параметр оценивается, когда он используется, а не при вызове функции. Здесь пример в псевдо-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.
}
Выражение аргумента лениво оценивается при доступе с использованием текущих значений выражения аргумента.
Ответ 3
Добавьте это к приведенным выше ответам:
Работайте через раздел SICP по потокам. Это дает хорошее объяснение как по имени, так и по требованию. Он также показывает, как реализовать их в схеме. BTW, если вы ищете быстрое решение здесь, это базовый вызов по требованию, реализованный на схеме:
;; 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.