3

有人可以解释一下为什么:

(define a (lambda() (cons a #f)))

(car (a)) ==> procedure

((car (a))) ==> (procedure . #f)

我不认为我明白。谢谢

4

2 回答 2

2

这个

(define a (lambda() (cons a #f)))

定义一个过程 ,a调用时将返回该对

(<the procedure a> . #f)

即谁car是程序本身,谁cdr#f

换句话说,评估的结果

(a)

是不带参数调用过程的结果,根据上面a的定义,a

(<the procedure a> . #f)

因此,

(car (a))

<the procedure a>(因为它的意思是“car使用评估结果调用(a)”)

当您添加另一对括号时

((car (a)))

您正在调用该过程,它 - 因为它是过程a- 返回与 , 相同的(a)结果

 (<the procedure a> . #f)
于 2014-12-15T14:18:00.307 回答
1

define从顶层定义一个全局变量a

匿名过程调用时,会从和(lambda() (cons a #f)的评估中得出一对。a#f

当您评估时,a您会得到一个程序。在我的系统中你得到#<procedure:a>.

当你评估(a)你得到(#<procedure:a> . #f). 现在程序显示的方式高度依赖于实现。没有标准,但许多人会使用a会出现名称的约定,但不要指望它。

由于a也可以作为car调用结果访问,因此a您可以((car (a)))得到与 相同的结果(a)。那是因为(eq? a (car (a)))#t

于 2014-12-15T10:05:25.707 回答