Skip to content

Commit 2dba6e6

Browse files
committed
isUpperCase/isLowerCase may take Unicode points
1 parent 45e20f5 commit 2dba6e6

File tree

4 files changed

+207
-177
lines changed

4 files changed

+207
-177
lines changed

shadow-cljs.edn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
context lang-clojure-eval.main/context
1010
isISOControl lang-clojure-eval.character/isISOControl
1111
isLetter lang-clojure-eval.character/isLetter
12+
isAlphabetic lang-clojure-eval.character/isAlphabetic
1213
isUpperCase lang-clojure-eval.character/isUpperCase
1314
isLowerCase lang-clojure-eval.character/isLowerCase
1415
digit lang-clojure-eval.character/digit

src/lang_clojure_eval/character.cljs

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,40 @@
55
(defn digit [c r]
66
(edn/read-string (str r "r" c)))
77

8-
(defn isLetter [char]
9-
(and (= 1 (count (str char)))
10-
(not= (str/upper-case char)
11-
(str/lower-case char))))
8+
(defn isLetter
9+
"Takes either a char or a Unicode code point."
10+
[x]
11+
(if (int? x)
12+
(not= (str/upper-case (char x))
13+
(str/lower-case (char x)))
14+
(not= (str/upper-case x)
15+
(str/lower-case x))))
1216

13-
(defn isUpperCase [s]
14-
(= s (str/upper-case s)))
17+
(defn isAlphabetic
18+
"Takes a Unicode code point."
19+
[int]
20+
(not= (str/upper-case (.fromCharCode js/String int))
21+
(str/lower-case (.fromCharCode js/String int))))
1522

16-
(defn isLowerCase [s]
17-
(= s (str/lower-case s)))
23+
(defn isUpperCase
24+
"Takes either a char or a Unicode code point."
25+
[x]
26+
(if (int? x)
27+
(and (isLetter (.fromCharCode js/String x))
28+
(= (.fromCharCode js/String x)
29+
(str/upper-case (.fromCharCode js/String x))))
30+
(and (isLetter (.fromCharCode js/String x))
31+
(= x (str/upper-case x)))))
32+
33+
(defn isLowerCase
34+
"Takes either a char or a Unicode code point."
35+
[x]
36+
(if (int? x)
37+
(and (isLetter (.fromCharCode js/String x))
38+
(= (.fromCharCode js/String x)
39+
(str/lower-case (.fromCharCode js/String x))))
40+
(and (isLetter x)
41+
(= x (str/lower-case x)))))
1842

1943
(defn isISOControl [char]
2044
(boolean (re-seq #"[\u0000-\u001F\u007F-\u009F]" char)))

src/lang_clojure_eval/main.cljs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,19 @@
1616
{'digit char/digit
1717
'isISOControl char/isISOControl
1818
'isLetter char/isLetter
19+
'isAlphabetic char/isAlphabetic
1920
'isLowerCase char/isLowerCase
2021
'isUpperCase char/isUpperCase}
2122
'lang-clojure-eval.integer
2223
{'parseInt int/parse-int}}}))
2324

2425
(defn eval-string [source]
2526
(let [reqs "(require '[lang-clojure-eval.character :as Character]
26-
'[lang-clojure-eval.integer :as Integer])"]
27+
'[lang-clojure-eval.integer :as Integer])
28+
(defn int [x]
29+
(if (.isInteger js/Number (js/parseInt x))
30+
(js/parseInt x)
31+
(.charCodeAt x 0)))"]
2732
(try (binding [*print-length* 100]
2833
(with-out-str (pprint/pprint (sci/eval-string* context (str reqs source)))))
2934
(catch :default e

0 commit comments

Comments
 (0)