Notas de estudo do Capítulo 1 do livro: The Little Schemer.
Conceitos básicos:
- Atom: seqüência de caracteres, dígitos ou caracteres especiais, exceto parênteses
- List: coleção de atoms entre parênteses, podendo ser uma coleção vazia (lista nula)
- S-expressions: todos os atoms e todas as lists
Funções básicas:
- car: retorna a 1ª S-expression de uma lista
- Seu argumento é uma lista (um atom não pode ser argumento)
- Pode retornar um atom ou uma lista, dependendo da 1ª S-expression da lista original
- Em Scheme, só é definida para listas não vazias
- Em Common Lisp, é definida para listas vazias e não vazias (se a lista for vazia, retorna nil)
- cdr: retorna uma lista sem a 1ª S-expression da lista original
- Seu argumento é uma list (um atom não pode ser argumento)
- Sempre retorna uma nova lista, sem a 1ª S-expression da lista original
- Em Scheme, só é definida para listas não vazias
- Em Common Lisp, é definida para listas vazias e não vazias (se a lista for vazia, retorna nil)
- cons: adiciona qualquer S-expression (atom ou lista) na frete de outra lista
- Tem dois argumentos: o primeiro é qualquer S-expression (atom ou lista), e o segundo é, obrigatoriamente uma lista
- null / null?: retorna T se o argumento for uma lista vazia, e nil caso contrário.
- atom / atom?: retorna T se o argumento é um atom, e nil caso contrário.
- Em Common Lisp retorna T se o argumento for uma lista vazia. Para “corrigir” esse comportamento (ou, melhor dizendo, para igualar ao comportamento da Scheme), podemos definir a função atom? em Common Lisp (e em Scheme) da seguinte maneira:
;; Definição da função atom? em Common Lisp:
(defun atom? (x)
(not (listp x)))
;; Definição da função atom? em Scheme:
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
- eq / eq?: compara se dois atoms não numéricos são iguais
- Na prática, alguns números podem ser comparados
- Na prática, também serve para comparar se duas listas são iguais
Como digitar S-expressions (atoms ou lists):
;; Em Scheme e Common Lisp:
;; usamos a função quote ou o apóstrofo:
(quote atom) ;; digita um atom
'atom ;; digita um atom
(quote (abc)) ;; digita uma list com 3 atoms
'(a b c) ;; digita uma list com 3 atoms
;; Representação de uma lista vazia:
;; Em Scheme e Common Lisp:
(quote ())
'()
;; Adicionalmente, só em Common Lisp:
()