Estou analisando The Little Schemer no ChezScheme e no capítulo 2 resolvo o seguinte problema. Eu escrevo a definição de lat? de acordo com o livro.
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f)
)
)
)
Em seguida, defina uma lista
(define l '('bacon 'and 'eggs))
e então
(lat? l)
avalia como #f
.
Parece que a questão é que enquanto (car l)
avalia 'bacon
e atom? 'bacon
avalia para #t
, (atom? (car l))
avalia para #f
.
Acho que você está confuso com as aspas.
Você queria definir uma lista l que contenha 3 elementos: bacon e ovo.
Você pode fazer isso por
(define l '(bacon, and egg))
, ou equivalente (talvez menos confuso também)(define l (list 'bacon 'and 'egg))
O que você fez foi
(define l '('bacon 'and 'eggs))
Como resultado,
(car l)
é(list 'quote 'bacon)
em vez de'bacon
.Você precisa mudar a definição para
Explicação
A expressão
é uma abreviatura para
Dentro de a
quote
, cada expressão é interpretada literalmente e não tem nenhum significado especial, entãoquote
in(quote bacon)
é apenas mais um símbolo. O carro de'('bacon 'and 'eggs)
is(quote bacon)
, que é em si uma lista, não um átomo.Diferenças de REPL
Um ponto potencial de confusão é que REPLs de esquema diferentes imprimem expressões de maneira diferente. Por exemplo, Racket imprime expressões com aspas explícitas, enquanto Chez Scheme não.
Raquete v8.7:
Esquema Chez v10.0.0:
Cada expressão é avaliada com o mesmo valor. A diferença é puramente estilística.
Portanto, quando o REPL do Chez Scheme é exibido
'bacon
, significa que o valor é a lista(quote bacon)
.