Commonlisp(xyzzy)でSICPの第2章を解く

問題2.21

(progn 
  (defun square-list (items)
	(if (null items)
		nil
	  (cons (* (car items) (car items))
			(square-list (cdr items)))))
  (square-list (list 1 2 3 4)))

-> (1 4 9 16)

(progn 
  (defun square-list (items)
	(map 'list (lambda (x) (* x x)) items))
  (square-list (list 1 2 3 4)))

-> (1 4 9 16)

問題 2.28

(progn
  (defun fringe (tree)
	(cond
	 ((not tree) )
	 ((atom tree) (format t "~A " tree))
	 (t (fringe (car tree))
		(fringe (cdr tree)))))
		
  (setf x '((1 2) (3 4)))

  (fringe x)
  (format t "~%")
  (fringe (list x x)))1 2 3 41 2 3 4 1 2 3 4 

問題2.22
累算変数 answer に計算結果を格納する末尾再帰式だから

(progn
  (defun square (x)
	(* x x))
  
  (defun square-list (items)
	(defun iter (things answer)
	  (if (null things)
		  answer
		(iter (cdr things)
			  (cons (square (car things))
					answer)))) ; 累算変数 answer
	(iter items nil))
  
  (square-list (list 1 2 3 4)))

-> (16 9 4 1)

(progn
  (defun square (x)
	(* x x))
  
  (defun square-list (items)
	(defun iter (things answer)
	  (if (null things)
		  answer
		(iter (cdr things)
			  (cons answer
					(square (car things))))))
	(iter items nil))
  
  (square-list (list 1 2 3 4)))

-> ((((nil . 1) . 4) . 9) . 16)

問題 2.27
(progn
  (defun rvrs (lst acc)
	(cond ((not lst)   acc)
		  ((atom lst)  lst)
		  (t (rvrs (cdr lst)
				   (cons (rvrs (car lst) nil)
						 acc)))))

  (defun deep-reverse (lst)
	(rvrs lst '()))

  (deep-reverse '((1 (2 3)) (4 5 6) ((7 8) 9))))((9 (8 7)) (6 5 4) ((3 2) 1))