在 SICP 中使用 lambda 定义 cons/car/cdr

2023-12-03

当我在 SICP 中遇到以下 cons 和 car 的“替代”定义时,我刚刚开始觉得我对 lambda 在球拍和方案中的使用有一个模糊的理解

(define (cons x y)
   (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))

(define (cdr z)
  (z (lambda (p q) q)))

对于我的一生来说,我就是无法解析它们。

任何人都可以解释如何以对新手有意义的方式解析或扩展这些内容吗?


这是一种有趣的表示数据的方式:作为函数。请注意,这 的定义cons返回一个lambda which 结束参数x and y,捕捉他们内心的价值观。另请注意,返回的 lambda 收到一个function m作为参数:

;creates a closure that "remembers' 2 values
(define (cons x y)    (lambda (m) (m x y)))
;recieves a cons holding 2 values, returning the 0th value
(define (car z)       (z (lambda (p q) p)))
;recieves a cons holding 2 values, returning the 1st value
(define (cdr z)       (z (lambda (p q) q)))

在上面的代码中z是一个闭包,与创建的相同cons,并在 我们正在传递的过程的主体another lambda作为参数, 记住m?就是这样!它所期望的功能。

理解了上面的内容,就很容易明白如何car and cdr工作;让我们 剖析如何car, cdr由解释器一次一步地进行评估:

; lets say we started with a closure `cons`, passed in to `car`
(car (cons 1 2))

; the definition of `cons` is substituted in to `(cons 1 2)` resulting in:
(car (lambda (m) (m 1 2)))

; substitute `car` with its definition
((lambda (m) (m 1 2)) (lambda (p q) p))

; replace `m` with the passed parameter
((lambda (p q) p) 1 2)

; bind 1 to `p` and 2 to `q`, return p
1

总结一下:cons创建一个“记住”两个值的闭包,car接收该闭包并将其传递给一个充当选择器的函数 第零个值,以及cdr充当第一个值的选择器。钥匙 这里要理解的一点是lambda充当closure。 这有多酷?我们只需要存储和检索任意数据的函数!

的嵌套组合car & cdr are 定义最多 4 层深度在大多数 LISP 中。例子:

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

在 SICP 中使用 lambda 定义 cons/car/cdr 的相关文章

随机推荐

  • solr - 将字段设置为默认搜索字段

    以下查询对我来说效果很好 http 8983 solr vault select q VersionComments 3AWhite 返回版本注释包含 White 的所有文档 我尝试省略字段名称并将其作为默认值 如下所示 在 solr 配置
  • 使用 java swing 对 JTabbedPane 中的选项卡进行着色

    我正在尝试更改选项卡的背景颜色JTabbedPane 我试过JTabbedPane setBackgroudAt 0 Color GRAY and JTabbedPane setBackgroud Color GRAY 前景也是如此 但什么
  • 为什么使用 loff_t *offp 而不是直接 filp->f_pos 用法的原因

    以下函数取自LDD ssize t read struct file filp char user buff size t count loff t offp ssize t write struct file filp const cha
  • 从android工作区文件夹调用文件路径

    基本上我右键单击了我的项目名称并成功创建了一个名为 pdfs 的新文件夹 我想在这里预加载一些pdf文件 那么我如何从我的mainactivity类中调用这个path somepdffile pdf import java io File
  • 单个 Dataframe 单元格中系列的最大值

    我有一个数据框 其中每一行都包含一个系列single column col1 row1 34 55 11 8 row2 36 76 69 6 row3 77 31 40 55 row4 51 41 26 30 我想获得该系列中每个值的最大值
  • 在Python中添加字典中缺失的键

    我有一个字典列表 L 0 1 1 7 2 3 4 8 0 3 2 6 1 2 4 6 0 2 3 2 如您所见 字典的长度不同 我需要的是将缺少的键 值添加到每个字典中 使它们具有相同的长度 L1 0 1 1 7 2 3 4 8 0 3 1
  • 部署到 Azure 网站时,什么可能导致 EvoPDF“无法呈现 html”异常

    将 EvoPDF 用于 Net Web 应用程序可以在本地运行 但是一旦部署到 Microsoft Azure 网站 它就会抛出一个通用异常 无法呈现 html 堆栈跟踪 Exception Could not render the HTM
  • 带有超链接的 PHP/MySQL 表

    我有 2 个 PHP 表单 一个显示事件列表 另一个显示每个特定事件的结果 在包含事件列表的页面上 我希望可以创建一个超链接来访问每个单独事件的结果 例如 在 事件 页面上 我单击第 2 行的超链接 该链接会将我带到 结果 页面 其中包含该
  • JavaFx2 IllegalStateException 与 Label.setText

    为什么当我使用这样的简单线程时 Thread t new Thread new Runnable public void run while true idLabel setText Date toString Thread sleep 1
  • Vimeo 播放器 api - 使用 javascript 播放视频

    我正在尝试使用 javascript jquery 函数开始播放视频 我从复制示例维梅奥网站并将其上传到服务器 但它不起作用
  • 使用 IntSummaryStatistics 计算多个字段的平均值

    我正在尝试使用 Java 8 流创建单个 CarData 对象 该对象由列表中所有 CarData 字段的平均值组成getCars CarData new CarData CarData getBodyWeight returns Inte
  • Symfony 忽略 web/ 中的目录

    在 symfony 项目中 有什么方法可以排除目录被处理 例如 我想在 mysite com other app 中运行一个单独的 php 程序 如何排除 symfony 控制器处理 web other app 文件夹 我尝试过使用 Rew
  • SQL Server 添加字符串值时列名无效

    我是 SQL Server 新手 我已经像这样创建了我的表 CREATE TABLE Accidents Id INT NOT NULL PRIMARY KEY IDENTITY GUID VARCHAR 100 Latitude VARC
  • 在 Android 上从存储执行时,executeOfflineCommand 会跳过命令

    我必须在程序中按顺序执行 开始 和 完成 命令 并在最后同步所有内容 因此 我首先按顺序插入离线命令 并假设它们将以相同的顺序执行 为此 我使用 List 和 Iterator 这里的问题是 完成命令将在中间的一些奇怪的情况下错过执行 并且
  • 用Python读取PDF并转换为PDF中的文本

    我已经使用此代码将 pdf 转换为文本 input1 Home Sai Krishna Dubagunta pdf output Home Me txt os system pdftotext s s input1 output 我已经创建
  • ASP.NET核心0x80004005

    我是 ASP NET Core 的新手 我正在尝试将基本的 ASP NET Core Web 应用程序部署到 Windows 2012 R2 服务器 我可以使用 Visual Studio Express 在本地构建和运行该项目 但是当我部
  • 使用 JavaFx 监听系统剪贴板

    正如这个问题的答案中所述 可以设置一个时间轴来检查系统剪贴板是否有更改 在 javafx 8 中设置和使用时间线之外的变量 但还有更好的办法吗 例如 事件监听器 我搜索了 JavaFx 8 文档 但没有发现任何明显有帮助的内容 使用 Jav
  • 如何将 GeoJSON 导入 OpenLayers?

    我已经尝试将以下函数和新的向量层放入我的代码中 我将 GeoJSON 文件上传到我的 BPlaced 帐户以链接我的代码中的文件 对吗 Geojson 与网站具有相同的坐标系 另外 代码似乎可以工作 但我没有看到任何 Geojson 或者还
  • Spring Integration 通过注释控制总线配置

    只是一个简单的问题 有什么办法可以配置吗弹簧集成通过注释控制总线 没有任何 xml
  • 在 SICP 中使用 lambda 定义 cons/car/cdr

    当我在 SICP 中遇到以下 cons 和 car 的 替代 定义时 我刚刚开始觉得我对 lambda 在球拍和方案中的使用有一个模糊的理解 define cons x y lambda m m x y define car z z lam