Ответ 1
Функция constantly
полезна, когда API ожидает функцию, и вы просто хотите константу. Это имеет место в примере, представленном в вопросе.
Большинство функций alter-*
(включая alter-var-root
) принимают функцию, позволяющую вызывающему пользователю что-то модифицировать, основываясь на ее старом значении. Даже если вы просто хотите, чтобы новое значение было равным 7 (без учета старого значения), вам все равно нужно предоставить функцию (при условии, что только 7 приведет к попытке оценить ее, что не удастся). Таким образом, вы должны предоставить функцию, которая просто возвращает 7. (constantly 7)
создает именно эту функцию, экономя усилия, необходимые для ее определения.
Изменить: Что касается второй части вопроса, constantly
- обычная функция, поэтому ее аргумент вычисляется до построения константы. Таким образом, (constantly @myref)
всегда возвращает значение, на которое ссылается myref
во время вызова constantly
, даже если оно будет изменено позже.