- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在根据在线类(class)学习 sicp,但被它的讲义弄糊涂了。在讲义中,applicative order似乎等于cbv,normal order等于cbn。
但是wiki指出,除了评估顺序(从左到右、从右到左或同时),应用顺序和 cbv 之间存在差异:
Unlike call-by-value, applicative order evaluation reduces terms within a function body as much as possible before the function is applied.
我不明白减少是什么意思。 applicative order 和 cbv 都不会在进入函数评估之前获取变量的确切值。
而对于正常的order和cbv,我根据wiki就更加糊涂了.
In contrast, a call-by-name strategy does not evaluate inside the body of an unapplied function.
我想这是否意味着正常顺序会在未应用的函数体内求值。怎么可能?
非常感谢?
最佳答案
应用顺序(不考虑评估顺序,在方案中未定义)将等同于 cbv。函数调用的所有参数在进入函数体之前都经过全面评估。这是给出的例子SICP
(define (try a b)
(if (= a 0) 1 b))
如果您定义函数,并使用这些参数调用它:
(try 0 (/ 1 0))
当使用应用顺序评估(方案中的默认值)时,这将产生错误。它会评估(/1 0)
进入正文之前。对于正常的顺序评估,这将返回 1。参数将在不评估的情况下传递给函数主体,并且 (/1 0)
永远不会被评估,因为 (= a 1)
为真,避免了错误。
在您链接到的文章中,当他们提到 Applicative 和 Normal order evaluation 时,他们在谈论 Lambda 微积分。本文中wiki我认为它解释得更清楚。减少意味着将减少规则应用于表达式。 (也在链接中)。
α-conversion: changing bound variables (alpha);
β-reduction: applying functions to their arguments (beta);
正常顺序:
The leftmost, outermost redex is always reduced first. That is, whenever possible the arguments are substituted into the body of an abstraction before the arguments are reduced.
点名
As normal order, but no reductions are performed inside abstractions. For example λx.(λx.x)x is in normal form according to this strategy, although it contains the redex (λx.x)x.
A normal form is an equivalent expression that cannot be reduced any further under the rules imposed by the form
在同一篇文章中,他们谈到了按值调用
Only the outermost redexes are reduced: a redex is reduced only when its right hand side has reduced to a value (variable or lambda abstraction).
和应用顺序:
The leftmost, innermost redex is always reduced first. Intuitively this means a function's arguments are always reduced before the function itself.
您可以阅读我链接的文章,了解有关 lambda 演算的更多信息。还有 Programming Language Foundations
关于scheme - applicative-order/call-by-value 和 normal-order/call-by-name 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26522960/
我正在使用 PLT 方案 (DrScheme)。我想加载从 here 获得的文件.要加载文件,我进入 PLT Scheme 并在交互窗口(或底部窗口)中输入(加载“simply.scm”),然后按 E
根据我的阅读,Scheme 中的符号不区分大小写 - 即 (eq? 'Hello 'hello) 评估为 #t (因为两者都由符号 'hello 表示,并且 scheme 具有两个具有相同名称的符
我正在尝试在 Scheme 中完成一个有限状态机。问题是,我不确定如何告诉它应该测试哪些字符。如果我想测试字符串“abc112”,我该怎么做? 代码如下: #lang racket (defin
我正在尝试做我的家庭作业,并通过一些示例代码进行破解,我看到了这一行: [(:+ (:or VAR)) (token-VAR (string->symbol lexeme))] 这是来自计算器中
我在 MIT/GNU Scheme 中运行了这个: (define x (+ 2 3)) 然后解释器打印: ;Value: x 但是根据我的教科书,define 表达式返回的值应该是未定义的。为什么解
考虑以下定义数字树的 BNF。请注意,树可以是叶子、具有一个子树的节点 1 或节点 2有两个子树。 tree ::= (’leaf number) | (’node-1 tree) | (’node-
(show-data 'YHOO :config 'my-config) 我看到了一些 Scheme 代码(在 Guile 中),如上面的行,并且对 colon 语法 :config 感到困惑。 这有
我目前正在尝试理解方案中流的概念。例如,我应该编写一个函数 fibonacci,它返回斐波那契数作为流表示形式。 函数的期望输出/用法如下所示: > (define a (finbonacci)) >
我想创建一个可以确定方案中任意函数定义的函数。如果我们将这样的函数称为“定义”,它会这样工作: (define (triple x) (* 3 x)) (definition triple) woul
在 Common Lisp 中,当我想根据 Common Lisp 实现使用不同的代码片段时,我可以使用 *features* 和提供的 #+ 和 #- 符号来检查给定功能的可用性并相应地进行。例如(
我正在学习 Scheme,具有 C/C++ 背景。我非常习惯于将相关的值组合到结构中,而且我发现 Scheme 的记录在这方面工作得很好。 如果发现自己经常这样做以避免函数体中的视觉噪音: (defi
在 Scheme R7RS 中,有 load 和 include 两种形式。 包含描述为: Semantics: Both include and include-ci take one or mor
我无法理解 Scheme 中收集器函数的使用。我正在使用“The Little Schemer”一书(Daniel P. Friedman 和 Matthias Felleisen 着)。一个带有一些
我知道您可以使用 (read) 来获取用户输入的表达式,但是 (read) 只会获取第一个表达式,然后对任何内容进行评估。我想知道是否有任何方法可以读取整行用户输入,也许将所述行转换为列表? (let
我正在重新熟悉 Scheme,我遇到了一个问题,这可能反射(reflect)了我的根本误解。 假设我在 Scheme 中执行以下操作(在这种情况下使用 Guile,但在 Chicken 中也是如此):
这是我目前正在自学的链接 Scheme,http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-1.html 据作者介绍, 然后我尝试了
假设我有这样的事情: (define pair (cons 1 (lambda (x) (* x x)) 如果我想返回这对的前对象,我会这样做: (car pair) 它返回 1。但是当对象是一个过程
我编写了以下示例,以尝试在 Chibi Scheme 0.5.3 中使用 R7RS 库: (define-library (example hello) (export hello-world
CODE SNIPPET 1 和 CODE SNIPPET 2 有什么区别? ;CODE SNIPPET 1 (define i 0) (do ()
长度为 n 的 k 元项链是一个长度为 n 的有序列表,其项目是从长度为 k 的字母表中抽取的,它是所有共享轮换排序的列表中按字典顺序排列的第一个列表。 例子: (1 2 3) 和 (1 3 2) 是
我是一名优秀的程序员,十分优秀!