Resposta ao exercício 72

Em princípio, bastaria forçar a avaliação do meu-cond final mas, como a definição tem um parâmetro do tipo &rest, o que iria ser passado não eram as cláusulas restantes mas sim uma lista com as cláusulas restantes, o que seria incorrecto (o parâmetro cláusulas teria como valor uma lista com a lista das cláusulas restantes). O problema resume-se então a eliminar o parâmetro do tipo &rest, o que poderemos fazer recorrendo a uma função local.

(defmacro meu-cond (&rest clausulas)
  (labels ((expande (clausulas)
             (if (null clausulas)
                nil
                `(if ,(caar clausulas)
                    (progn ,@(cdar clausulas))
                    ,(expande (cdr clausulas))))))
     (expande clausulas)))