Seguinte: Iteradores Acima: Macros Anterior: Caracteres de Macro
Índice remissivo

Macros Úteis

Exercício 69

Reescreva a macro quando usando o backquote, o comma e o comma-at.

Resposta

Exercício 70

Escreva a macro a-menos-que, que recebe um teste e um conjunto de expressões. Esta forma especial avalia o teste e, quando este é falso, avalia sequencialmente as expressões, devolvendo o valor da última. Se o teste é verdade, a forma retorna nil sem avaliar mais nada.

Resposta

Exercício 71

Escreva uma implementação da macro meu-cond usando a forma especial if.

Resposta

Exercício 72

A implementação da macro meu-cond anterior implica que a expansão é apenas parcial, i.e., enquanto houver cláusulas, o meu-cond expande para outro meu-cond. Implemente a macro meu-cond de modo a realizar a expansão de uma só vez.

Resposta

Exercício 73

A macro seja implementa a mesma funcionalidade que a forma especial let. Como se sabe, o let não é mais do que uma macro que expande para uma lambda. A ideia será definir a macro seja exactamente da mesma forma, i.e., deverá existir uma correspondência entre a expressão:

(seja ((x 10) (y 20))
  (+ x y))

e a sua expansão:

((lambda (x y) (+ x y)) 10 20)

Defina a macro seja de modo a implementar essa correspondência.

Resposta

Exercício 74

Escreva a macro enquanto, que recebe um teste e um conjunto de expressões. A forma enquanto deve avaliar o teste e, caso seja verdade, avaliar sequencialmente as expressões e voltar ao princípio. Caso o teste seja falso, deve terminar com o valor nil.

Resposta

Exercício 75

Escreva a macro caso, que recebe uma expressão e um conjunto de pares átomo-expressões. A forma especial caso avalia a primeira expressão, e compara o resultado (usando a função eql) com cada um dos átomos em sequência. Se um dos átomos emparelhar, são avaliadas as expressões a ele associadas e retornado o valor da última.

Um exemplo de utilização seria:

(defun inverso-fact (x)
  (caso x
    (1 (print 'basico) 1)
    (2 (print 'menos-basico) 2)
    (6 (print 'ainda-menos-basico) 3)))

> (inverso-fact 1) BASICO 1

Resposta


Seguinte: Iteradores Acima: Macros Anterior: Caracteres de Macro
Índice remissivo

Copyright António Leitão, 1995