- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我在 SICP 中遇到以下 cons 和 car 的“替代”定义时,我刚刚开始觉得自己对 lambda 在 Racket 和方案中的使用有一个模糊的理解
(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
,它封闭参数 x
和 y,捕获它们内部的值。另请注意,返回的 lambda接收函数 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
创建的相同,并且在我们将另一个 lambda
作为参数传递给它的过程主体,还记得m
吗?就是这样!它所期望的功能。
理解了上面的内容,就很容易明白car
和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
充当第一个值的选择器。 key 这里需要理解的是 lambda 充当 closure 。这有多酷?我们只需要存储和检索任意数据的函数!
car
和 cdr
的嵌套组合为 defined up to 4 deep在大多数 LISP 中。示例:
(define caddr (lambda (x) (car (cdr (cdr x)))))
关于lambda - 在 SICP 中使用 lambda 定义 cons/car/cdr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21769348/
(抱歉新手问题。)在 Ruby 中,循环之间的区别是什么: @cars.each do |car| 和 for car in @cars do ? 效率上有区别吗,或者为什么我们需要两种(或更多)方式
CREATE DATABASE movies_200186807; USE movies_200186807; CREATE TABLE movies_200186807 ( movie_name
在一本书中找到了第二种初始化对象的方法。现在很困惑。 最佳答案 这声明了一个变量: Car myCar; 该变量的类型为 Car,名为 myCar。但是,它还没有被初始化为任何东西。它是 Car 对象
我正在研究 Pandas 并研究汽车(一个 csv 文件)。我运行了以下命令: 1) cars.iloc[[3, 0]] Out[2]: cars_per_cap country dri
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Do the parentheses after the type name make a differen
除了明确的清晰度,我们为什么要坚持:car.getSpeed()和 car.setSpeed(55)当这也可以使用时:car.speed()和 car.speed(55) 我知道 get() 和 se
var car = function(){ this.color = 'blue'; } car.color1 = 'white'; car.prototype.color2 = 'red'; var
给定汽车列表 (List cars),我可以: Observable.just(cars); //returns an Observable that emits one List Observabl
我正在尝试将此 XML 反序列化为 Parts 对象: gearbox 1990
假设我有标题中描述的结构: Map> mapNeighborhood 包含分别由地址和车牌索引的邻域中的所有汽车。我想选择所有红色汽车将它们重新涂成黑色。为完成该任务,我尝试使用 Java 8 将两个
我在计划中的功能是尝试获取省的详细信息: (define (getProvincesHelper sales provincesList) (if (null? sales) prov
我相信我已经在程序中发现它是这个函数,但是在到达find_best_candidates函数的第一行之前似乎失败了: (define (count-the-score candList voterLi
我正在尝试创建利用 D-Bus 的程序。我研究了 Qt 提供的示例,大致相同。在其中一个名为“D-Bus 遥控汽车示例”的文件中,有一个名为“car.xml”的文件,其中包含以下内容:
我是 Java 新手。抱歉,这个时间太长了。下面是到目前为止我的代码的输出带有 ** 的部分是我遇到问题的地方。我应该比较两个 Car 对象的速度,但每个 Owner 对象要么是“安全”驾驶员,要么是
我想使用car::Anova运行ANCOVA,但无法找出是否有一种方法可以仅将协变量添加为主要效果(即,不应与任何事物交互)。 据我了解的ANCOVA,协变量只是添加到模型中的另一个主要效果(即另一个
我正在尝试在 RStudio 中制作一个 2 面板图。通常足够简单: par(mfrow=c(1,2)) #1*2 plotting window 但是,当我使用 scatterplot() 进行绘图
网上查了很久,不知道怎么申请car重新编码一系列列的值。 要重新编码单个列的值,我将运行如下命令: df$dv_r <- recode(df$dv, "2=1;1=0;0=NA") 然后,如果我想对
有人可以给我一个关于 car 和 cdr 的变体在Scheme中做什么的基本解释吗? 如果我是正确的,car 将返回列表中的第一项。 cdr 将返回一个不包括第一个元素的列表。 我对这些的其他变体感到
我想在eopl中使用typed/racket实现“LET”语言,但遇到问题:我尝试实现三个函数(empty-env、extend-env、apply-env),但我不知道如何标记类型信息,并且rack
我想在eopl中使用typed/racket实现“LET”语言,但遇到问题:我尝试实现三个函数(empty-env、extend-env、apply-env),但我不知道如何标记类型信息,并且rack
我是一名优秀的程序员,十分优秀!