アットウィキロゴ
S.O.W - SICPお勉強Wiki
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

S.O.W - SICPお勉強Wiki

Exercises 2.2.4

最終更新:

tar0_puzzle

- view
メンバー限定 登録/ログイン

Chapter 2.2.4

Picture Language




Exercise 2.44

(define (align-operator combiner op1 op2)
  (lambda (painter) (combiner (op1 painter) (op2 painter))))
(define align-vert (align-operator below identity identity))
(define align-horiz (align-operator beside identity identity))
(define (up-split painter n)
  (if (= n 0) painter
    (below painter (align-horiz (up-split painter (- n 1))))))
 

Exercise 2.45

(define right-split (split beside below))
(define up-split (split below beside))
(define (split align-identity align-splitted)
  (define (splitter painter n)
    (if (= n 0) painter
      (align-identity painter
		      ((align-operator align-splitted)
		       (splitter painter (- n 1))))))
  splitter)
 

以降はFrame, Painterの実装について

Exercise 2.46

; vector constructor and selectors
; vector operating procedures
(define make-vect cons)
(define x-vect car)
(define y-vect cdr)
(define (add-vect u v)
  (make-vect (+ (x-vect u) (x-vect v))
	       (+ (y-vect u) (y-vect v))))
(define (sub-vect u v)
  (make-vect (- (x-vect u) (x-vect v))
	       (- (y-vect u) (y-vect v))))
(define (scale-vect a v)
  (make-vect (* a (x-vect v)) (* a (y-vect v))))
 

Exercise 2.47

; implementing a frame
(define (make-frame1 origin h-edge v-edge) (list origin h-edge v-edge))
(define origin-frame1 car)
(define h-edge-frame1 (lambda (x) (car (cdr x))))
(define v-edge-frame1 (lambda (x) (car (cdr (cdr x)))))
 
(define (make-frame2 origin h-edge v-edge) (cons origin (cons h-edge v-edge)))
(define origin-frame2 car)
(define h-edge-frame2 (lambda (x) (cdr (car x))))
(define v-edge-frame2 (lambda (x) (cdr (cdr x))))
 

Exercise 2.48

; segment:線分 = 始点, 終点
(define make-segment cons)
(define start-segment car)
(define end-segment cdr)
 

Exercise 2.49

implementing some primitive painters
; outline: draws the outlines of the given frame
; diagonal: draws an X by connecting opposite corners
; diamond: draws a diamond shape by connecting midpoint of sides
; wave
(define outline (segment->painter
		 (list (make-segment (make-vect 0.0 0.0) (make-vect 1.0 0.0))
		       (make-segment (make-vect 1.0 0.0) (make-vect 1.0 1.0))
		       (make-segment (make-vect 1.0 1.0) (make-vect 0.0 1.0))
		       (make-segment (make-vect 0.0 1.0) (make-vect 0.0 0.0)))))
(define diagonal (segment->painter
		  (list (make-segment (make-vect 0.0 0.0) (make-vect 1.0 1.0))
			(make-segment (make-vect 1.0 0.0) (make-vect 0.0 1.0)))))
(define diamond (segment->painter
		 (list (make-segment (make-vect 0.0 0.5) (make-vect 0.5 1.0))
		       (make-segment (make-vect 0.5 1.0) (make-vect 0.5 0.0))
		       (make-segment (make-vect 0.5 0.0) (make-vect 0.0 0.5)))))
(define wave (segment->painter
	      (list (make-segment (make-vect 0.0 0.86) (make-vect 0.14 0.6))
		    (make-segment (make-vect 0.14 0.6) (make-vect 0.25 0.64))
		    (make-segment (make-vect 0.25 0.64) (make-vect 0.39 0.64))
		    (make-segment (make-vect 0.39 0.64) (make-vect 0.36 0.86))
		    (make-segment (make-vect 0.36 0.86) (make-vect 0.39 1.0)) ;;
		    (make-segment (make-vect 0.61 1.0) (make-vect 0.64 0.86))
		    (make-segment (make-vect 0.64 0.86) (make-vect 0.61 0.64))
		    (make-segment (make-vect 0.61 0.64) (make-vect 0.75 0.64))
		    (make-segment (make-vect 0.75 0.64) (make-vect 1.0 0.35)) ;;
		    (make-segment (make-vect 0.0 0.64) (make-vect 0.14 0.39))
		    (make-segment (make-vect 0.14 0.39) (make-vect 0.25 0.6))
		    (make-segment (make-vect 0.25 0.6) (make-vect 0.36 0.5))
		    (make-segment (make-vect 0.36 0.5) (make-vect 0.25 0.0)) ;;
		    (make-segment (make-vect 0.39 0.0) (make-vect 0.5 0.29))
		    (make-segment (make-vect 0.5 0.29) (make-vect 0.61 0.0)) ;;
		    (make-segment (make-vect 0.75 0.0) (make-vect 0.61 0.47))
		    (make-segment (make-vect 0.61 0.47) (make-vect 1.0 0.14)))))
 

Exercise 2.50

(define (flip-vert painter)
  (transform-painter painter
		     (make-vect 0.0 1.0)
		     (make-vect 1.0 1.0)
		     (make-vect 0.0 0.0)))
(define (flip-horiz painter)
  (transform-painter painter
		     (make-vect 1.0 0.0)
		     (make-vect 0.0 0.0)
		     (make-vect 1.0 1.0)))
(define (rotate180 painter)
  (transform-painter painter
		     (make-vect 1.0 1.0)
		     (make-vect 0.0 1.0)
		     (make-vect 1.0 0.0)))
(define (rotate90 painter)
  (transform-painter painter
		     (make-vect 1.0 0.0)
		     (make-vect 1.0 1.0)
		     (make-vect 0.0 0.0)))
(define (rotate270 painter)
  (transform-painter painter
		     (make-vect 0.0 1.0)
		     (make-vect 0.0 0.0)
		     (make-vect 1.0 1.0)))
 

Exercise 2.51

(define (beside painter1 painter2)
  (let ((paint-left (transform-painter painter1
				       (make-vect 0.0 0.0)
				       (make-vect 0.5 0.0)
				       (make-vect 0.0 1.0)))
	(paint-right (transform-painter painter2
					(make-vect 0.5 0.0)
					(make-vect 1.0 0.0)
					(make-vect 0.5 1.0))))
    (lambda (frame)
      (paint-left frame)
      (paint-right frame))))
(define (below painter1 painter2)
  (let ((paint-bottom (transform-painter painter1
					 (make-vect 0.0 0.0)
					 (make-vect 1.0 0.0)
					 (make-vect 0.0 0.5)))
	(paint-top (transform-painter painter2
				      (make-vect 0.0 0.5)
				      (make-vect 1.0 0.5)
				      (make-vect 0.0 1.0))))
    (lambda (frame)
      (paint-top frame)
      (paint-bottom frame))))
 
記事メニュー
最近更新されたスレッド
ウィキ募集バナー