;; ========================================================================== ;; stdlib.sx — Standard library functions ;; ;; Functions expressed in SX using the irreducible primitive set. ;; ;; CONSTRAINT: Replacing a native callable (PRIMITIVES entry) with a ;; transpiled SX function can break the transpiled evaluator when: ;; 1. The function is called inside shift/reset (changes CEK capture) ;; 2. The function is used by platform internals (circular dependency) ;; 3. The transpiler doesn't support named-let (loop patterns) ;; ;; Only functions safe from all three constraints are moved here. ;; The rest remain as host-provided PRIMITIVES for now. ;; ========================================================================== ;; -------------------------------------------------------------------------- ;; String predicates and aliases ;; -------------------------------------------------------------------------- (define upcase (fn (s) (upper s))) (define downcase (fn (s) (lower s))) (define string-length (fn (s) (len s))) (define substring (fn (s start end) (slice s start end))) (define string-contains? (fn (s needle) (!= (index-of s needle) -1))) (define starts-with? (fn (s prefix) (= (index-of s prefix) 0))) (define ends-with? (fn (s suffix) (let ((slen (len s)) (plen (len suffix))) (if (< slen plen) false (= (slice s (- slen plen)) suffix))))) ;; -------------------------------------------------------------------------- ;; Text utilities ;; -------------------------------------------------------------------------- (define pluralize (fn (count singular plural) (if (= count 1) (or singular "") (or plural "s")))) (define escape (fn (s) (let ((r (str s))) (set! r (replace r "&" "&")) (set! r (replace r "<" "<")) (set! r (replace r ">" ">")) (set! r (replace r "\"" """)) (set! r (replace r "'" "'")) r))) (define parse-datetime (fn (s) (if s (str s) nil))) (define assert (fn (condition message) (when (not condition) (error (or message "Assertion failed"))) true))