sicp exercise ch2 - andstudy/forge GitHub Wiki

Soomong

Exercise 2.17. last-pair

    (define (last-pair list)
      (if (null? (cdr list))
          list
          (last-pair (cdr list))))
    
    (last-pair (list 23 72 149 34))

Exercise 2.18. reverse

    (define (reverse-new list)
      (if (null? (cdr list))
          list
          (cons (reverse-new (cdr list))
                (car list))))
    (reverse-new (list 1 4 9 16 25))

Exercise 2.20. same-parity

    (define (iter list fun)
      (if (null? list)
          '()
          (if (fun (car list))
              (cons (car list)
                    (iter (cdr list) fun))
              (iter (cdr list) fun))))
    (define (same-parity . x)
      (if (even? (car x))
          (iter x even?)
          (iter x odd?)))
    
    (same-parity 1 2 3 4 5 6 7)
    (same-parity 6 5 4 3 2 1)

Exercise 2.21. square-list

    (define (square-list items)
      (if (null? items)
          items
          (cons (* (car items) (car items))
                (square-list (cdr items)))))
    
    (define (square-map items)
      (map (lambda (x) (* x x)) items))
    
    (square-list (list 2 4 5))
    (square-map (list 2 4 5))

Exercise 2.27

    (define (reverse-new list)
      (if (null? (cdr list))
          list
          (cons (reverse-new (cdr list))
                (car list))))
    (reverse-new (list (list 1 2) (list 3 4)))

Exercise 2.30

    (define (square-tree tree)
      (cond ((null? tree) '())
            ((not (pair? tree)) (* tree tree))
            (else (cons (square-tree (car tree))
                        (square-tree (cdr tree))))))
    
    (define (square-tree-map tree)
      (map (lambda (x)
             (if (pair? x)
                 (square-tree-map x)
                 (* x x)))
           tree))
    
    (square-tree (list 1
                       (list 2 (list 3 4) 5)
                       (list 6 7)))
    (square-tree-map (list 1
                       (list 2 (list 3 4) 5)
                       (list 6 7)))

Exercise 2.31

    (define (tree-map fun tree)
      (map (lambda (x) 
             (if (pair? x)
                 (tree-map fun x)
                 (fun x)))
           tree))
    
    (define (square x) (* x x))
    (define (square-tree tree)
      (tree-map square tree))
    
    (square-tree (list 1
                       (list 2 (list 3 4) 5)
                       (list 6 7)))

Exercise 2.36

    (define (accumulate op initial sequence)
      (if (null? sequence)
          initial
          (op (car sequence)
              (accumulate op initial (cdr sequence)))))
    
    (define (accumulate-n op init seqs)
      (if (null? seqs) 
          '()
          (if (null? (car seqs))
              '()
              (cons (accumulate op init (map car seqs))
                    (accumulate-n op init (map cdr seqs))))))
    
    (define s (list (list 1 2 3) (list 4 5 6) (list 7 8 9) (list 10 11 12)))
    (accumulate-n + 0 s)

๊น€๋ช…๊ด€

Exercise 2.18. reverse

    (define (reverse-new param)
      (define (reverse-iter n o)
        (if (null? o)
            n
            (reverse-iter (cons (car o) n) (cdr o))))
      (reverse-iter (list) param))
    
    (reverse-new (list 1 4 9 16 25))

Exercise 2.20. same-parity

    (define (same-parity x . z)
      (define (iter n o)
        (if (null? o)
            (reverse n)
            (if (equal? (even? x)
                        (even? (car o)))
                (iter (cons (car o) n) (cdr o))
                (iter n (cdr o)))))
      (iter (list x) z))
    
    (same-parity 1 2 3 4 5 6 7)
    (same-parity 2 3 4 5 6 7)

Exercise 2.23. for-each

    (define (for-each2 proc items)
      (if (null? items)
          (newline)
          (and (proc (car items)) (for-each2 proc (cdr items))) ))
    
    (for-each2 (lambda (x) (newline) (display x))
               (list 57 321 88))

Exercise 2.25

    (car (cdr (car (cdr (cdr (list 1 3 (list 5 7) 9))))))
    (car (car (list (list 7))))
    (car (cdr 
          (car (cdr 
                (car (cdr 
                      (car (cdr 
                            (car (cdr 
                                  (car (cdr 
                                        (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7))))))))))))))))))

Exercise 2.27

    (define (deep-reverse items)
      (define (iter n o)
        (cond ((null? o) n)
              (else (iter (cons (if (pair? (car o))
                                    (iter (list) (car o))
                                    (car o))
                                n)
                          (cdr o)))))
      (iter (list) items))
    
    (define x (list (list 1 2) (list 3 4)))
    (deep-reverse x)

Exercise 2.28

    (define (fringe x)
      (cond ((null? x) (list))
            ((not (pair? x)) (list x))
            (else (append (fringe (car x))
                          (fringe (cdr x))))))
    
    (define x (list (list 1 2 ) (list 3 4 )))
    (fringe x)
    (fringe (list x x))

Exercise 2.30

    (define (square-tree x)
      (cond ((null? x) (list))
            ((not (pair? x)) (* x x))
            (else (cons (square-tree (car x))
                        (square-tree (cdr x))))))
    
    (define (square-tree2 x)
      (map (lambda (sub-tree)
             (if (pair? sub-tree)
                 (square-tree2 sub-tree)
                 (* sub-tree sub-tree)))
           x))
    
    (define x
     (list 1
           (list 2 (list 3 4) 5)
           (list 6 7)))
    (square-tree x)
    (square-tree2 x)

bt22d

  • MIT Scheme์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—
  • Dr. Scheme์—์„œ ํ…Œ์ŠคํŠธ ํ•˜์‹œ๋ ค๋ฉด ๊ธฐ๋ณธ ํ”„๋กœ์‹œ์ €์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • (ex. append -> append1/append-new)

Exercise 2.17

    (define (last-pair items)
      (if (null? (cdr items))
          items
          (last-pair (cdr items))))
    (last-pair (list 23 34 39 99))

Exercise 2.18. reverse

    (define (reverse items)
      (if (null? (cdr items))
          items
          (append (reverse (cdr items)) (list (car items)))))
    (reverse (list 1 2 3 4))
    ; output : (4 3 2 1)

Exercise 2.20

    (define (parity-list items fun)
      (if (null? items)
          items
          (if (fun (car items))
    	  (cons (car items) (parity-list (cdr items) fun))
    	  (parity-list (cdr items) fun))))
    
    (define (same-parity p . items)
      (cons p (parity-list items 
                           (if (odd? p) odd? even?))))
    (same-parity 2 3 4 5 6)

Exercise 2.23. for-each

    (for-each (lambda (x) (newline) (display x))
    	  (list 1 2 34 5))
    (define (for-each1 proc items)
      (if (null? items)
          (proc items)
          (for-each1 proc (cdr items))))

Exercise 2.27

    (define x (list (list 1 2) (list 3 4)))
    
    (define (deep-reverse items)
      (cond ((not (pair? items)) items)
    	(else (append (deep-reverse (cdr items)) 
                      (list (deep-reverse (car items)))))))
    (deep-reverse x)
    ; output : ((4 3) (2 1))

Exercise 2.28

    (define (fringle tree)
      (cond ((null? tree) '())
    	((not (pair? tree)) (list tree))
    	(else (append (fringle (car tree))
    		      (fringle (cdr tree))))))
    (fringle (list 1 (list 2 (list 3 4)) 5))

Exercise 2.30

    (square-tree
     (list 1
           (list 2 (list 3 4) 5)
           (list 6 7)))
    
    (define (square-tree tree)
      (cond ((null? tree) '())
    	((not (pair? tree)) (square tree))
    	(else (cons (square-tree (car tree))
    				 (square-tree (cdr tree))))))
    
    (define (square-tree tree)
      (map (lambda (sub-tree)
    	 (if (pair? sub-tree)
    	     (square-tree sub-tree)
    	     (square sub-tree)))
           tree))

Exercise 2.31

    (define (tree-map proc tree)
      (cond ((null? tree) '())
    	((not (pair? tree)) (proc tree))
    	(else (cons (tree-map proc (car tree))
    		    (tree-map proc (cdr tree))))))
    (define (square-tree tree) (tree-map square tree))
    (square-tree
     (list 1 (list 2 (list 3 4) 5) (list 6 7)))

Exercise 2.32

    (define (subsets s)
      (if (null? s)
          (list '())
          (let ((rest (subsets (cdr s))))
    	(append rest (map (lambda (x)
    			    (cons (car s) x)) rest)))))
    (subsets (list 1 2 3))
    ; output : (() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3))

Exercise 2.33

    (define (map p sequence)
      (accumulate (lambda (x y) (cons (p x) y)) '() sequence))
    (map square (list 1 2 3 4))
    
    (define (append seq1 seq2)
      (accumulate cons seq2 seq1))
    (append (list 1 2 3) (list 4 5 6))
    
    (define (length sequence)
      (accumulate (lambda (x y) (+ 1 y)) 0 sequence))

Exercise 2.35

    (define (count-leaves t)
      (accumulate + 0 (map (lambda x 1) (enumerate-tree t))))
    (count-leaves (list 1 (list 2 (list 3 4)) 5))
    ; output : 5

Exercise 2.36

    (define (accumulate-n op init seqs)
      (if (null? (car seqs))
          '()
          (cons (accumulate op init (map car seqs))
    	    (accumulate-n op init (map cdr seqs)))))
    (accumulate-n + 0 (list (list 1 2 3) (list 4 5 6) (list 7 8 9) (list 10 11 12)))
    ; output : (22 26 30)

Exercise 2.37

    (define (dot-product v w)
      (accumulate + 0 (map * v w)))
    
    (define (matrix-*-vector m v)
      (map (lambda x (dot-product v (car x))) m))
    
    (define (transpose mat)
      (accumulate-n cons '() mat))
    
    (define (matrix-*-matrix m n)
      (let ((cols (transpose n)))
        (map (lambda x (accumulate-n * 1 cols)) m)))

Exercise 2.39

    (define (reverse sequence)
      (fold-right (lambda (x y) (append y (list x))) '() sequence))
    
    ; fold-left ๋ฒ„์ „ ํ•œ์ฐธ ๊ณ ๋ฏผํ–ˆ์—ˆ๋Š”๋ฐ... -_-;; ์ •์˜คํ‘œ ์ฐธ๊ณ ํ•˜์„ธ์š”.
    (define (reverse sequence)
      (fold-left (lambda (x y) (cons y x)) '() sequence))

kukuman

Exercise 2.17. last-pair

    (define (last-pair1 list1)
     (if( null? (cdr list1))
        list1
        (last-pair1 (cdr list1))
     ))
    (last-pair1 (list 23 72 149 34))

Exercise 2.27

    ( define (reverse1 list1)
       (null? cdr list1)
       (list1)
       (cons ( reverse1(cdr list1) car list1))
    )
    
    (reverse (list 1 4 9 16 25)) 

ogmj

๋ฌธ์ œ 2.53

    (list 'a 'b 'c)
    >> (a b c)
    (list (list 'george))
    >> ((george))
    (cdr '((x1 x2) (y1 y2)))
    >> ((y1 y2))
    (cadr '((x1 x2) (y1 y2)))
    >> (y1 y2)
    (pair? (car '(a short list)))
    >> #f
    (memq 'red '((red shoes) (blue shoes)))
    >> #f
    (memq 'red '((red shoes)))
    >> #f
    
    ๋ฒˆ์™ธ
    (memq 'red '(red shoes))
    >> (red shoes)
    (memq 'red '(red shoes blue socks))
    >> (red shoes blue socks)
    (memq 'red '(blue shoes blue socks))
    >> #f

๋ฌธ์ œ 2.54

    ๋ฌธ์ œ 2.54 eq?๋ฅผ ์‚ฌ์šฉํ•œ ๋˜๋Œ๋ฆฌ๊ธฐ ํ”„๋กœ์‹œ์ €๋กœ equal?๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ.
    (define (equal-n a b)
      (cond ((null? a) false)
            ((null? b) false)
            (else (cond ((eq? (car b) (car a)) 
                         (if (and (null? (cdr a)) (null? (cdr b)))
                          true
                          (equal-n (cdr a) (cdr b)))
                         )
                   (else false))
                  )
            )
      )
    
    ๊ฒฐ๊ณผ
    (equal-n '() '())
    >> #f
    (equal-n '(a) '())
    >> #f
    (equal-n '() '(a))
    >> #f
    (equal-n '(a c b) '(a b c))
    >> #f
    (equal-n '(this is a list) '(this (is a) list))
    >> #f
    (equal-n '(this is a list) '(this is a list))
    >> #t
    (equal-n (list 1 2 3 4) (list 1 2 3 4))  
    >> #t
    (equal-n (list 1 2 3 4) (list 1 2 3)) 
    >> #f

๋ฌธ์ œ 2.55

    (car ''abracadabra)
    >> quote
    (car '(abracadabra))
    >> abracadabra
    (car '(a))
    >> a
    (car '(a b c))
    >> a
    (car (quote (a b c)))
    >> a
    ;(car (quote a b c))
    >> bad syntax
    (car (quote (quote (abracadabra))))
    >> quote

๋ฌธ์ œ 2.56

    (define (deriv exp var)
      (cond ((number? exp) 0)
            ((variable? exp)
             (if (same-variable? exp var) 
                 1 
                 0))
            ((sum? exp)
              (make-sum (deriv (addend exp) var)
                        (deriv (augend exp) var)))
            ((product? exp)
             (make-sum 
              (make-product (multiplier exp)
                            (deriv (multiplicand exp) var))
              (make-product (deriv (multiplier exp) var)
                            (multiplicand exp))))
            ((exponentiation? exp)
             (make-product
              (exponect exp)
              (make-product
               (make-exponentiation (base exp) 
                                   (exponect exp))
               (deriv (base exp) var))))
               
             (else
              (error "unknown expression type -- DERIV" exp))))
    
    ;์ง€์ˆ˜์—ฐ์‚ฐ
    (define (exponentiation? x)
      (and (pair? x) (eq? (car x) '**)))
    ;๋ฐ‘์ˆ˜์—ฐ์‚ฐ
    (define (base x)(cadr x))
    ;(define (base x var)
    ;  (if (eq? (cadr x) var)
    ;      (cadr x) 
    ;       0))
    
    ;์œ—์ˆ˜์—ฐ์‚ฐ
    (define (exponect x) (caddr x))
    
    (define (make-exponentiation b e)
      (cond ((=number? b 0) 0)
            ((=number? e 0) (list '1))
            ((=number? e 1) (list b))
            (else (list '** b (- e 1)))))
      
    ;1๋ฏธ๋ถ„์‹์˜ ๋ณ€์ˆ˜๋Š” ๊ธ€์ž๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. 
    ;์–ด๋–ค ๊ฐ’์ด ๊ธฐํ˜ธ์ธ์ง€ ์•„๋‹Œ์ง€ ์•Œ์•„๋ณด๋Š” ๊ธฐ๋ณธ ํ”„๋กœ์‹œ์ €๋Š” symbol?์ด๋‹ค.
    (define (variable? x) (symbol? x))
    
    ;2๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ๊ธฐํšŒ๊ฐ€ eq?ํ•˜๋‹ค๋ฉด, ๋‘ ๋ณ€์ˆ˜๋Š” ๊ฐ™๋‹ค.
    (define (same-variable? v1 v2) 
      (and (variable? v1) (variable? v2) (eq? v1 v2)))
    
    ;3๋ง์…ˆ ์‹๊ณผ ๊ณฑ์…ˆ ์‹์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์จ์„œ ์งœ๋งž์ถ˜๋‹ค.
    (define (make-sum a1 a2) 
      ;(list '+ a1 a2))
      (cond ((=number? a1 0)
             a2)
            ((=number? a2 0)
             a1)
            ((and (number? a1 ) (number? a2))
             (+ a1 a2))
            (else (list '+ a1 a2))))
    ;3-1
    (define (=number? exp num)
      (and (number? exp) (= exp num)))
    
    (define (make-product m1 m2) 
      ;(list '* m1 m2))
      (cond ((or (=number? m1 0) (=number? m2 0)) 0)
            ((=number? m1 1) m2)
            ((=number? m2 1) m1)
            ((and (number? m1) (number? m2)) (* m1 m2))
            (else (list '* m1 m2))))
    
    ;4๋ง์…ˆ ์‹์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๊ฐ€ +๊ธฐํ˜ธ๋กœ ์‹œ์ž‘๋˜๋Š” ๋ฆฌ์ŠคํŠธ์ด๋‹ค.
    (define (sum? x)
      (and (pair? x) (eq? (car x) '+)))
    
    ;5๋”ํ•˜์ž„ ์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ 2๋ฒˆ์งธ ์›์†Œ์ด๋‹ค.
    (define (augend s) (cadr s))
    
    ;6๋ง์ˆ˜๋Š” ๋ง์…ˆ ๋ฆฌ์ŠคํŠธ์ด 3๋ฒˆ์งธ ์›์†Œ์ด๋‹ค.
    (define (addend s) (caddr s))
    
    ;7๊ณฑ์…ˆ ์‹์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๊ฐ€ *๊ธฐํ˜ธ๋กœ ์‹œ์ž‘๋˜๋Š” ๋ฆฌ์ŠคํŠธ์ด๋‹ค.
    (define (product? x)
      (and (pair? x) (eq? (car x) '*)))
    
    ;8๊ณฑํ•˜์ž„์ˆ˜๋Š” ๊ณฑ์…ˆ ๋ฆฌ์ŠคํŠธ์˜ 2๋ฒˆ์งธ ์›์†Œ์ด๋‹ค.
    (define (multiplicand p) (cadr p))
    
    ;9๊ณฑ์ˆ˜๋Š” ๊ณฑ์…ˆ ๋ฆฌ์ŠคํŠธ์˜ 3๋ฒˆ์งธ ์›์†Œ์ด๋‹ค.
    (define (multiplier p) (caddr p))
    
    ;๊ฒฐ๊ณผ
    (deriv '(+ x 3) 'x)
    >> 1
    (deriv '(* x y) 'x)
    >> y
    (deriv '(* (* x y) (+ x 3)) 'x)
    >> (+ (* (+ x 3) y) (* x y))
    (deriv '(* x x) 'x)
    >> (+ x x)
    (deriv '(** x 3) 'x)
    >> (* 3 (** x 2))
    (deriv '(** x 2) 'x)
    >> (* 2 (** x 1))
    (deriv '(** x 1) 'x)
    >> (x)
    (deriv '(** x 0) 'x)
    >> 0
    (deriv '(+ (** x 4) (** x 3) (** x 2)) 'x)
    >> (+ (* 3 (** x 2)) (* 4 (** x 3))) ;2๋งˆ๋””๊นŒ์ง€๋งŒ ๊ณ„์‚ฐ๋จ
    (deriv '(+ (** x 4) (** x 3)) 'x)
    >> (+ (* 3 (** x 2)) (* 4 (** x 3)))
    (deriv '(** z 4) 'x)
    >> 0

๋ฌธ์ œ 2.57

    NoSyu๋‹˜ ๋‹ต
    ;5๋”ํ•˜์ž„ ์ˆ˜
    (define (augend s) 
     ; (cadr s))
      (if (null? (cdddr s))
          (caddr s)
          (make-sum (caddr s) (cadddr s))))
    
    ;8๊ณฑํ•˜์ž„ ์ˆ˜
    (define (multiplicand p) 
     ; (cadr p))
      (if (null? (cdddr p))
          (caddr p)
          (make-product (caddr p) (cadddr p))))
    
    (deriv '(+ (** x 4) (** x 3) (** x 2)) 'x)
    >> (+ (* 3 (** x 2)) (+ (* 2 (** x 1)) (* 2 (** x 1)))) ; ๋‹ต์ด ์ด์ƒํ•จ
    
    ogmj ๊ฒ€์‚ฐ
    ;6๋ง์ˆ˜
    (define (addend s) 
     ; (caddr s))
      (if (null? (cdddr s))
          (caddr s)
          (make-sum (caddr s) (cadddr s))))
    
    ;9๊ณฑ์ˆ˜
    (define (multiplier p) 
     ; (caddr p))
      (if (null? (cdddr p))
          (caddr p)
          (make-product (caddr p) (cadddr p))))
    
    (deriv '(+ (* 3 (** x 3)) (* x 2)) 'x)
    >> (+ 2 (* (* 3 (** x 2)) 3)) ;9x^2 + 2
    (deriv '(+ (** x 4) (** x 3) (** x 2)) 'x)
    >> (+ (+ (* 2 (** x 1)) (* 3 (** x 2))) (* 4 (** x 3))) ;4x^3 + 3x^2 + 2x

๋ฌธ์ œ 2.59

    ;Language - Pretty Big
    (define (element-of-set? x set)
      (cond ((null? set) false)
            ((equal? x (car set)) true)
            (else (element-of-set? x (cdr set)))))
    
    (define (adjoin-set x set)
      (if (element-of-set? x set)
          set
          (cons x set)))
    
    (define (intersection-set set1 set2)
      (cond ((or (null? set1) (null? set2)) '()) 
            ((element-of-set? (car set1) set2)
             (cons (car set1)
                   (intersection-set (cdr set1) set2)))
           (else (intersection-set (cdr set1) set2))))
    
    
    (define (unio-set set1 set2)
      ;๋‘ ์ง‘ํ•ฉ์ด ๋‘˜๋‹ค ๋น„์—ˆ์œผ๋ฉด ๊ณต์ง‘ํ•ฉ ํ‘œ์‹œ
      (cond ((null? set1) set2)
            ((null? set2) set1)
             ;set1์˜ 1๋ฒˆ ์›์†Œ๋ž‘ set2์˜ ์›์†Œ๋“ค๊ณผ ๋น„๊ต
             ((element-of-set? (car set1) set2)
              ;๊ฐ™์€ ์›์†Œ๊ฐ€ ์žˆ์œผ๋ฉด set1์˜ ๋‹ค์Œ์›์†Œ๋ฅผ ๊ฒ€์‚ฌ
              (unio-set (cdr set1) set2))
             ;๊ฐ™์€ ์›์†Œ๊ฐ€ ์—†์œผ๋ฉด set2์— ์ถ”๊ฐ€
            (else (cons (car set1)
                  (unio-set (cdr set1) set2)))))
     ;       (else
     ;        (unio-set (adjoin-set (car set2) set1) (cdr set2)))))
                  
    
    (define x1 (list 1 2 3 5))
    (define y1 (list 2 3 4))
    x1
    >> (1 2 3 5)
    y1
    >> (2 3 4)
    (element-of-set? 5 x1)
    >> #t
    (intersection-set x1 y1)
    >> (2 3)
    (unio-set x1 y1)
    >> (1 5 2 3 4)
    x1
    >> (1 2 3 5)
    y1
    >> (2 3 4)

๋ฌธ์ œ 2.61

    (define (element-of-set? x set)
      (cond ((null? set) false)
            ((= x (car set)) true)
            ((< x (car set)) false)
            (else (element-of-set? x (cdr set)))))
    
    (define (intersection-set set1 set2)
      (if (or (null? set1) (null? set2))
          '()
          (let ((x1 (car set1)) (x2 (car set2)))
            (cond ((= x1 x2)
                   (cons x1
                         (intersection-set (cdr set1)
                                           (cdr set2))))
                  ((< x1 x2)
                   (intersection-set (cdr set1) set2))
                  ((< x2 x1)
                   (intersection-set set1 (cdr set2))))))) 
    
    (define (adjoin-set x set)
      (cond ((equal? x (car set)) set)
            ((< (car set) x)
             (if (null? (cdr set))
                 (list (car set) x)
                 (cons (car set) (adjoin-set x (cdr set)))))
            ((< x (car set)) (cons x set)))) 
    
    (define x1 (list 2 4 6))
    x1
    >> (2 4 6)
    (adjoin-set 1 x1)
    >> (1 2 4 6)
    (adjoin-set 2 x1)
    >> (2 4 6)
    (adjoin-set 7 x1)
    >> (2 4 6 7)

jaejyn

Exercise 2.2.

    (define (x-point p) (car p))
    
    (define (y-point p) (cdr p))
    
    (define (make-point x y)
      (cons x y))
    
    (define (start-seg seg) (car seg))
    
    (define (end-seg seg) (cdr seg))
    
    (define (make-seg s e)
      (cons s e))
    
    (define (mid-value x y)
      (/ (+ x y) 2))
    
    (define (midpoint-seg s e)
      (make-seg (mid-value (x-point s) (x-point e)) 
                (mid-value (y-point s) (y-point e)))) 

Exercise 2.3.

    (define (make-rect topLeft bottomRight)
      (cons topLeft bottomRight))
    
    (define (topLeft-rect rect)
      (car rect))
    
    (define (bottomRight-rect rect)
      (cdr rect))
    
    (define (width-rect rect)
      (- (x-point (bottomRight-rect rect)) (x-point (topLeft-rect rect))))
    
    (define (height-rect rect)
      (- (y-point (topLeft-rect rect)) (y-point (bottomRight-rect rect))))
    
    (define (round-rect rect)
      (* 2 (+ (width-rect rect) (height-rect rect))))
    
    (define (area-rect rect)
      (* (width-rect rect) (height-rect rect)))

Exercise 2.7.

    (define (upper-bound interval)
      (cdr interval))
    
    (define (lower-bound interval)
      (car interval))

Exercise 2.8.

    (define (sub-interval x y)
      (add-interval x (mul-interval -1 y)))

Exercise 2.11.

    (define (new-mul-interval x y)
      (cond ((and (minus-plus x) (plus-plus y)) (make-interval (* (lower-bound x) (upper-bound y)) (* (upper-bound x) (upper-bound y))))
            ((and (plus-plus x) (minus-plus y)) (make-interval (* (upper-bound x) (lower-bound y)) (* (upper-bound x) (upper-bound y))))
            ((and (minus-minus x) (plus-plus y)) (make-interval (* (lower-bound x) (upper-bound y)) (* (upper-bound x) (lower-bound y))))
            ((and (plus-plus x) (minus-minus y)) (make-interval (* (upper-bound x) (lower-bound y)) (* (lower-bound x) (upper-bound y))))
            
            ((and (minus-plus x) (minus-plus y)) (make-interval (min (* (lower-bound x) (upper-bound y)) (* (upper-bound x) (lower-bound x)))
                                                                (max (* (lower-bound x) (lower-bound y)) (* (upper-bound x) (upper-bound y)))))
            
            ((and (minus-minus x) (minus-plus y)) (make-interval (* (lower-bound x) (upper-bound y)) (* (lower-bound x) (lower-bound y))))
            ((and (minus-plus x) (minus-minus y)) (make-interval (* (upper-bound x) (lower-bound y)) (* (lower-bound x) (lower-bound y))))
            ((and (minus-minus x) (minus-minus y)) (make-interval (* (upper-bound x) (upper-bound y)) (* (lower-bound x) (lower-bound y))))
            ((and (plus-plus x) (plus-plus y)) (make-interval (* (lower-bound x) (lower-bound y)) (* (upper-bound x) (upper-bound y))))))

Exercise 2.54.

    (define (equal? x y)
      (define (equal_iter a b)
        (cond ((and (null? a) (null? b))
            'true)
            ((not (equal_length? a b))
             'false)
            ((eq? (car a) (car b)) 
             (equal_iter (cdr a) (cdr b)))
            (else 'false)))
      (equal_iter x y))

Exercise 2.56.

    (define (exponentiation? x)
      (and (pair? x) (eq? (car x) '**)))
    (define (base p) (cadr p))
    (define (exponent p) (caddr p))
    (define (make-exponentiation m1 m2) 
      (cond 
           ((=number? m1 0) 0)
           ((=number? m2 0) 1)
           ((and (number? m1) (number? m2)) (fast-expt m1 m2))
           (else (list '** m1 m2))))
    
    (define (deriv exp var)
      (cond ((number? exp) 0)
                ((variable? exp)
                  (if (same-variable? exp var) 1 0))
                ((sum? exp)
                  (make-sum (deriv (addend exp) var)
                     (deriv (augend exp) var)))
               ((product? exp)
                 (make-sum
                  (make-product (multiplier exp)
                      (deriv (multiplicand exp) var))
                  (make-product (deriv (multiplier exp) var)
                           (multiplicand exp))))
               ((exponentiation? exp)
                 (make-product (exponent exp)
                              (make-product  (make-exponentiation (base exp) (- (exponent exp) 1)) 
                                                       (deriv (base exp) var))))
              (else
                (error "unknown expression type -- DERIV" exp))))

Exercise 2.59.

    (define (union-set set1 set2)
      (cond     
        ((null? set1) set2)
        ((null? set2) set1)
        (else (union-set (adjoin-set (car set2) set1) (cdr set2)))))

Exercise 2.61.

    (define (adjoin-set x set)
      (cond ((null? set) '()) 
                ((> x (car set)) (cons (car set) (adjoin-set x (cdr set))))
                ((< x (car set)) (cons x set))
                ((= x (car set)) set)))

Exercise 2.62.

    (define (union-set set1 set2)
      (cond ((null? set1) set2)
    		((null? set2) set1)
    		(else (let ((x1 (car set1)) (x2 (car set2)))
    					(cond ((< x1 x2) (cons x1 (union-set (cdr set1) set2)))
    				   ((> x1 x2) (cons x2 (union-set set1 (cdr set2))))
    				   ((= x1 x2) (cons x1 (union-set (cdr set1) (cdr set2)))))))))

seedyoon

๋ฌธ์ œ 2.74

    a
    ;get-record ํ”„๋กœ์‹œ์ €
    ;์ธ์‚ฌํŒŒ์ผ์—์„œ ์ง€์ •๋œ ์ง์› ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฝ‘์• ๋‚ผ ์ˆ˜์žˆ์Œ
    ;์ €๋งˆ๋‹ค ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์‹œ์ €์— ์ ์šฉ๋˜์–ด์•ผ 
    
    (define (get-record file employee_name)
     ((get 'get-record )) file employee_name)
    
    b
    ; ๋ถ€์„œ ์ธ์‚ฌ ํŒŒ์ผ์—์„œ ๋ด‰๊ธ‰์ •๋ณด๋ฅผ ์ฐพ์•„๋ณผ์ˆ˜ ์žˆ๋Š” get-selary ํ”„๋กœ์‹œ์ €
    ; ๋ถ€์„œ ์ธ์‚ฌ ํŒŒ์ผ
    (define (get-salary file )
      ((get 'get-salary file ))
      
    c  
    ; ๋ชจ๋“  ๋ถ€์„œ์˜ ํŒŒ์ผ์„ ๋’ค์ง€๊ณ 
    ; ์–ด๋–ค ์ง์›์˜ ๊ธฐ๋ก์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ์‹œ์ € ๊ตฌํ˜„
    ; ์ง์›์ด๋ฆ„, ๋ชจ๋“  ๋ถ€์„œ ํŒŒ์ผ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ธ์ž.
    (define (find-employee-record file-list employee-name)
      (if (null? file-list)
          (error 'NotFound employee)
          (or (get-record (car file-list) employee-name)
              (find-employee-record (cdr file-list) employee-name))))
    
    d
    ; ํ•ฉ๋ณ‘์‹œ ๋ฐ”๋€” ์ 
    ; ์ƒˆ๋กœ์šด ๋ถ€์„œ๋ฆฌ์ŠคํŠธ ํŒŒ์ผ(ํ•ฉ๋ณ‘ ํšŒ์‚ฌ)์„ ์ถ”๊ฐ€
    ; ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋ถ€์„œ๋ณ„ ํ”„๋กœ์‹œ์ €๋ฅผ ์ •์˜ ํ•ด์•ผ put ํ•ด์ค€๋‹ค.
    ; ๋‚˜๋จธ์ง€๋Š” ๋‹ค๋ฅธ์ ์ด ์—†์Œ 

๋ฌธ์ œ 2.75

    (define (make-from-mag-ang r a)
      (define (dispatch op)
        (cond ((eq? op 'real-part) (* r (cos a)))
              ((eq? op 'imag-part) (* r (sin a)))
              ((eq? op 'magnitude) r)
              ((eq? op 'angle) a)
              (else
               (error "Unknown op -- MAKE-FROM-MAG-ANG" op))))
      dispatch)

๋ฌธ์ œ 2.76

    ; ์ฃผ๊ด€์ ์ธ ์˜๊ฒฌ์œผ๋กœ ํ‹€๋ฆด์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ใ…ก_ใ…œ
    ์ง์ ‘ ๋‚˜๋ˆ  ๋งก๊ธฐ๋Š” ๋ฐฉ์‹ 
     - ํ™•์‹คํ•œ ์—ญํ™œ์˜ ๋ถ„๋ฆฌ๋Š” ๋˜์ง€๋งŒ ๊ฐ ์—ฐ์‚ฐ๊ณผ ํ”„๋กœ์‹œ์ €์˜ ์ด๋ฆ„๊ณผ ์ •์˜๋ฅผ ๋ชจ๋‘ ํ•ด ์ฃผ์–ด์•ผ ํ•จ
     - ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ํƒ€์ž…๊ณผ ์—ฐ์‚ฐ์„ ์ „์ฒด ์‹œ์Šคํ…œ์—์„œ ์•Œ์•„์•ผ ํ•จ
     - c global
     
     
    ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ๋ฐฉ์‹
     - ํƒ€์ž…์— ๋”ฐ๋ผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜, ํ•ด๋‹น ๋ฐ์ดํ„ฐ ๋‚ด์˜ ํ”„๋กœ์‹œ์ €๋ฐ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉ
     - ํ•ด๋‹น ๊พธ๋Ÿฌ๋ฏธ ๋‚ด์—์„œ ์–ด๋–ค ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ• ์ง€ ํƒ€์ž… ์ •์˜์— ์˜ํ•ด ์‹คํ–‰.
     - ์ถ”๊ฐ€๋˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ์—ฐ์‚ฐ ๋ฐ ํ”„๋กœ์‹œ์ €๋ฅผ ์ •์˜ํ•ด ์ฃผ์–ด์•ผ ํ•จ
     - c++ Class  
    
    ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ ๋ฐฉ์‹
     - Dispathch ์—ฐ์‚ฐ์„ ํ†ตํ•ด์„œ ๊ฐ๊ฐ์— ๋งž๋Š” ํ”„๋กœ์‹œ์ € ๋ฐ ์—ฐ์‚ฐ์„ ์‹คํ–‰
     - ๋ฉ”์‹œ์ง€ ํƒ€์ž…์— ์˜ํ•ด ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ์—ฐ์‚ฐ ๋ฐ ํ”„๋กœ์‹œ์ €๋ฅผ ์‹คํ–‰
     - ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ ํ•„์š” ์—†์Œ?
     - ์ผ๋ฐ˜ํ™”๋œ ํ”„๋กœ์‹œ์ €์—์„œ ์ธ์ž๋ฅผ ์˜ค๋กœ์ง€ ํ•˜๋‚˜๋ฐ–์— ๋ฐ›์ง€ ๋ชปํ•œ๋‹ค.
     - socket ํ†ต์‹  ๋ฐ window msg
    
    
    
    ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ง‘์–ด๋„ฃ์–ด์•ผ ํ•  ์ผ์ด ๋งŽ๋‹ค๋ฉด? ์–ด๋А๋ฐฉ์‹?
    	ํ•œ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ ๋‚ด๋ถ€์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๊ด€๋ จ๋œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ชจ๋‘ ์ด๋ฃจ์–ด์ ธ์•ผ ๋œ๋‹ค.
    	์ฆ‰, ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ํ•ด์•ผ ํ•  ์ผ๋“ค์ด ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•จ(์„ธ๋กœ ์š”์•ฝ์˜ ๊ฒฝ๊ณ„(p223)) 
    	๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์Œ
    
    
    ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์„ ๋ง๋ถ™์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์„๋•Œ๋Š”?
    	๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•˜์—ฌ์„œ ๋„˜์–ด์˜จ ํ”„๋กœ์‹œ์ €๋งŒ์„ ํ™•์ธํ•˜์—ฌ์„œ ์‚ฌ์šฉ. 
    	๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์™€์˜ ์ƒ๊ด€ ์—†์ด ์ถ”๊ฐ€, ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•œ ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ ๋ฐฉ์‹์œผ๋กœ ํ•˜๋Š”๊ฒƒ์ด ๋‚ซ๋‹ค.

Mastojun

์—ฐ์Šต๋ฌธ์ œ 2.1

    (define (gcd a b)
      (if (= b 0)
          a
          (gcd (abs b) (remainder (abs a) (abs b)))))
    
    (define (make-rat n d)
      (let ((g (gcd n d))
            (a (abs n))
            (b (abs d)))
        (if (< (* n d) 0 )
            (cons (- (/ a g)) (/ b g))
            (cons (/ a g) (/ b g)))))
    
    (define (numer x) (car x))
    (define (denom x) (cdr x))
    
    (define (add-rat x y)
      (make-rat (+ (* (numer x) (denom y))
                   (* (numer y) (denom x)))
                (* (denom x) (denom y))))
    
    (define (sub-rat x y)
      (make-rat (- (* (numer x) (denom y))
                   (* (numer y) (denom x)))
                (* (denom x) (denom y))))
    
    (define (mul-rat x y)
      (make-rat (* (numer x) (numer y))
                (* (denom x) (denom y))))
    
    (define (div-rat x y)
      (make-rat (* (numer x) (denom y))
                (* (denom x) (numer y))))
    
    (define (equal-rat? x y)
      (= (* (numer x) (denom y))
         (* (numer y) (denom x))))
    
    (define (print-rat x)
      (newline)
      (display (numer x))
      (display "/")
      (display (denom x)))
    
    (define one-half (make-rat -1 2))
    (print-rat one-half)
    (define one-third (make-rat 1 3))
    (print-rat (add-rat one-half one-third))
    (print-rat (mul-rat one-half one-third))
    (print-rat (add-rat one-third one-third))

์—ฐ์Šต๋ฌธ์ œ 2.2

    (define (make-segment s e) (cons s e))
    (define (start-segment x) (car x))
    (define (end-segment x) (cdr x))
    
    (define (make-point s e) (cons s e))
    (define (x-point x) (car x))
    (define (y-point y) (cdr y))
    
    (define (midpoint-segment x)
      (make-point (/ (+ (x-point (start-segment x)) (x-point (end-segment x))) 2)
                  (/ (+ (y-point (start-segment x)) (y-point (end-segment x))) 2)))
    
    (define (print-point p)
      (newline)
      (display "(");
      (display (x-point p))
      (display ",")
      (display (y-point p))
      (display ")"))
    
    (define testLint (make-segment (make-point 1 1) (make-point 2 2)))
    
    (print-point (midpoint-segment testLint))

2.4 ์—ฐ์Šต๋ฌธ์ œ

    (define (cons x y)
      (lambda (m) (m x y)))
    
    (define (car z)
      (z (lambda (p q) p)))
    
    (define (cdr z)
      (z (lambda (p q) q)))
    
    (define x (cons 1 2))
    (car x)
    (cdr x)

์—ฐ์Šต๋ฌธ์ œ 2.7, 2.8

    (define (add-interval x y)
      (make-interval (+ (lower-bound x) (lower-bound y))
                     (+ (upper-bound x) (upper-bound y))))
    
    (define (mul-interval x y)
      (let ((p1 (* (lower-bound x) (lower-bound y)))
            (p2 (* (lower-bound x) (upper-bound y)))
            (p3 (* (upper-bound x) (lower-bound y)))
            (p4 (* (upper-bound x) (upper-bound y))))
        (make-interval (min p1 p2 p3 p4)
                       (max p1 p2 p3 p4))))
    
    (define (div-interval x y)
      (mul-interval x
                    (make-interval (/ 1.0 (upper-bound y))
                                   (/ 1.0 (lower-bound y)))))
    
    (define (make-interval a b) (cons a b))
    
    (define (upper-bound x)
      (if (> (car x) (cdr x))
          (car x)
          (cdr x)))
    
    (define (lower-bound x)
      (if (> (car x) (cdr x))
          (cdr x)
          (car x)))
    
    (define (sub-interval x y)
      (make-interval (- (lower-bound x) (lower-bound y))
                     (- (upper-bound x) (upper-bound y))))

์—ฐ์Šต๋ฌธ์ œ 2.9

    ; ์ด๋ ‡๊ฒŒ ํ•˜๋Š”๊ฒŒ ๋งž๋Š”์ง€ @_@
    ; (((upper-bound x) ยฑ (upper-bound y)) - ((lower-bound x) ยฑ (lower-bound y)))/2
    ; (((upper-bound x) +- (upper-bound y)) - (lower-bound x) -+ (lower-bound y))/2
    ; ((upper-bound x) - (lower-bound x) +- (upper-bound y) -+ (lower-bound y))/2
    ; ((upper-bound x) - (lower-bound x))/2 + ( +- (upper-bound y) -+ (lower-bound y))/2
    ; + : width of x + width of y
    ; - : width of x - width of y
    ; 
    ; ๊ณฑํ•˜๊ธฐ๋‚˜ ๋‚˜๋ˆ„๊ธฐ๋Š” ๋”ํ•˜๊ณ  ์žˆ๋Š”(๋˜๋Š” ๋นผ๊ณ  ์žˆ๋Š”) ๊ตฌ๊ฐ„ ๊ฐ’์˜ ํญ์œผ๋กœ ์ผ๋ฐ˜ํ™” ์‹œํ‚ฌ ์ˆ˜ ์—†์Œ.
    ; ํ•ด๋ณด์ง„ ์•Š์•˜์ง€๋งŒ ์•„๋งˆ๋„?

์—ฐ์Šต๋ฌธ์ œ 2.17, 2.18

    (define (length items)
      (define (length-iter a count)
        (if (null? a)
            count
            (length-iter (cdr a) (+ 1 count))))
      (length-iter items 0))
    
    ; 2.17
    (define (last-pair items)
      (if (= 1 (length items))
          items
          (last-pair (cdr items))))
    
    (define (delete-end items)
        (if (= 1 (length items))
            null
            (cons (car items) (delete-end (cdr items)))))
    ; 2.18
    (define (reverse items)
      (if (= 1 (length items))
          items
          (cons (car (last-pair items)) (reverse (delete-end items)))))

์—ฐ์Šต๋ฌธ์ œ 2.20

    (define (same-parity n . items)
      (define (find-even items)
        (if (null? items)
            null
            (if (even? (car items))
                (cons (car items) (find-even (cdr items)))
                (find-even (cdr items)))))
      (define (find-odd items)
        (if (null? items)
            null
            (if (even? (car items))
                (find-odd (cdr items))
                (cons (car items) (find-odd (cdr items))))))
      
      (if (even? n)
          (cons n (find-even items))
          (cons n (find-odd items))))
      
    
    (same-parity 1 2 3 4 5 6 7)
    (same-parity 2 3 4 5 6 7)

์—ฐ์Šต๋ฌธ์ œ 2.21

    (define (square-list items)
      (if (null? items)
          null
          (cons (* (car items) (car items)) (square-list (cdr items)))))
    ;๋ฌธ์ œ์˜ ์˜๋„๋ฅผ ๋ฌด์‹œํ•˜๊ณ  Scheme ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉ =_=;;
    (define (square-list-2 items)
      (map * items items))
    
    
    (square-list (list 1 2 3 4))
    (square-list-2 (list 1 2 3 4))

์—ฐ์Šต๋ฌธ์ œ 2.23

    ; ์ข€ ์–ต์ง€์Šค๋Ÿฌ์šด =_=;
    (define (for-each-mine fun items)
      (if (null? items)
          (newline)
          (and (fun (car items)) (for-each-mine fun (cdr items)))))
    
    (for-each (lambda (x) (newline) (display x))
              (list 57 321 99))
    
    (for-each-mine (lambda (x) (newline) (display x))
                   (list 57 321 99))

์—ฐ์Šต๋ฌธ์ œ 2.25

    ;(1 3 (5 7) 9)
    (define list1 (list 1 3 (list 5 7) 9))
    list1
    (car (cdr (car(cdr (cdr list1)))))
    (newline)
    ;((7))
    (define list2 (list (list 7)))
    list2
    (car (car list2))
    (newline)
    ;(1 (2 (3 (4 (5 (6 7))))))
    (define list3 (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7)))))))
    list3
    (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr list3))))))))))))
    
    (newline)

์—ฐ์Šต๋ฌธ์ œ 2.28

    (define (fringe items)
      (if (pair? items)
          (append (fringe (car items)) (fringe (cdr items)))
          (if (null? items)
              null
              (list items))))
    
    (define 2.28.x (list (list 1 2) (list 3 4)))
    
    2.28.x
    
    (fringe 2.28.x)
    (fringe (list 2.28.x 2.28.x))