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 4 → 1 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))