wisp
 
(Arne Babenhauserheide)
2015-02-14: evolve: do a doublestep if removing or adding a paired character to

evolve: do a doublestep if removing or adding a paired character to ensure that there can be syntactically correct changes to parens other than permutations.

diff --git a/examples/evolve.w b/examples/evolve.w
--- a/examples/evolve.w
+++ b/examples/evolve.w
@@ -13,10 +13,22 @@ use-modules : ice-9 eval-string
 
 define evalsyntax "0123456789+-*/: ()"
 
+
+define : paired-char? char
+       or (equal? #\) char) (equal? #\( char)
+
+
 define : mutate-replace evalstring
-       let 
+       let*
            : eval-index : random : string-length evalstring
              replace-index : random : string-length evalsyntax
+             remove-char : string-ref evalstring eval-index
+             insert-char : string-ref evalsyntax replace-index
+             ; double step, if mutating a paired character
+             evalstring 
+                 if : not : or (paired-char? insert-char) (paired-char? remove-char)
+                    . evalstring 
+                    mutate-replace evalstring
            string-replace evalstring evalsyntax eval-index : + eval-index 1
                                           . replace-index : + replace-index 1
 
@@ -30,25 +42,40 @@ define : mutate-permutate evalstring
 
 
 define : mutate-insert evalstring
-       let 
+       let* 
            : eval-index : random : string-length evalstring
              insert-index : random : string-length evalsyntax
+             insert-char : string-ref evalsyntax insert-index
+             ; double step, if mutating a paired character
+             evalstring 
+                 if : not : paired-char? insert-char
+                    . evalstring 
+                    mutate-insert evalstring
            string-append 
                substring evalstring 0 eval-index
-               string : string-ref evalsyntax insert-index
+               string insert-char
                substring evalstring eval-index
 
 
+define : mutate-remove-by-index evalstring index
+               string-append 
+                   substring evalstring 0 index
+                   substring evalstring : + index 1
+       
+
 define : mutate-remove evalstring
        if : <= 1 : string-length evalstring
           ; cannot remove from a 0 string
           . evalstring
-          let 
+          let* 
                : eval-index : random : - (string-length evalstring) 1
-               string-append 
-                   substring evalstring 0 eval-index
-                   substring evalstring : + eval-index 1
-
+                 eval-char : string-ref evalstring eval-index
+                 ; double step, if mutating a paired character
+                 evalstring 
+                     if : not : paired-char? eval-char
+                        . evalstring 
+                        mutate-remove evalstring
+               mutate-remove-by-index evalstring eval-index
 
 define : mutate-eval evalstring
        eval-string : string-append "(" evalstring ")"