Daniel Cerqueira <dan....@brilhante.top> writes:
> Patricia Ferreira <
pfer...@example.com> writes:
>
>> E aí, Daniel? Qual seu relato da opinião-comp.lang.lisp sobre NIL? :-)
>
> Gostei das respostas do Madhu,
Tem um erro de digitação lá no Madhu.
``(consp nil) has to be true. NIL cannot be of type CONS.''
Ele quer dizer (consp nil) tem que ser *falso*. Tem que ser falso pra
que a gente possa distingui-lo de uma célula cons verdadeira. O tipo
Lista é matematicamente definido:
--8<---------------cut here---------------start------------->8---
Definição. Uma Lista é
- NIL ou...
- (cons <ANY-TYPE> Lista)
--8<---------------cut here---------------end--------------->8---
Assim, qualquer procedimento que consome uma lista tem a forma
(defun p (ls)
(cond ((null ls) 'something)
((consp ls) (car ls) (p (cdr ls)))))
Se NIL for um /cons/, não conseguimos distinguir o fim do não-fim.
A linguagem Common Lisp não determina como NIL realmente é por baixo dos
panos porque seria muita intromissão na implementação. E tanto faz,
desde que NIL não seja um CONS pra não estragar isso tudo aí.
Observe que Kaz Kylheku não está errado, não. Você pode, sim,
implementar NIL como se fosse uma célula CONS desde que (consp NIL) não
seja verdadeiro, o que pode ser feito olhando o conteúdo da célula e
vendo se ela satisfaz a definição de NIL. (Tem nada de muito importante
aqui, não.)