为何在ChezScheme中(atom? (car '('bacon 'and 'eggs)))与(atom? 'bacon)结果不同?
问题解答
问题出在你定义列表l的方式上,核心是两层引号导致列表元素不是原子而是列表:
语法糖的展开逻辑
在Scheme中,单引号'是(quote)的语法糖,所以你写的'('bacon 'and 'eggs)会被展开为:(quote ((quote bacon) (quote and) (quote eggs)))这意味着
l的每个元素都是(quote bacon)这样的列表(而非原子)。为什么
(atom? (car l))返回#f
当你调用(car l)时,得到的是'bacon,但这个'bacon本质是(quote bacon)——这是一个包含两个元素的列表(第一个元素是符号quote,第二个是符号bacon),所以(atom?)检查会返回#f。为什么
(atom? 'bacon)返回#t
单独的'bacon是一个符号类型,属于Scheme中的原子范畴,因此(atom?)检查返回#t。
修正方法
定义列表时去掉内层的引号,直接写成:
(define l '(bacon and eggs))
此时l的每个元素都是符号原子,调用(lat? l)会返回#t。
内容的提问来源于stack exchange,提问作者user25245804
相关产品推荐
相关产品推荐

