Ответ 1
Короче говоря, ~
оценивает выражение в форме с синтаксисом, как и для ~fn-name
. В этом случае выражение для оценки равно 'name
, в котором результатом является неквалифицированный символ name
.
Однако, давайте сломаем это по одной части за раз.
Если у вас был только неквалифицированный символ name
, он был бы оценен как clojure.core/name
во время выполнения 1. Это приведет к неправильной форме defn
и вызовет исключение компилятора.
(defn greeting [clojure.core/name] (str "Hello" name))
Если у вас был только неквалифицированный символ 'name
, он все равно будет оцениваться во время выполнения. Разница в том, что она будет расширяться до (quote clojure.core/name)
. Опять же, это приведет к неправильной форме defn
и вызовет исключение компилятора.
(defn greeting [(quote clojure.core/name)] (str "Hello" name))
Наконец, используя ~'name
, вы будете иметь котировальную форму, полученную во время компиляции, в результате получится неквалифицированный символ name
, оставив вам правильную форму defn
.
(defn greeting [name] (str "Hello" name))
1 - Это верно для этого примера, потому что предполагается, что еще одна функция name
не существует.