diff --git a/scheme/cyclone/cgen.sld b/scheme/cyclone/cgen.sld index 2b228de1..e2dbdc16 100644 --- a/scheme/cyclone/cgen.sld +++ b/scheme/cyclone/cgen.sld @@ -27,7 +27,6 @@ emits emits* emit-newline - string-join ) (inline global-not-lambda? diff --git a/scheme/cyclone/util.sld b/scheme/cyclone/util.sld index b89d5a2b..7fa9050b 100644 --- a/scheme/cyclone/util.sld +++ b/scheme/cyclone/util.sld @@ -71,6 +71,9 @@ ;; Inlines (TBD, this may move) define-c-inline? define-c->inline-var + ;; String functions + string-join + string-split ;; Scheme library functions gensym delete @@ -690,4 +693,39 @@ )) ;; END name mangling section +;; string-join :: [string] -> Maybe (string, char) -> string +(define (string-join lst delim) + (let ((delim* (if (char? delim) (string delim) delim))) + (cond + ((null? lst) + "") + ((= (length lst) 1) + (car lst)) + (else + (string-append + (car lst) + delim* + (string-join (cdr lst) delim*)))))) + +;; string-split :: string -> char -> [string] +;; Based on code from: https://codereview.stackexchange.com/q/75172/6414 +(define (string-split str delim) + (let ((add (lambda (current output) + (cons (list->string (reverse current)) output)))) + (let loop ((input (string->list str)) + (output '()) + (current '())) +;(write `(DEBUG ,input ,output ,current)) + (if (null? input) + (if (not (null? output)) + (reverse (add current output)) + '()) + (let ((char (car input)) + (input (cdr input))) + (if (char=? char delim) + (if (null? current) + (loop input output current) ;; Ignore delim by itself + (loop input (add current output) '())) + (loop input output (cons char current)))))))) + ))