SICP

;;; q2.21
(define (square-list items)
  (if (null? items)
     '()
     (cons (* (car items) (car items)) (square-list (cdr items))) )
  )
(define (square-list items)
  (map (lambda (x)
         (* x x)
         ) items)
  )
(square-list (list 1 2 3))
(define (square x)
  (* x x)
  )
(define (square-list items)
  (define (iter things answer)
    (if (null? things)
        answer
        (iter (cdr things)
              (cons (square (car things))
                    answer))))
  (iter items '()))
(square-list (list 1 2 3))

(define (square-list items)
  (reverse(square-list-iter items '())))
(define (square-list-iter things answer)
  (if (not(null? things))
      (square-list-iter (cdr things)
            (cons (square (car things));iter中のリストの頭には常にcdrのcarが来るのです
                  answer))
      answer
      ))
(trace square-list-iter)
(square-list (list 1 2 3))

(define (square-list items)
  (define (iter things answer)
    (if (null? things)
        answer
        (iter (cdr things)
              (cons answer ;リストをconsするので
                    (square (car things))))))
  (iter items '()))
(square-list (list 1 2 3))

;;; q2.23
(for-each (lambda (x)
            (newline) (display x))
                      (list 55 66 44))
(define (for-each proc list)
  (if (null? (cdr list))
    (proc (car list))
    (begin
     (proc (car list))
     (for-each proc (cdr list))))
  )
;;beginは使っちゃダメだろJK
;;だがしかし。
(define (for-each proc list)
  (if (null? (cdr list))
      (proc (car list))
      (let ()
        (proc (car list))
        (for-each proc (cdr list)))
      )
  )
;;動くが!
(for-each (lambda (x)
            (newline) (display x))
          (list 55 66 44))

letって何?