Что такое “Вызов по имени”?

Я работаю над присвоением домашней работы, где нас просят реализовать стратегию оценки, названную "вызовом по имени" на определенном языке, который мы разработали (использование Схемы).

Нам дали пример в Scala, но я не понимаю, как "вызов по имени" работает и как это отличается от "вызова по необходимости"?

15
задан Elar 28 February 2018 в 12:21
поделиться

3 ответа

Вызов по необходимости - это мемоизированная версия вызова по имени (см. википедию ).

При вызове по имени аргумент вычисляется каждый раз, когда он используется , тогда как при вызове по необходимости он оценивается при первом использовании, и значение записывается так, чтобы впоследствии его не нужно пересматривать.

26
ответ дан 1 December 2019 в 00:59
поделиться

Вызов по имени - это схема передачи параметров, при которой параметр оценивается при его использовании, а не при вызове функции. Вот пример на псевдо-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.
}

Выражение аргумента лениво вычисляется при доступе с использованием текущих значений выражения аргумента.

11
ответ дан 1 December 2019 в 00:59
поделиться

Добавьте это к приведенным выше ответам:

Пройдите через раздел SICP в потоках . Он дает хорошее объяснение как по имени, так и по запросу. Он также показывает, как реализовать их в схеме. Кстати, если вы ищете быстрое решение, вот базовая функция вызова по необходимости, реализованная в схеме:

 ;; 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.
3
ответ дан 1 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: