Scala 什么是“点名”?

Scala 什么是“点名”?,scala,scheme,lazy-evaluation,evaluation,Scala,Scheme,Lazy Evaluation,Evaluation,我正在做一项家庭作业,要求我们用我们使用Scheme开发的特定语言实施一种名为“点名”的评估策略 我们收到了一封电子邮件,但我不明白“按姓名呼叫”是如何工作的,以及“按需呼叫”与“按需呼叫”有何不同?按需呼叫是“按姓名呼叫”的一种记忆版本,请参见 在“按名称调用”中,每次使用参数时都会对其进行求值,而在“按需要调用”中,第一次使用参数时会对其进行求值,并记录该值,以便随后无需重新求值。按名称调用是一种参数传递方案,在使用参数时对其进行求值,而不是在调用函数时对其进行求值。以下是伪C语言中的一个示

我正在做一项家庭作业,要求我们用我们使用Scheme开发的特定语言实施一种名为“点名”的评估策略


我们收到了一封电子邮件,但我不明白“按姓名呼叫”是如何工作的,以及“按需呼叫”与“按需呼叫”有何不同?

按需呼叫是“按姓名呼叫”的一种记忆版本,请参见


在“按名称调用”中,每次使用参数时都会对其进行求值,而在“按需要调用”中,第一次使用参数时会对其进行求值,并记录该值,以便随后无需重新求值。

按名称调用是一种参数传递方案,在使用参数时对其进行求值,而不是在调用函数时对其进行求值。以下是伪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.
}

使用参数表达式的当前值访问参数表达式时,会延迟计算参数表达式。

将此添加到上述答案中:

完成这项工作。它很好地解释了按姓名呼叫和按需要呼叫。它还展示了如何在Scheme中实现这些。顺便说一句,如果您正在寻找一个快速解决方案,这里有一个在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.

惰性计算最多只能计算一次,按名称调用是计算零,一次或多次。我不知道Scheme,但在没有惰性参数的Scala中,这种区别是完全准确的。不过,延迟和强制是R5R吗?实际上,至少和R3R一样古老。@sgm是的,它们是标准的一部分。我只是想展示它们是如何实现的。我已经实现了按需调用,当我在做第一个实现时没有缓存,教授让我做一些我已经做过的事情对我来说没有意义,因为我想了解按需呼叫和按姓名呼叫之间的真正区别,我向教授确认了这一点,即按姓名呼叫,我感到困惑,因为我们已经编写了代码,而现在他又要求我们这样做