> The way I'd have done it is
>
>     (cl-macrolet (((a field) `(cdr (assq ,field alist))))
>       (if (and (a title) (a body))
>           (a body)
>         (a site)))
>

Indeed, I was doing almost the same thing initially (just using cl-flet instead), but eventually even that grew tiresome.