syntax | since v0.0-1853 | in clojure | in edn | Edit |
A keyword starts with a colon and evaluates to itself. It can include an optional namespace.
:bar
:foo/bar
Keywords are often used as enums or keys for maps. Keywords should not start with a number.
Keywords can have an optional namespace. For example, :foo/bar
. This is useful
for functions in a namespace to prevent key collisions on a globally accessible
map.
:foo
;;=> :foo
:a/foo
;;=> :a/foo
A keyword is also callable for retrieving values from a map:
(def m {:foo 1})
(:foo m)
;;=> 1
(def things [{:foo 1 :bar 2}
{:foo 3 :bar 4}
{:foo 5 :bar 6}])
(map :foo things)
;;=> (1 3 5)
(defn- read-keyword
[reader initch opts pending-forms]
(let [ch (read-char reader)]
(if-not (whitespace? ch)
(let [token (read-token reader :keyword ch)
s (parse-symbol token)]
(if s
(let [^String ns (s 0)
^String name (s 1)]
(if (identical? \: (nth token 0))
(if ns
(let [ns (resolve-alias (symbol (subs ns 1)))]
(if ns
(keyword (str ns) name)
(err/throw-invalid reader :keyword (str \: token))))
(keyword (str *ns*) (subs name 1)))
(keyword ns name)))
(err/throw-invalid reader :keyword (str \: token))))
(err/throw-single-colon reader))))
(defn- macros [ch]
(case ch
\" read-string*
\: read-keyword
\; read-comment
\' (wrapping-reader 'quote)
\@ (wrapping-reader 'clojure.core/deref)
\^ read-meta
\` read-syntax-quote ;;(wrapping-reader 'syntax-quote)
\~ read-unquote
\( read-list
\) read-unmatched-delimiter
\[ read-vector
\] read-unmatched-delimiter
\{ read-map
\} read-unmatched-delimiter
\\ read-char*
\% read-arg
\# read-dispatch
nil))