我正在阅读 ChezScheme 中的《小阴谋家》,在第 2 章中我遇到了以下问题。我写了lat的定义?根据书上的说法。
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f)
)
)
)
然后定义一个列表
(define l '('bacon 'and 'eggs))
进而
(lat? l)
评估为#f
.
问题似乎在于,虽然(car l)
评估为'bacon
并atom? 'bacon
评估为#t
,(atom? (car l))
但评估为#f
。
我认为您对引号感到困惑。
您想要定义一个包含 3 个元素的列表 l:培根和鸡蛋。
你可以通过
(define l '(bacon, and egg))
, 或等效的方式来做到这一点(也许也不会那么混乱)(define l (list 'bacon 'and 'egg))
你所做的是
(define l '('bacon 'and 'eggs))
结果
(car l)
是 是(list 'quote 'bacon)
而不是'bacon
。您需要将定义更改为
解释
表达方式
是简写
在 a 内部
quote
,每个表达式均按字面意思理解,没有特殊含义,因此quote
in(quote bacon)
只是另一个符号。的 car'('bacon 'and 'eggs)
是(quote bacon)
,它本身是一个列表,而不是原子。REPL 差异
一个潜在的混淆点是不同的Scheme REPL 打印表达式的方式不同。例如,Racket 会打印带有显式引用的表达式,而 Chez Scheme 则不会。
球拍 v8.7:
Chez计划v10.0.0:
每个表达式的计算结果都是相同的。区别纯粹是风格上的。
所以当ChezScheme的REPL显示 时
'bacon
,就意味着该值是列表(quote bacon)
。