有人可以解释一下原因:
(define a (lambda() (cons a #f)))
(car (a)) ==> procedure
((car (a))) ==> (procedure . #f)
我不认为我明白了。感谢
答案 0 :(得分: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)
答案 1 :(得分: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
。