(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 ")"