Right-split
and up-split
can be expressed as instances of a general splitting operation. Define a procedure split
with the property that evaluating
(define right-split (split beside below)) (define up-split (split below beside))
produces procedures
right-split
and up-split
with the same behaviors as the ones already defined. What we want
split
to do here is to return a procedure that takes a painter
and some integer value, n
that applies the supplied splitting operations in the given order. As we noted in exercise 2.44, right-split
and up-split
are very similar. Here they are again, but with the differences highlighted:
(define (right-split painter n) (if (= n 0) painter (let ((smaller (right-split painter (- n 1)))) (beside painter (below smaller smaller))))) (define (up-split painter n) (if (= n 0) painter (let ((smaller (up-split painter (- n 1)))) (below painter (beside smaller smaller)))))This gives us the pattern for the procedure we want
split
to return. We just need to replace the calls to below
and beside
with the appropriate calls to the supplied splitting operations. We can define this as an inner procedure for split
and then return a lambda expression that invokes the procedure with the appropriate values:
(define (split large-splitter small-splitter) (define (splitter painter n) (if (= n 0) painter (let ((smaller (splitter painter (- n 1)))) (large-splitter painter (small-splitter smaller smaller))))) (lambda (painter n) (splitter painter n)))We can then use this to produce new versions of
right-split
and up-split
:
(define right-split (split beside below)) (define up-split (split below beside))...and then try them out. Invoking:
(right-split spiral 4)...produces:
(up-split spiral 4)...produces:
No comments:
Post a Comment