regex: \p{...} property classes; interop: the String method surface (cuerdas is green)
\p{L}/\p{Lu}/\p{Ll}/\p{N}/\p{Z}/\p{Ps}/\p{Pe} (+\P negation) land in
both escape positions of the regex compiler, mapped onto the byte PEGs:
ASCII exact, any high byte (inside a UTF-8 sequence) counts as a LETTER —
so ^\p{L}+$ accepts UTF-8 words while \p{N}/\p{Z} stay ASCII. (?u) was
already a tolerated no-op flag. Unknown property names error at compile.
Chasing the acceptance target (cuerdas via deps-conformance) pulled in the
rest of its clj-compat chain, each a real gap:
- the deps-conformance harness reads libraries under clj-compat reader
features (deps are clj/cljc by definition — without :clj, cuerdas's
#?(:clj (instance? Pattern x)) branches resolved to NIL bodies)
- instance? knows Pattern/java.util.regex.Pattern (regex values) and
Character (cuerdas's rx/regexp? gate on split)
- the java.lang.String method surface: .toLowerCase/.toUpperCase/.trim/
.indexOf(-1 on miss)/.lastIndexOf/.substring/.charAt/.startsWith/
.endsWith/.contains/.replace/.equalsIgnoreCase/... — ASCII case mapping,
unknown methods error (the old path silently returned nil)
- the (.method obj args) SUGAR now desugars to (. obj method args) in the
interpreter — it was never implemented (bare .method heads resolved as
vars, hence 'Cannot call nil')
- Long/MAX_VALUE / MIN_VALUE statics (f64 approximations)
deps-conformance: medley ok, cuerdas ok (was check-error); dependency now
loads its clj branches and fails only on its single-segment ns resolution.
30 new spec rows (11 regex, 19 interop). Gate exit 0.
This commit is contained in:
parent
621ca5cf75
commit
1898df99bc
6 changed files with 173 additions and 19 deletions
|
|
@ -38,3 +38,26 @@
|
|||
["aset returns val" "9" "(aset (object-array [1 2 3]) 1 9)"]
|
||||
["aset mutates" "[7 2 3]" "(let [a (object-array [1 2 3])] (aset a 0 7) (vec a))"]
|
||||
["aget 2d" "4" "(aget (to-array-2d [[1 2] [3 4]]) 1 1)"])
|
||||
|
||||
# java.lang.String surface + .method sugar (clj-compat: what portable cljc
|
||||
# libraries call — landed for the cuerdas acceptance run). ASCII case mapping.
|
||||
(defspec "interop / String methods"
|
||||
[".toLowerCase" "\"hi\"" "(.toLowerCase \"HI\")"]
|
||||
[".toUpperCase" "\"HI\"" "(.toUpperCase \"hi\")"]
|
||||
["dot-form" "\"hi\"" "(. \"HI\" toLowerCase)"]
|
||||
[".trim" "\"x\"" "(.trim \" x \")"]
|
||||
[".length" "3" "(.length \"abc\")"]
|
||||
[".isEmpty" "[true false]" "[(.isEmpty \"\") (.isEmpty \"a\")]"]
|
||||
[".indexOf hit" "1" "(.indexOf \"abc\" \"b\")"]
|
||||
[".indexOf miss is -1" "-1" "(.indexOf \"abc\" \"z\")"]
|
||||
[".lastIndexOf" "3" "(.lastIndexOf \"abab\" \"b\")"]
|
||||
[".substring" "\"bc\"" "(.substring \"abc\" 1)"]
|
||||
[".substring end" "\"b\"" "(.substring \"abc\" 1 2)"]
|
||||
[".startsWith" "true" "(.startsWith \"abc\" \"ab\")"]
|
||||
[".endsWith" "true" "(.endsWith \"abc\" \"bc\")"]
|
||||
[".contains" "true" "(.contains \"abc\" \"b\")"]
|
||||
[".replace" "\"axc\"" "(.replace \"abc\" \"b\" \"x\")"]
|
||||
[".charAt" "\\b" "(.charAt \"abc\" 1)"]
|
||||
[".equalsIgnoreCase" "true" "(.equalsIgnoreCase \"AbC\" \"aBc\")"]
|
||||
["Long/MAX_VALUE" "true" "(pos? Long/MAX_VALUE)"]
|
||||
["unsupported method throws" :throws "(.frobnicate \"abc\")"])
|
||||
|
|
|
|||
|
|
@ -31,3 +31,19 @@
|
|||
["split on regex" "[\"a\" \"b\" \"c\"]" "(do (require '[clojure.string :as s]) (s/split \"a1b2c\" #\"\\d\"))"]
|
||||
["replace regex" "\"X-X\"" "(do (require '[clojure.string :as s]) (s/replace \"a-b\" #\"[a-z]\" \"X\"))"]
|
||||
["replace $1" "\"[a][b]\"" "(do (require '[clojure.string :as s]) (s/replace \"ab\" #\"([a-z])\" \"[$1]\"))"])
|
||||
|
||||
# Unicode property classes (jolt-xlp), byte-PEG approximation: ASCII exact,
|
||||
# any high byte (inside a UTF-8 sequence) counts as a LETTER for \p{L}.
|
||||
# Acceptance target was cuerdas (kebab/snake/capital now pass conformance).
|
||||
(defspec "regex / \\p property classes"
|
||||
["p{L} ascii" "\"hello\"" `(re-matches #"^\p{L}+$" "hello")`]
|
||||
["p{L} utf-8" "true" `(boolean (re-matches #"^\p{L}+$" "héllo"))`]
|
||||
["p{L} rejects digits" "false" `(boolean (re-matches #"^\p{L}+$" "ab1"))`]
|
||||
["p{N}" "(quote (\"12\" \"345\"))" `(re-seq #"\p{N}+" "a12b345")`]
|
||||
["P{N} negation" "\"abc\"" `(re-matches #"^\P{N}+$" "abc")`]
|
||||
["inside class" "\"a-1_b\"" `(re-matches #"^[\p{N}\p{L}_-]+$" "a-1_b")`]
|
||||
["p{Lu}/p{Ll}" "\"aB\"" `(re-matches #"^\p{Ll}\p{Lu}$" "aB")`]
|
||||
["p{Z} space" "\" \"" `(re-matches #"(?u)^[\s\p{Z}]+$" " ")`]
|
||||
["p{Ps}/p{Pe}" "\"(x)\"" `(re-matches #"^\p{Ps}x\p{Pe}$" "(x)")`]
|
||||
["(?u) accepted" "\"hi\"" `(re-matches #"(?u)^hi$" "hi")`]
|
||||
["unknown class throws" :throws `(re-pattern "\p{Greek}")`])
|
||||
|
|
|
|||
|
|
@ -129,8 +129,9 @@
|
|||
["delay? true" "true" "(delay? (delay 1))"]
|
||||
["delay? false" "false" "(delay? 1)"]
|
||||
["future-call" "42" "(deref (future-call (fn [] 42)))"]
|
||||
[". member resolves nil" "nil" "(. \"abc\" count)"]
|
||||
[".. threads members" "nil" "(.. \"abc\" count)"])
|
||||
[". calls String surface" "3" "(. \"abc\" length)"]
|
||||
[".. threads members" "\"ABC\"" "(.. \"abc\" toUpperCase)"]
|
||||
["unknown String member throws" :throws "(. \"abc\" frobnicate)"])
|
||||
|
||||
(defspec "untested / protocols: extend + extends?"
|
||||
["extend registers" ":str"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue