syntax | since v0.0-1853 | in clojure | in edn | Edit |
A single character string.
\c
=> "c"
\A
=> "A"
\newline
=> "\n"
\u00a1
=> "¡"
\o256
=> "®"
A single character string. Carried over from Clojure for compatibility. They are represented as single character JavaScript strings.
\c
= "c"
unicode characters | constraints |
---|---|
\uXXXX |
XXXX must have 4 digits outside 0xD7FF-0xE000 |
\oXXX |
XXX is octal between 0 and 0377 |
special characters | result |
---|---|
\newline |
"\n" |
\space |
" " |
\tab |
"\t" |
\formfeed |
"\f" |
\backspace |
"\b" |
\return |
"\r" |
\c
;;=> "c"
\A
;;=> "A"
\newline
;;=> "\n"
\u00a1
;;=> "¡"
\o256
;;=> "®"
(defn- read-char*
[rdr backslash opts pending-forms]
(let [ch (read-char rdr)]
(if-not (nil? ch)
(let [token (if (or (macro-terminating? ch)
(whitespace? ch))
(str ch)
(read-token rdr :character ch))
token-len (count token)]
(cond
(== 1 token-len) (Character/valueOf (nth token 0))
(= token "newline") \newline
(= token "space") \space
(= token "tab") \tab
(= token "backspace") \backspace
(= token "formfeed") \formfeed
(= token "return") \return
(.startsWith token "u")
(let [c (read-unicode-char token 1 4 16)
ic (int c)]
(if (and (> ic upper-limit)
(< ic lower-limit))
(err/throw-invalid-character-literal rdr (Integer/toString ic 16))
c))
(.startsWith token "o")
(let [len (dec token-len)]
(if (> len 3)
(err/throw-invalid-octal-len rdr token)
(let [uc (read-unicode-char token 1 len 8)]
(if (> (int uc) 0377)
(err/throw-bad-octal-number rdr)
uc))))
:else (err/throw-unsupported-character rdr token)))
(err/throw-eof-in-character rdr))))
(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))