Эти все вещи имеют нечто общее — контроль над порядком вычислений. Однако, почему то, я никогда не видел сравнения их с этой точки зрения. Постараюсь восполнить этот пробел, а вы дополните, или возразите. Я привожу градацию в пороядке «от сильного к слабому»
1) fexprs. Имеют полный контроль над вычислениями.
2) macros. Имеют контроль над вычислениями, ограниченный временем компиляции.
3) monads. То же самое, что п. 2, за исключением того, что в теле функции невозможно получить само выражение аргумент, «как он есть», а лишь его вычисленное значение.
Возможно я ошибаюсь, поэтому дополняйте и исправляйте.