54 lines
1.8 KiB
Plaintext
54 lines
1.8 KiB
Plaintext
;;;; A typed char (decision 127): a char literal is a char unless typed code
|
|
;;;; wants a number, and a char crossing into dyn stays a char. It compares,
|
|
;;;; orders and hashes; (i32 c) and (char n) convert. With "dyn-int" a dyn
|
|
;;;; int at a char parameter traps, and with "surrogate" (char n) does.
|
|
|
|
(defn show [x] () (println x))
|
|
(defn take-char [c char] char c)
|
|
(defn next-char [c char] char (char (+ (i32 c) 1)))
|
|
(defn a-dyn [x] dyn x)
|
|
|
|
(defn main [args [str]] i32
|
|
;; A direct literal and a let-bound one print alike through dyn.
|
|
(show \a)
|
|
(let [c \a] (show c))
|
|
;; Printed as its literal, as a dyn char is, alone and inside a value.
|
|
(let [e \é]
|
|
(println e [e \z \space])
|
|
(println (i32 e) (u32 e)))
|
|
;; Equality and ordering by code point.
|
|
(println (< \a \b) (= \a \a) (!= \a \b) (>= \é \z) (min \q \c) (max \q \c))
|
|
;; Conversions both ways.
|
|
(println (char 65) (char 0x1F600) (i32 \A) (u8 \A) (next-char \y))
|
|
(let [n 66] (println (char n)))
|
|
;; A map keyed by char.
|
|
(let [m (map-new char i32)]
|
|
(put m \x 1)
|
|
(put m \é 2)
|
|
(println (get m \x) (get m \é) (has-key? m \y)))
|
|
;; A match over a char.
|
|
(let [k \b]
|
|
(println (match k \a 1 \b 2 _ 0)))
|
|
;; Byte code is unchanged: a literal beside a byte is the byte.
|
|
(let [b (u8 97)
|
|
v (vec-new u8)
|
|
s (string-new)]
|
|
(println (= b \a) (= \a b))
|
|
(push v \z)
|
|
(println (at v 0))
|
|
;; And a char appends to a String as its UTF-8.
|
|
(append s \é)
|
|
(append s (char 0x65E5))
|
|
(println s))
|
|
;; A dyn char into a typed char, and typed chars viewed from dyn.
|
|
(println (take-char (a-dyn \q)))
|
|
(let [cs [\x \y]]
|
|
(show cs)
|
|
(show (at (a-dyn cs) 1)))
|
|
(when (> (length args) 1)
|
|
(if (= (at args 1) "dyn-int")
|
|
(println (take-char (a-dyn 97)))
|
|
(let [n (+ 0xD800 (length args))]
|
|
(println (char n)))))
|
|
0)
|