#!/home/arne/wisp/wisp-multiline.sh
; !#
; A small experiment on a complete evolutionary algorithm.
; NOTE: This only works after preprocessing to scheme.
; Get the eval string which allows for selecting the language.
use-modules : ice-9 eval-string
define evalsyntax "0123456789+-*/ ()"
define : mutate-replace evalstring
let
: eval-index : random : string-length evalstring
replace-index : random : string-length evalsyntax
string-replace evalstring evalsyntax eval-index : + eval-index 1
. replace-index : + replace-index 1
define : mutate-permutate evalstring
let
: replace : random : string-length evalstring
by : random : string-length evalstring
string-replace evalstring evalstring replace : + replace 1
. by : + by 1
define : mutate-insert evalstring
let
: eval-index : random : string-length evalstring
insert-index : random : string-length evalsyntax
string-append
substring evalstring 0 eval-index
string : string-ref evalsyntax insert-index
substring evalstring eval-index
define : mutate-remove evalstring
if : <= 1 : string-length evalstring
; cannot remove from a 0 string
. evalstring
let
: eval-index : random : - (string-length evalstring) 1
string-append
substring evalstring 0 eval-index
substring evalstring : + eval-index 1
define : mutate-eval evalstring
eval-string : string-append "(" evalstring ")"
. #:lang 'scheme
define : better mutated original
<
abs : - 42 : mutate-eval mutated
abs : - 42 : mutate-eval original
define : evolve-step evalstring mutate
; first try a random replacement, then try a permutation.
let : : newstring : mutate evalstring
catch #t
lambda :
mutate-eval newstring
lambda : key . args
set! newstring evalstring
if : better newstring evalstring
. newstring
. evalstring
define : evolve-replace evalstring
evolve-step evalstring mutate-replace
define : evolve-permutate evalstring
evolve-step evalstring mutate-permutate
define : evolve-insert evalstring
evolve-step evalstring mutate-insert
define : evolve-remove evalstring
evolve-step evalstring mutate-remove
define : evolution initialstring steps
let loop : (step 0) (string initialstring)
let : : action : random 4
if : >= step steps
. string
cond
: = action 0
loop (+ step 1) (evolve-replace string)
: = action 1
loop (+ step 1) (evolve-permutate string)
: = action 2
loop (+ step 1) (evolve-insert string)
: = action 3
loop (+ step 1) (evolve-remove string)
define : run
; firstoff, seed the random number generator!
set! *random-state* : random-state-from-platform
display : evolution "+ 1 (- 2 1)" 1000
newline