应用顺序/按值调用和正常顺序/按名称调用差异

2024-01-10

背景

我正在根据在线课程学习 sicp,并对其讲义感到困惑。在讲义中,应用顺序似乎等于 cbv,正常顺序等于 cbn。

困惑

But the wiki http://en.wikipedia.org/wiki/Evaluation_strategy#Applicative_order指出,除了评估顺序(从左到右、从右到左或同时)之外,应用顺序和 CBV 之间也存在差异:

与按值调用不同,应用顺序求值在应用函数之前尽可能地减少函数体内的项。

我不明白减少是什么意思。在进入函数求值之前,applicative order 和 cbv 不是都会获取变量的准确值吗?

对于正常的订单和cbv,根据wiki http://en.wikipedia.org/wiki/Evaluation_strategy#Normal_order.

相反,按名称调用策略不会在未应用的函数体内进行计算。

我想这是否意味着正常顺序将在未应用的函数体内进行评估。怎么会这样?

Question

  1. 有人可以给我这四种策略的一些更具体的定义吗?
  2. 有人可以使用任何编程语言展示每种策略的示例吗?

多谢?


适用顺序(不考虑 评估顺序(在方案中未定义)将等同于 CBV。函数调用的所有参数在进入函数体之前都会被完全评估。这是给出的例子 SICP

(define (try a b)
  (if (= a 0) 1 b))

如果您定义该函数,并使用这些参数调用它:

(try 0 (/ 1 0))

当使用应用顺序评估(方案中的默认值)时,这将产生错误。它将评估(/ 1 0)在进入身体之前。当使用正常顺序评估时,这将返回 1。参数 将在不评估的情况下传递给函数体并且(/ 1 0)永远不会被评估,因为(= a 1)为真,避免了错误。

在您链接到的文章中,当他们提到应用和正常顺序评估时,他们正在谈论 Lambda 演算。在本文中wiki https://en.wikipedia.org/wiki/Lambda_calculus#Lambda_calculus_and_programming_languages我认为它解释得更清楚。 减少意味着对表达式应用减少规则。 (也在链接中)。

α-转换:改变绑定变量(alpha);

β-约简:将函数应用于其参数(beta);

正常顺序:

最左边、最外面的 redex 总是首先被减少。也就是说,只要有可能,在减少参数之前,都会将参数替换到抽象的主体中。

直呼姓名

按照正常顺序,但在抽象内部不执行任何缩减。例如,根据此策略,λx.(λx.x)x 是正规形式,尽管它包含 redex (λx.x)x。

范式是一个等价表达式,根据该形式所施加的规则不能进一步简化

在同一篇文章中,他们谈到了按值调用

仅减少最外层的 Redex:仅当 Redex 的右侧减少为某个值(变量或 lambda 抽象)时,Redex 才会减少。

和应用顺序:

最左边、最里面的 redex 总是首先被减少。直观上,这意味着函数的参数总是在函数本身之前被减少。

您可以阅读我链接的文章以获取有关 lambda 演算的更多信息。 还编程语言基础 http://homepage.cs.uiowa.edu/%7Eslonnegr/plf/Book/Chapter5.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应用顺序/按值调用和正常顺序/按名称调用差异 的相关文章

  • Perl 中的列表运算符优先级

    我正在读 Beginning Perl 一书 它给出了以下两条语句 print Test one 6 gt 3 3 gt 4 n print Test two 6 gt 3 and 3 gt 4 n 第一行不打印任何内容并换行 第二行打印
  • 传递给过程的列表转换为过程内列表的列表

    我正在 DrRacket 上调试这段代码 lang racket define last element on list lambda l cond null l null cdr l car l else last element on
  • Mysql 或/和优先级?

    我想知道或 和如何工作 例如 如果我想获取 display 1 的所有行 我只能做WHERE tablename display 1 如果我想要显示 1 或 2 的所有行 我只能做WHERE tablename display 1 or t
  • 经验丰富的计划者的 get-first、get-next 和 waddle 函数

    define get first lambda l call with current continuation lambda here set leave here waddle l leave quote define get firs
  • “入队”和“出队”之间的区别

    有人可以解释一下主要区别吗 我对任何语言编程中的这些函数都没有明确的了解 C 和 C 等编程语言中的一些基本数据结构是堆栈和队列 堆栈数据结构遵循 先进后出 策略 FILO 其中插入或 推入 堆栈的第一个元素是最后一个从堆栈中删除或 弹出
  • 与编程语言/API 相关的常用“语义”的简单定义?

    今天我突然想到 虽然我在提到语言元素和命名约定时已经采用并且不经常使用 语义 一词 但我对正式定义没有任何感觉 我试图在编程领域找到一个正式的定义 http en wikipedia org wiki Formal semantics of
  • 我用带有垃圾收集器的语言构建了一个解释器。我需要一个用于解释器的垃圾收集器吗?

    这是一个幼稚的问题 但在我迄今为止看到的教程中并没有拼写清楚 如果我在一种高级语言 不是 C C 等 之上构建一个解释器 并且它有一个垃圾收集器 是否有必要为解释器本身制作一个 如果答案是肯定的 那一定是同一类宿主吧 即 如果主机是标记 清
  • 方案功能[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图解释这个方案函数的作用 define y s lis cond null lis equal s car lis lis else
  • 大括号 {} 替换 Racket 中的“开始”

    是否可以有一个宏 使用大括号 来表示一个语句块 从而替换 begin 关键字 因此 代替 if condition begin statement1 statement2 statement3 statement4 else stateme
  • 链接的 ostream 内部行为及其在 MSVC 上的结果(与 Clang 相比)

    MSVC 与 GCC Clang 的流 内部字符串和操作排序问题 大家好 我最近刚刚开始更认真地使用 MSVC 来完成我的一个跨平台项目 同时通过以下方式测试输出chainedSTD 流 IE 一系列的obj foo lt lt endl
  • Scheme/Lisp 嵌套循环和递归

    我正在尝试解决方案中的一个问题 该问题要求我使用嵌套循环或嵌套递归 例如我有两个列表 我必须检查它们的笛卡尔积的条件 解决这些类型问题的最佳方法是什么 有关如何简化这些类型的函数的任何指示吗 I ll elaborate a bit sin
  • 语言是如何以及为何形成的/是否有任何正在发展的语言表现出希望? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 生成 C / C++ 代码时表达式的结合性和优先级?

    我编写了一个生成 AST 的基本编译器 正确考虑了表达式中运算符的优先级 但是 在执行代码生成以生成 C 代码时 我不确定如何处理括号的使用 对于这个表达式 A B c AST如下 A B C 应该正确生成包含括号的前一个表达式 但是如果第
  • 如何使用 javascript 更改文件扩展名

    有谁知道在 Javascript 中更改文件扩展名的简单方法吗 例如 我有一个带有 first docx 的变量 但我需要将其更改为 first html 这将改变字符串包含文件名 let file first docx file file
  • 必须为开发人员设定目标,即使目标不起作用[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 It is 大致接受 http www joelonsoftware com news 20020715 html that 设定可衡量的目标 htt
  • 你为什么决定“反对”使用 Erlang?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 你是否真的 尝试过 意味着在其中编程 而不仅仅是阅读有关它的文章 Erlang并决定在项目中不
  • 编译成 C/C++ 源代码的编程语言? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么《小阴谋家》中的所有 lambda 表达式都是如此?

    在从 SICP 学习了一些计划之后 我开始阅读 小计划 我觉得这本书很有趣 并且已经完成了大约四分之一 我注意到我可以在不使用 lambda 的情况下编写许多 大多数 全部 解决方案 而 The Little Scheduleralways
  • 为什么随机不那么随机?

    有人可以解释一下现代编程语言 java c python javascript 如何应对随机性的限制以及这些限制 例如基于时间的种子 的起源 即 如果它们是由底层操作系统和基于英特尔的硬件强加的 基本上我想了解为什么没有适当的硬件就没有真正
  • 当一种语言是另一种语言的平行超集时,这意味着什么?

    我正在阅读关于实时并发 C 的期刊文章 http link springer com article 10 1007 2FBF00365999 并且它在摘要中提到 因此你们中的任何人都可以通过该链接查看上下文 Concurrent C 是

随机推荐

  • ggplot 中具有对数刻度的等坐标和方形纵横比

    我试图生成一组具有对数轴和两个轴上相同坐标以及正方形纵横比的图 让我们考虑以下假设数据 set seed 1 x lt rnorm 30 50 20 y lt x 20 rnorm 30 0 10 通过使用下面的代码 我获得了一个矩形图 p
  • std::enable_if 或 SFINAE 用于迭代器或指针

    我想写一个构造函数MyClass需要一个参数 我希望只有当参数是一个时才编译pointer or an iterator 有的东西iterator traits 如何实现这一目标 遗憾的是 没有标准的方法来检测一个类是否模型Iterator
  • 在 VS C++ 6.0 中,什么调试工具可以很好地查找内存泄漏的位置?

    我的程序最终消耗了所有内存并崩溃 浏览代码 我找不到任何突出的东西可以做到这一点 您可以修改代码以使用调试版本吗malloc and free 如果是 请检查 malloc dbg http msdn microsoft com en us
  • 将 .cache 文件夹文件路径从绝对路径更改为相对路径。是否可以?

    来自我之前的问题AWS Amplify 控制台中的 Gatsby cache 文件夹 https stackoverflow com questions 57025169 gatsby cache folder in aws amplify
  • 如何用 cabal 建立一个独立的库?

    我有一个库 它依赖于其他一些库 当然还有 haskell 运行时 它导出 C API 我想以一种完全独立的方式构建它 并且用户不会为安装 haskell cabal 和所有依赖项而烦恼 它是完全独立的 用户不会为安装 haskell cab
  • JAVA日期格式“dd/MM/yyyy”和“dd/mm/yyyy”有什么区别? [复制]

    这个问题在这里已经有答案了 在为 java 项目编写代码时 我使用了日期格式 日 月 年 但另一位为同一个项目编写代码的同事使用了 日 月 年 发生格式和不匹配 我还观察到数据库日期格式可以很好地工作 日 月 年 不与 日 月 年 所以我需
  • libpcap:pcap_breakloop() 导致内存泄漏

    使用 Linux 时pthreads and libpcap我在使用时注意到一些奇怪的行为pcap breakloop 我的目标如下 打开一个将运行的新线程pcap loop并处理捕获的数据包 而主线程将执行其他操作 当收到信号 SIGIN
  • GIDSignIn 设置approval_prompt

    问题在于 Google 仅在用户注销应用程序并重新登录后才要求离线访问 Reading this http www riskcompletefailure com 2013 12 are you using approvalpromptfo
  • C 包括防护[重复]

    这个问题在这里已经有答案了 When file1 c包括inc h 包含包含守卫 ifndef INC H 第一次 define INC H被执行 但现在 当另一个file2 c包括相同的inc h 是宏INC H已经定义了 都是同一个故事
  • Linq:选择属性集合

    我有两节课 public class Person public int Id get set public string Name get set public List
  • 是什么原因导致错误“_pickle.UnpicklingError:无效的加载密钥,''。”?

    我正在尝试在数组中存储 5000 个数据元素 这 5000 个元素存储在现有文件中 因此它不为空 但我收到错误 IN def array name puntos df4 m open name rb v 5000 m seek 5000 i
  • “NoneType”对象没有属性“remove_roles”Discord.py

    Keep getting an error for the reaction remove just copy pasted my whole code minus the client id cause it might help I h
  • 为什么我的 Promise 数组在调用 Promise.all() 之前运行?

    我正在尝试创建 Promise 数组 然后使用 Promise all 解析它们 我正在使用 got 它返回一个承诺 我的代码可以工作 但我不完全理解如何工作 这里是 const got require got const url myUr
  • 在 AngularJS 中执行 ng-repeat 内的函数

    我想在 ng repeat 中执行一个函数来检索一些其他数据来显示 例如 我有一份公寓列表 我使用以下方式显示此列表ng repeat 比我想向业主展示的每套公寓 这不是u Apartments So my getInq函数调用服务来获取指
  • Android 驱动程序 JDBC PostgreSQL [重复]

    这个问题在这里已经有答案了 我正在尝试使用 JDBC 驱动程序将我的 Android 应用程序连接到服务器 PostgreSQL 但出现以下错误 java lang ClassNotFoundException org postgresql
  • python 和 networkX keyerror

    我在 python 中遇到这个问题 python 不断给我一个关键错误 重量 g add edge 1 3 weight 2 5 g 1 2 weight 1 5 for n1 n2 attr in g edges data True pr
  • 将 PILLOW 图像转换为 StringIO

    我正在编写一个程序 它可以接收各种常见图像格式的图像 但需要以一种一致的格式检查它们 什么图像格式并不重要 主要是它们都是相同的 由于我需要转换图像格式然后继续处理图像 因此我不想将其保存到磁盘 只需转换它并继续 这是我使用 StringI
  • 编写一个简单的 cron 作业来运行 Java 类

    如何从头开始编写一个 cron 作业来运行 java 类 或者编写一个嵌入 Java 代码来运行的 cron 作业类 以及如何设置计时器每隔一分钟 例如 运行该 cron 作业 注意 完全是 Linux 初学者 这是运行测试作业的示例 sh
  • JNA:结构类中 getFieldOrder() 的用途是什么

    我正在尝试调用 dll 文件中存在的 C 函数 C 函数通过引用将结构对象作为参数 并且函数将在该函数中赋值 因此 在我的 java 应用程序中 为了将结构对象传递给函数 我确实这样写 interface SomeInterface ext
  • 应用顺序/按值调用和正常顺序/按名称调用差异

    背景 我正在根据在线课程学习 sicp 并对其讲义感到困惑 在讲义中 应用顺序似乎等于 cbv 正常顺序等于 cbn 困惑 But the wiki http en wikipedia org wiki Evaluation strateg