Эти два использования не имеют (прямой) связи.
В Clojure, когда вы видите символ #
, это гигантский ключ, который вы "говорите" с Clojure Reader , а не с Clojure Составитель . Смотрите полную документацию по Reader здесь: https://clojure.org/reference/reader.
Reader отвечает за преобразование простого текста из исходного файла в набор структур данных. Например, сравнивая Clojure с Java, мы имеем
; Clojure ; Java
"Hello" => new String( "Hello" )
и
[ "Goodbye" "cruel" "world!" ] ; Clojure vector of 3 strings
; Java ArrayList of 3 strings
var msg = new ArrayList<String>();
msg.add( "Goodbye" );
msg.add( "cruel" );
msg.add( "world!" );
Аналогичным образом, существуют ярлыки, которые Reader распознает даже в исходном коде Clojure (до того, как компилятор преобразует его в байт-код Java), просто чтобы сэкономить время при вводе текста. Эти «макросы чтения» преобразуются из исходного кода «краткой формы» в «стандартный Clojure» даже до запуска компилятора Clojure. Например:
@my-atom => (deref my-atom) ; not using `#`
#'map => (var map)
#{ 1 2 3 } => (hash-set 1 2 3)
#_(launch-missiles 12.3 45.6) => `` ; i.e. "nothing"
#(+ 1 %) => (fn [x] (+ 1 x))
и так далее. Как показывает оператор @
или deref
, не во всех макросах Reader используется символ #
(hash / pound / octothorpe). Обратите внимание, что даже в случае векторного литерала:
[ "Goodbye" "cruel" "world!" ]
Читатель создает результат, как если бы вы набрали:
(vector "Goodbye" "cruel" "world!" )