spec: character type (char? char->integer #\a literals + predicates)

- Add SxChar tagged object {_char, codepoint} to JS platform
- char? char->integer integer->char char-upcase char-downcase
- char=? char<? char>? char<=? char>=? comparators
- char-ci=? char-ci<? char-ci>? char-ci<=? char-ci>=? case-insensitive
- char-alphabetic? char-numeric? char-whitespace? char-upper-case? char-lower-case?
- string->list (returns chars) and list->string (accepts chars)
- #\a #\space #\newline reader syntax in spec/parser.sx
- integer->char alias in spec/evaluator.sx
- js-char-renames dict in transpiler.sx for ->-containing names
- 43 tests in spec/tests/test-chars.sx, all passing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-01 11:50:04 +00:00
parent 46da676c29
commit 4b600f17e8
7 changed files with 788 additions and 297 deletions

View File

@@ -492,6 +492,12 @@
:returns "string"
:doc "Convert Unicode code point to single-character string.")
(define-primitive
"char-code"
:params ((s :as string))
:returns "number"
:doc "Unicode codepoint of the first character of string s.")
(define-primitive
"substring"
:params ((s :as string) (start :as number) (end :as number))
@@ -546,15 +552,15 @@
:returns "boolean"
:doc "True if string s starts with prefix.")
;; --------------------------------------------------------------------------
;; Core — Dict operations
;; --------------------------------------------------------------------------
(define-primitive
"ends-with?"
:params ((s :as string) (suffix :as string))
:returns "boolean"
:doc "True if string s ends with suffix.")
;; --------------------------------------------------------------------------
;; Core — Dict operations
;; --------------------------------------------------------------------------
(define-module :core.collections)
(define-primitive
@@ -599,15 +605,15 @@
:returns "any"
:doc "Last element, or nil if empty.")
;; --------------------------------------------------------------------------
;; Stdlib — Format
;; --------------------------------------------------------------------------
(define-primitive
"rest"
:params ((coll :as list))
:returns "list"
:doc "All elements except the first.")
;; --------------------------------------------------------------------------
;; Stdlib — Format
;; --------------------------------------------------------------------------
(define-primitive
"nth"
:params ((coll :as list) (n :as number))
@@ -632,15 +638,15 @@
:returns "list"
:doc "Mutate coll by appending x in-place. Returns coll.")
;; --------------------------------------------------------------------------
;; Stdlib — Text
;; --------------------------------------------------------------------------
(define-primitive
"reverse"
:params ((coll :as list))
:returns "list"
:doc "Return coll in reverse order.")
;; --------------------------------------------------------------------------
;; Stdlib — Text
;; --------------------------------------------------------------------------
(define-primitive
"flatten"
:params ((coll :as list))
@@ -659,29 +665,29 @@
:returns "list"
:doc "Consecutive pairs: (1 2 3 4) → ((1 2) (2 3) (3 4)).")
(define-module :core.dict)
;; --------------------------------------------------------------------------
;; Stdlib — Style
;; --------------------------------------------------------------------------
;; --------------------------------------------------------------------------
;; Stdlib — Debug
;; --------------------------------------------------------------------------
(define-module :core.dict)
(define-primitive
"keys"
:params ((d :as dict))
:returns "list"
:doc "List of dict keys.")
;; --------------------------------------------------------------------------
;; Type introspection — platform primitives
;; --------------------------------------------------------------------------
(define-primitive
"vals"
:params ((d :as dict))
:returns "list"
:doc "List of dict values.")
;; --------------------------------------------------------------------------
;; Type introspection — platform primitives
;; --------------------------------------------------------------------------
(define-primitive
"merge"
:params (&rest (dicts :as dict))