0

我正在阅读“The little schemer - 4th edition”一书的第 10 章,它实现了一个简单的 schemer 解释器。:atom?除了第188页中的功能外,所有其他内容对我来说都很好:

(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书中的 , ?

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

4

1 回答 1

1

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

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

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

现在,如果您将闭包建模为pairs使用第一个元素作为标记来标识它,那么您需要确保这些评估也是原子的,这就是您:atom?通过查找primitivenon-primitive

于 2016-04-06T12:14:47.053 回答