在一本书中,lambda是一个原子“小阴谋家”吗?

时间:2016-04-06 09:03:37

标签: lambda the-little-schemer

我正在阅读“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

我想这是不太确定,因为我找不到他们在书中提到的关系。

1 个答案:

答案 0 :(得分:1)

源代码(lambda (x) (+ x 1))不是原子,但是导致闭包的评估值应该由评估者标识为原子。

在lisps中,不是列表的所有东西都是原子。您可以这样定义:

(define atom?
  (lambda (x)
    (not (or (null? x)
             (pair? x)))))

现在,如果您将闭包建模为pairs,并将第一个元素作为标记来识别它,那么您需要确保这些闭包的评估也是原子的,这就是:atom?通过查找{primitive所做的事情。 1}}和non-primitive