guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 01/02: New function string-replace-substring in (ice-9 s


From: Daniel Llorens
Subject: [Guile-commits] 01/02: New function string-replace-substring in (ice-9 string-fun)
Date: Mon, 6 Jan 2020 03:47:43 -0500 (EST)

lloda pushed a commit to branch wip-exception-truncate
in repository guile.

commit 6cfee365434ca8a18053600575c79dde6775bc2d
Author: Daniel Llorens <address@hidden>
AuthorDate: Mon Jan 6 09:44:01 2020 +0100

    New function string-replace-substring in (ice-9 string-fun)
    
    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         | 16 ++++++++++++++++
 module/ice-9/string-fun.scm   | 37 ++++++++++++++++++++++++++++++++++++-
 test-suite/tests/strings.test |  9 ++++++++-
 3 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/doc/ref/api-data.texi b/doc/ref/api-data.texi
index 0ea4948..ede16de 100644
--- a/doc/ref/api-data.texi
+++ b/doc/ref/api-data.texi
@@ -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
 
diff --git a/module/ice-9/string-fun.scm b/module/ice-9/string-fun.scm
index c27ff84..03e0238 100644
--- a/module/ice-9/string-fun.scm
+++ b/module/ice-9/string-fun.scm
@@ -25,13 +25,17 @@
           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.
 ;;;
+
 
 ;;; {String Fun: Dividing Strings Into Fields}
 ;;; 
@@ -278,3 +282,34 @@
 ;;;         (fail parts)
 ;;;         (apply return parts))))
 
+
+
+;;; {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)))))))))
+
diff --git a/test-suite/tests/strings.test b/test-suite/tests/strings.test
index 32c9b9e..52b3dd0 100644
--- a/test-suite/tests/strings.test
+++ b/test-suite/tests/strings.test
@@ -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"))
@@ -693,3 +694,9 @@
       (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")))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]