From 3ff7aac2d2eb2cbf2f854793fc0d7bc6f1f7d927 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sun, 9 Jan 2022 08:40:09 -0800 Subject: Initial commit. Not sure if everything here will be needed eventually, but we have a working bytecode interpreter. Next I will write the linker, then the core compiler, and finish with the macro expander. --- strings.csc | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 strings.csc (limited to 'strings.csc') diff --git a/strings.csc b/strings.csc new file mode 100644 index 0000000..963565c --- /dev/null +++ b/strings.csc @@ -0,0 +1,42 @@ +(define-library (csc strings) + (export + str-find + str-not-found-error? + str-prefix? + str-quote) + (import (scheme base) + (scheme case-lambda) + (only (scheme write) write)) + (begin + + + (define str-prefix? + (let ((str-prefix?' (lambda (prefix str start) + (and (<= (string-length prefix) (- (string-length str) start)) + (string=? prefix (substring str start (+ start (string-length prefix)))))))) + (case-lambda + ((prefix str) (str-prefix?' prefix str 0)) + ((prefix str start) (str-prefix?' prefix str start))))) + + + (define (str-quote s) + (let ((out (open-output-string))) + (write s out) + (get-output-string out))) + + + (define-record-type + (make-str-not-found-error) + str-not-found-error?) + + + (define str-find + (let ((str-find' (lambda (match str start end) + (let loop ((i start)) + (cond ((>= i end) (raise (make-str-not-found-error))) + ((str-prefix? match str i) i) + (else (loop (+ 1 i)))))))) + (case-lambda + ((match str) (str-find' match str 0 (string-length str))) + ((match str start) (str-find' match str start (string-length str))) + ((match str start end) (str-find' match str start end))))))) -- cgit v1.3.1