为什么空列表在 Scheme 中被认为是原子?

问题描述 投票:0回答:3

据我所知,atoms 是 Scheme 中的任何数字、布尔值和字符串。但是当我在空列表上运行

atom?
函数时 -
(atom? '())
- 它返回真正的
#t
值。

我在这里错过了什么?它是否与我的 Scheme 语言实现(即 Chicken Scheme)有关?

scheme chicken-scheme
3个回答
0
投票

我能找到的任何 Scheme 标准中都没有提到任何原子概念。

在 Common Lisp 中,它是任何不是成对的东西,提供

atom?
的 Scheme 实现很可能坚持这一点。


0
投票

我不确定是否有任何 Scheme 标准定义了

atom?
谓词。然而,传统的 Lisp 定义是原子是任何不是缺点的对象。

由于列表被定义为不是cons的特殊空列表对象,或者任何对象和列表的cons,因此空列表对象是一个原子。


0
投票

atom
来自麦卡锡 1960 年最初的 lisp 论文。这是一个有两种类型的 lisp,符号和对。空列表只是符号
nil
的同义词,它是自我评估的。
(atom ())
(atom nil)
相同且均为真,而
(atom (cons x y))
的计算结果为假值
nil
。 Common Lisp 是具有两种以上类型的直系后代,但它对于只关心对和符号的代码仍然有效。作为设计推理,任何不是成对的东西都是原子,因此:

(defun (atom x)
  (not (consp x)))

方案标准,如最新的RNRS和R7RS,没有

atom?
作为原语。话虽如此,可能是某些方案实施具有它。虽然以与 Common Lisp 相同的方式实现是最不令人惊讶的,即:

(define (atom? x)
  (not (pair? x)))

Paul Graham 写了一篇很棒的文章,叫做 Lisp 的根源,我强烈推荐它。

© www.soinside.com 2019 - 2024. All rights reserved.