我正在阅读“The little schemer - 4th edition”一书中的第10章,该书实现了一个简单的策划者解释器。所有其他内容对我来说都没问题,除了页面188中的函数:atom?
(define :atom?
(lambda (x)
(cond
((atom? x) #t)
((null? x) #f)
((eq? (car x) (quote primitive)) #t)
((eq? (car x) (quote non-primitive) #t)
(else #f)))))
我不清楚这一行:
((eq? (car x) (quote non-primitive) #t)
从本书的前一部分开始,non-primitive
对应于lambda定义。
(lambda (x) (+ x 1))
的值为(通过环境table
):
(non-primitive (table (x) (+ x 1)))
这是否意味着书中的lambda定义是atom
?
我想这是不太确定,因为我找不到他们在书中提到的关系。
答案 0 :(得分:1)
源代码(lambda (x) (+ x 1))
不是原子,但是导致闭包的评估值应该由评估者标识为原子。
在lisps中,不是列表的所有东西都是原子。您可以这样定义:
(define atom?
(lambda (x)
(not (or (null? x)
(pair? x)))))
现在,如果您将闭包建模为pairs
,并将第一个元素作为标记来识别它,那么您需要确保这些闭包的评估也是原子的,这就是:atom?
通过查找{primitive
所做的事情。 1}}和non-primitive