New function string-replace-substring in (ice-9 string-fun)
authorDaniel Llorens <lloda@sarc.name>
Mon, 6 Jan 2020 08:44:01 +0000 (09:44 +0100)
committerDaniel Llorens <lloda@sarc.name>
Mon, 6 Jan 2020 08:44:01 +0000 (09:44 +0100)
By A. Wingo in
https://lists.gnu.org/archive/html/guile-devel/2014-03/msg00058.html.

* module/ice-9/string-fun.scm (string-replace-substring): As stated.
* doc/ref/api-data.texi: Document the new function.
* test-suite/tests/strings.test: Test.

doc/ref/api-data.texi
module/ice-9/string-fun.scm
test-suite/tests/strings.test

index 0ea49485f24a97ae66e6c6577aa4ecaa03703af4..ede16de64008dc05c0c425bf4bfc9b818591e2a8 100644 (file)
@@ -4227,6 +4227,22 @@ a predicate, if it is a character, it is tested for equality and if it
 is a character set, it is tested for membership.
 @end deffn
 
+The following additional functions are available in the module @code{(ice-9 string-fun)}. They can be used with:
+
+@example
+(use-modules (ice-9 string-fun))
+@end example
+
+@deffn {Scheme Procedure} string-replace-substring str substring replacement
+Return a new string where every instance of @var{substring} in string
+@var{str} has been replaced by @var{replacement}. For example:
+
+@lisp
+(string-replace-substring "a ring of strings" "ring" "rut")
+@result{} "a rut of struts"
+@end lisp
+@end deffn
+
 @node Representing Strings as Bytes
 @subsubsection Representing Strings as Bytes
 
index c27ff847f0c1abdcd12467965755a7fed160abb9..03e0238faea7f58625ac92758f03869dba66ca8d 100644 (file)
           separate-fields-discarding-char separate-fields-after-char
           separate-fields-before-char string-prefix-predicate string-prefix=?
           sans-surrounding-whitespace sans-trailing-whitespace
-          sans-leading-whitespace sans-final-newline has-trailing-newline?))
+          sans-leading-whitespace sans-final-newline has-trailing-newline?
+           string-replace-substring))
 
 ;;;;
 ;;;
 ;;; Various string funcitons, particularly those that take
 ;;; advantage of the "shared substring" capability.
+;;; FIXME Document these functions in Miscellaneous String Operations::
+;;; in doc/ref/api-data.texi.
 ;;;
+
 \f
 ;;; {String Fun: Dividing Strings Into Fields}
 ;;; 
 ;;;         (fail parts)
 ;;;         (apply return parts))))
 
+
+\f
+;;; {String Fun: string-replace-substring}
+;;;
+
+;; string-replace-substring By A. Wingo in
+;; https://lists.gnu.org/archive/html/guile-devel/2014-03/msg00058.html
+;; also in string-replace-substring guix:guix/utils.scm.
+
+(define (string-replace-substring str substring replacement)
+  "Return a new string where every instance of @var{substring} in string
+   @var{str} has been replaced by @var{replacement}. For example:
+
+   @lisp
+   (string-replace-substring \"a ring of strings\" \"ring\" \"rut\")
+   @result{} \"a rut of struts\"
+   @end lisp
+   "
+  (let ((sublen (string-length substring)))
+    (with-output-to-string
+      (lambda ()
+        (let lp ((start 0))
+          (cond
+           ((string-contains str substring start)
+            => (lambda (end)
+                 (display (substring/shared str start end))
+                 (display replacement)
+                 (lp (+ end sublen))))
+           (else
+            (display (substring/shared str start)))))))))
+
index 32c9b9ef361973b910c276a54ff5cb6e3017c0c8..52b3dd034c3fec0faedf5956692ae54d01ecac53 100644 (file)
@@ -20,7 +20,8 @@
 
 (define-module (test-strings)
   #:use-module ((system base compile) #:select (compile))
-  #:use-module (test-suite lib))
+  #:use-module (test-suite lib)
+  #:use-module (ice-9 string-fun))
 
 (define exception:read-only-string
   (cons 'misc-error "^string is read-only"))
       (string-upcase! (substring/shared str2 1 4))
       (and (string=? str1 "foofoofoo")
           (string=? str2 "oFOOf")))))
+
+(with-test-prefix "miscellaneous string functions"
+
+  (pass-if "string-replace-substring"
+    (string=? (string-replace-substring "a ring of strings" "ring" "rut")
+              "a rut of struts")))