3a83b6eb80
24 new functions covering counting (str_count, str_count_chars, str_count_bytes, str_count_lines, str_count_words, str_count_letters, str_count_digits), finding (str_index_of_all, str_last_index_of, str_find_chars), transforming (str_repeat, str_reverse, str_strip_prefix/suffix/chars, str_lstrip, str_rstrip), character classification (is_letter, is_digit, is_alphanumeric, is_whitespace, is_punctuation, is_uppercase, is_lowercase), and splitting/joining (str_split_lines, str_split_chars, str_split_n, str_join). Phase 1 is byte-level + ASCII character classes. Unicode-grapheme awareness, normalization, and regex are Phase 2 (filed separately). Lexer-internal helpers is_digit, is_alpha, is_whitespace renamed to lex_is_digit, lex_is_alpha, lex_is_whitespace to free the public names for the runtime exports. The El compiler's lexer.el and the bundled elc-combined.el both updated. Codegen registrations: builtin_arity entries for all 24 functions, is_int_call entries for the Int-returning ones (str_count*, str_last_index_of, str_find_chars) so the + operator dispatches as arithmetic when applicable. Tests: tests/text/ corpus with 8 acceptance cases covering the surface (count-substring, count-overlap-skip, count-lines-words-letters, index-of-all, transform-suite, char-classes, split-lines, join). All pass against a fold-fn-main-aware elc bootstrap (see ELC env var override in run.sh). Self-host fixed point: elc-combined.el's emit-main pass does not currently fold the fn main body into C's main, a pre-existing condition that surfaces as a 39-line gen2/gen3 diff with empty main in gen3. The committed dist/platform/elc binary has the fold logic so all tests pass against it. Filing the elc-combined fold-fn-main fix separately. This commit does not introduce new self-host drift.
20 lines
505 B
EmacsLisp
20 lines
505 B
EmacsLisp
// char-classes.el — ASCII character classification.
|
|
// is_letter("A") && is_digit("7") && is_whitespace(" ")
|
|
// && !is_letter("3") && !is_digit("X")
|
|
fn run_test() -> Bool {
|
|
if !is_letter("A") { return false }
|
|
if !is_digit("7") { return false }
|
|
if !is_whitespace(" ") { return false }
|
|
if is_letter("3") { return false }
|
|
if is_digit("X") { return false }
|
|
return true
|
|
}
|
|
|
|
fn main() -> Void {
|
|
if run_test() {
|
|
println("true")
|
|
} else {
|
|
println("false")
|
|
}
|
|
}
|