core: Remove substring.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 23 Dec 2016 20:44:54 +0000 (21:44 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 23 Dec 2016 20:44:54 +0000 (21:44 +0100)
* string.c (substring): Remove.
* module/mes/scm.mes (substring): New function.

module/mes/scm.mes
string.c

index 646c95ab7184bde175fefafbf1b3f8c136272aa2..f8c199246e369205ef224e9a85d374a4be9612b4 100644 (file)
 (define (string-ref s k)
   (list-ref (string->list s) k))
 
+(define (substring s start . rest)
+  (let* ((end (and (pair? rest) (car rest)))
+         (lst (list-tail (string->list s) start)))
+    (list->string (if (not end) lst
+                      (list-head lst (- end start))))))
+
 (define (string-prefix? prefix string)
   (and
    (>= (string-length string) (string-length prefix))
index 9b489373bcc08b60aed27cce293596a5b8f5a6fe..674e53b48644d03d585b2d8b5c58e72199f69f5b 100644 (file)
--- a/string.c
+++ b/string.c
  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-SCM
-substring (SCM x) ///((arity . n))
-{
-  assert (TYPE (x) == PAIR);
-  assert (TYPE (car (x)) == STRING);
-  SCM s = STRING (car (x));
-  assert (TYPE (cadr (x)) == NUMBER);
-  int start = VALUE (cadr (x));
-  int end = VALUE (length (s));
-  if (TYPE (cddr (x)) == PAIR) {
-    assert (TYPE (caddr (x)) == NUMBER);
-    assert (VALUE (caddr (x)) <= end);
-    end = VALUE (caddr (x));
-  }
-  int n = end - start;
-  while (start--) s = cdr (s);
-  SCM p = cell_nil;
-  while (n-- && s != cell_nil) {
-    p = append2 (p, cons (MAKE_CHAR (VALUE (car (s))), cell_nil));
-    s = cdr (s);
-  }
-  return MAKE_STRING (p);
-}
-
 SCM
 number_to_string (SCM x)
 {