在Scheme中let和let*有什么区别?

2024-02-20

我正在为 GIMP 编写脚本并使用let*就像我采集的样本一样。但它似乎只是一种 lambda 糖,就像let。为什么它们不同?它们之间有什么区别?


它们在变量绑定的顺序上有所不同。例如考虑这个:

> (let ((a 1)(b (+ a 2))) b)

此代码将失败,因为b需要a,之前没有定义过。它被定义为,在同一个let,但是Scheme会带走你所有的let定义仅作为一种陈述,不允许它们相互引用。在 Gambit 方案中,它提出:

*** ERROR IN ##raise-unbound-global-exception -- Unbound variable: a

反过来,let*将绑定的第一个变量let,然后是第二个,依此类推...所以:

> (let* ((a 1)(b (+ a 2))) b)
3

按预期工作。

有趣的第三种形式是letrec这不仅让变量let引用其他变量,但也让它们引用自己(例如用于递归)。这使您可以编写如下代码:

> (letrec ((f (lambda(n) ;; Takes the binary log2 recursively
               (cond
                ((= n 1) 0)
                (else (+ 1 (f (/ n 2))))))))
   (f 256)) ;; 2^8 = 256
8

如果您尝试使用以下方式定义递归函数let or let*,它会告诉你该变量未绑定。

所有这些都可以通过巧妙地重新排列/嵌套 let 语句来实现,但是let* and letrec在某些情况下可以更加方便和可读。

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

在Scheme中let和let*有什么区别? 的相关文章

  • Common Lisp 中的 LET 与 LET*

    我理解 LET 和 LET 并行绑定与顺序绑定 之间的区别 并且作为理论上的问题 它非常有意义 但有没有什么情况你曾经真正需要过 LET 在我最近查看的所有 Lisp 代码中 您可以将每个 LET 替换为 LET 而无需进行任何更改 编辑
  • 以下函数式编程模式的正确术语是什么?

    我听说它被称为stream http mitpress mit edu sicp full text sicp book node72 html as an 无限列表 http en wikibooks org wiki Clojure P
  • Common Lisp 类型声明未按预期工作

    当我在 Common Lisp 中定义一个函数时 如下所示 defun foo n declare type fixnum n n 42 我期待一个像这样的电话 foo a 立即失败 但在调用时失败 是个declareform 不保证静态类
  • Lisp 当前内存使用情况

    我需要从 Common Lisp 程序中找出当前使用了多少内存 我知道没有可移植的方法 标准函数room以文本形式将信息打印到标准输出 而不是将其作为值返回 但是sb kernel dynamic usage在 SBCL 工作 其他 Com
  • 方案 - 列表之和

    我正在尝试实现一个计算 list 的函数 其名称是sum define sum elemList if null elemList car elemList sum cdr elemList 0 上面的实现给出了错误的结果 例如 gt su
  • 函数中的变量

    我看到了下面的代码 第一次调用 next num 回报1 第二个返回2 define next num let num 0 lambda set num num 1 num next num 1 next num 2 我无法理解的是 num
  • elisp:有没有办法获取当前 .el 模块的名称(如 C 中的 __FILE__ )?

    在我的 elisp 模块的顶部 我想做一些简单的事情 message concat Loading expand file name current elisp module 您可以使用变量load file name https www
  • 展开方案中的函数

    Goal 实施unfold仅使用两个参数的函数 论据 第一个参数是 f 它接受某种类型 I 的初始值并返回 nil 或两个元素的 cons 对 这两个元素中的第一个是某种类型 A 的列表中的下一个元素 下一个初始值又是某些类型 I 第二个参
  • 经验丰富的计划者的 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
  • 如何在 Clojure 中遍历一棵树,同时收集每个节点节点的值?

    我想创建一个函数来收集二叉树中每个节点的值 在 ClojureDocs 中 我发现了几个用于遍历树 图的函数 例如 tree seq prewalk 和 postwalk https clojuredocs org clojure core
  • 方案:为什么内部定义比外部定义快?

    我尝试运行下面的程序 define odd internal x define even x if zero x t odd internal sub1 x if zero x f even sub1 x define odd extern
  • 如何将图像(PSD、AI 和 EPS)转换为 PDF?

    我的 Django 网站的客户可以上传 PDF PSD AI 和 EPS 格式的打印设计 如果他们上传的文件类型不是 PDF 我想将其转换为 PDF 所以我的问题是 如何将 Photoshop Illustrator 和 CorelDraw
  • 如何解释方案表达式 '(a 'b)

    a b 给出答案 a b 当 a 没有绑定 未加引号 时 这是如何工作的 这就是我们计算表达式时发生的情况 a b gt a b The quote 是简写quote http docs racket lang org guide quot
  • Lisp / Clojure:编写函数生成宏是个好主意吗?

    这个问题 https stackoverflow com q 7852351 346587要求创建一个 Clojure 宏来生成多个函数 我们找到了一种方法来做到这一点 但仍被 这是一个好主意吗 的问题所困扰 我的第一反应是并不真地 有两个
  • Scheme 和 Racket 中嵌套引号的行为

    在 Racket 中编写函数时 我不小心在符号前面放了两个单引号而不是一个 即我不小心写了 a 并发现嵌套引号的一些行为看起来很奇怪 我正在使用 DrRacket 并使用 Racket lang 和 R5RS lang 对此进行了测试 wr
  • 解决斐波那契数列的 Lisp 方法

    我想尝试学习 Lisp 但很快就放弃了 我想我会再试一次 我正在看 求 400 万以下所有偶数斐波那契数的总和 我写了下面的代码 它可以工作 但是很丑陋 其中最主要的是它太慢了 因为它一直在进行简单的递归 当我用 Python 编写这个程序
  • 为什么在 emacs-lisp 中的函数参数之前使用#'?

    我熟悉 Emacs Lisp 但不熟悉 Common 或任何其他 Lisp 一些 Lisp 程序员建议 例如emacs 的基本功能 https stackoverflow com questions 17076646 a basic fun
  • 从 CCL 检索(加载)源代码?

    我打了电话 load code lisp 用CCL 然后不小心删除了code lisp 有什么办法可以找回源代码吗 CCL 在内存中是否有它 这是一个非常特殊的功能 这里只为克洛祖尔CL 该代码在其他地方不起作用 这在 CCL IDE 中对
  • 学习 LISP 的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 迭代函数可以调用自身吗?

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera

随机推荐

  • SQLAlchemy 获取匹配查询的每一行并循环遍历它们

    我是 Python 和 SQLAlchemy 的新手 我一直在尝试从数据库中检索内容 并且每次都有效 但我有点不确定当 select 语句将返回多行时该怎么做 我尝试使用一些在开始 SQLAlchemy 之前有效的旧代码 但是db是一个 S
  • Google PHP API 客户端:CA 证书错误

    我正在尝试与 Google PHP API 客户端交互 但 Google 提供的证书存在问题 谷歌错误 SSL certificate problem verify that the CA cert is OK Retrying with
  • 在 Caliburn.Micro 中如何将操作绑定到嵌套的 ViewModel 方法?

    我有一个 WPF 应用程序 由 Caliburn Micro 提供支持 视图模型优先方法 有一种命令栏类型的控件 其CommandBarView xaml并绑定命令栏视图模型 命令栏虚拟机包含许多嵌套虚拟机 每个虚拟机对应一个按钮控件 所有
  • 在C中将十进制数转换为二进制数

    我正在尝试将十进制数转换为二进制数 但不知何故最终得到 随机 ASCII 符号作为输出 这是我的程序 include
  • 如何删除 GitHub 拉取请求中显示的“Continous-integration/jenkins/pr-merge”和“Continous-integration/jenkins/branch”检查?

    我为 Jenkins 安装了一个插件 它可以分解运行的每个阶段 因此 我不需要额外的两个显示支票 有什么办法可以隐藏它们吗 我能够通过安装以下插件解决这个问题 https github com jenkinsci disable githu
  • 替换字符串中的特定字符

    我想从向量中的字符串中删除特定字符 类似于查找和替换Excel 中的功能 这是我开始的数据 group lt data frame c 12357e 12575e 197e18 e18947 我只从第一列开始 我想通过删除来生成第二列e s
  • SCons 长命令行 TEMPFILE 与 MinGW

    我正在尝试在 Windows 上使用 SCons 和 MinGW 从 gcc 和 gfortran 对象构建共享库 但在最终链接期间命令行太长 超过 18000 个字符 我知道我需要使用临时文件 响应文件 来传递命令行 但我找不到让 SCo
  • OAuth 令牌安全

    据我所知 OAuth 标准对于 OAuth 真正应该如何表现非常宽松 但是 我将各种 OAuth 服务的 OAuth 访问令牌存储在数据库中 如果这些代币被泄露 它们是否可以被第三方使用 即 给定的令牌是否仅绑定到我的 api 和密钥 令牌
  • “g++”不被识别为内部或外部命令、可操作程序或批处理文件。

    我正在尝试使用 C 编译器设置 VScode 通过遵循本教程在此输入链接描述 https medium com jerrygoyal run debug intellisense c c in vscode within 5 minutes
  • 使用Cucumber,有没有一种方法可以在没有界面的情况下登录用户?

    我的绝大多数 Cucumber 功能都需要用户登录 但是 我实际上不需要为每个测试都测试登录功能 我目前正在使用 Devise 进行身份验证 我正在寻找一种使用设备登录用户的方法 而无需填写登录表单 有办法做到这一点吗 我宁愿不必在每次测试
  • kotlin 与 jooq 并手动编写表模型,无需生成代码

    我正在尝试 jOOQ 和 Kotlin 并看过一些教程和文档 它看起来非常好 但如果说 jOOQ 有一个非常烦人的地方就是代码生成 它看起来太复杂了 最终无法维护 我决定创建自己的表模型 类似于 hibernate 的工作原理 我创建了两个
  • 如何使用 A 的值作为映射中的键将 Seq[A] 转换为 Map[Int, A]?

    我有一个Seq包含如下所示的类的对象 class A val key Int 现在我想转换这个Seq to a Map 使用key每个对象的值作为键 对象本身作为值 所以 val seq Seq A val map Map Int A Ho
  • 使用 Python 查找 JSON 中的值

    我之前已经成功地从 JSON 文件解析数据 但现在我想要实现的功能遇到了问题 我有一个 JSON 格式的姓名 身份证号码和生日列表 我想要在 Python 中实现的是能够让用户输入姓名并检索他的身份证号码和出生日期 如果存在 这是我的 JS
  • 同时执行多个批处理文件并监视它们的过程是否完成

    我有一个主批处理文件 它调用多个批处理文件 我希望能够同时执行所有这些批处理文件 全部完成后 我需要在主批处理文件中进行进一步的处理 当我使用 开始 调用多个批处理文件时 我可以同时启动所有批处理文件 但我失去了对它们的跟踪 主批处理文件在
  • 如何在 C# 中启用此计时器?

    我已经开始了 C 课程 但无法让计时器运行 它可能非常简单 我只是在这里错过了一些东西 基本上我有一个按钮来启动和停止交通灯序列 我想要 1 秒的间隔 这是我写的 当我按下开始键时 它没有按预期工作 谢谢 public int counte
  • 需要在 SSRS 订阅上设置日期参数

    我在 SSRS 中有一份报告 它采用单个日期作为参数 我想要的是该报告的订阅使用前两周的星期六作为日期 即 星期一 7 4 将给出星期六 7 16 我如何在订阅中执行此操作 看来我不能在参数中做公式 您必须在报告中设置默认参数值 而不是在订
  • 有没有办法在Python中获取对象的当前引用计数?

    有没有办法在Python中获取对象的当前引用计数 根据Python文档 https docs python org dev library sys html sys getrefcount the sys模块包含一个功能 import sy
  • 清理 Objective-C 代码

    在处理复杂问题时 我发现自己尝试了各种解决方案 尽管尽最大努力保持条理清晰 但代码可能会变得相当混乱 对象可能会被更改并且不再使用 而其他时候我可能会添加代码片段 这些代码片段最终不会被程序使用 但会占用空间和可能的内存 除了仔细阅读程序之
  • install.packages 中的警告:无法移动临时安装

    在 R RStudio 中安装或更新软件包时 我发现了许多与此警告相关的问题 但似乎没有一个问题完全符合我的情况 公司Windows 7系统 因此无管理员权限 无法更改迈克菲防病毒例外列表 R完全安装在用户空间中C Users myname
  • 在Scheme中let和let*有什么区别?

    我正在为 GIMP 编写脚本并使用let 就像我采集的样本一样 但它似乎只是一种 lambda 糖 就像let 为什么它们不同 它们之间有什么区别 它们在变量绑定的顺序上有所不同 例如考虑这个 gt let a 1 b a 2 b 此代码将