据我所知,atoms 是 Scheme 中的任何数字、布尔值和字符串。但是当我在空列表上运行
atom?
函数时 - (atom? '())
- 它返回真正的 #t
值。
我在这里错过了什么?它是否与我的 Scheme 语言实现(即 Chicken Scheme)有关?
我能找到的任何 Scheme 标准中都没有提到任何原子概念。
在 Common Lisp 中,它是任何不是成对的东西,提供
atom?
的 Scheme 实现很可能坚持这一点。
我不确定是否有任何 Scheme 标准定义了
atom?
谓词。然而,传统的 Lisp 定义是原子是任何不是缺点的对象。
由于列表被定义为不是cons的特殊空列表对象,或者任何对象和列表的cons,因此空列表对象是一个原子。
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 的根源,我强烈推荐它。