Toys

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:
()