paint
#lang racket
(require (planet "sicp.ss" ("soegaard" "sicp.plt" 2 1)))
(define wave einstein) ; Make compatible with the text book
(define wave2 (beside wave (flip-vert wave)))
(define wave4 (below wave2 wave2))
(display "beside wave \n")
(paint wave2)
(display "\nbeside below wave \n")
(paint wave4)
; Creating abstraction for `wave4`
(define (flipped-pairs painter)
(let ((painter2 (beside painter (flip-vert painter))))
(below painter2 painter2)))
(define wave5 (flipped-pairs wave))
(display "\nflipped-pairs\n")
(paint wave5)
; Right split procedure
(define (right-split painter n)
(if (= n 0)
painter
(let ((smaller (right-split painter (- n 1))))
(beside painter (below smaller smaller)))))
(define rs4 (right-split wave 4))
(display "\nRight split 4\n")
(paint rs4)
; Up split procedure
(define (up-split painter n)
(if (= n 0)
painter
(let ((smaller (up-split painter (- n 1))))
(below painter (beside smaller smaller)))))
; Defining `corner-split` procedure
(define (corner-split painter n)
(if (= n 0)
painter
(let ((up (up-split painter (- n 1)))
(right (right-split painter (- n 1))))
(let ((top-left (beside up up))
(bottom-right (below right right))
(corner (corner-split painter (- n 1))))
(beside (below painter top-left)
(below bottom-right corner))))))
(define cs3 (corner-split wave 3))
(display "\nCorner split 3\n")
(paint cs3)
; Define `square-limit` pattern
(define (square-limit painter n)
(let ((quarter (corner-split painter n)))
(let ((half (beside (flip-horiz quarter) quarter)))
(below (flip-vert half) half))))
(define sl3 (square-limit wave 3))
(display "\nSquare limit pattern 3\n")
(paint sl3)