#!/usr/bin/ruby include('Turtle.sf') class LSystem( angle = 90, scale = 1, xoff = 0, yoff = 0, len = 5, color = 'black', width = 500, height = 500, turn = 0, ) { method execute(string, repetitions, filename, rules) { var theta = angle.deg2rad var turtle = Turtle( x: width, y: height, angle: turn, scale: scale, color: color, xoff: xoff, yoff: yoff, ) var stack = [] var table = Hash( '+' => { turtle.turn(theta) }, '-' => { turtle.turn(-theta) }, ':' => { turtle.mirror }, '[' => { stack.push(turtle.state) }, ']' => { turtle.setstate(stack.pop) }, ) repetitions.times { string.gsub!(/(.)/, {|c| rules{c} \\ c }) } string.each_char { |c| if (table.contains(c)) { table{c}.run } elsif (c.is_uppercase) { turtle.forward(len) } } turtle.save_as(filename) } }