第6回の宿題やらなきゃ!

勝手に宿題やってみる
ttp://web.sfc.keio.ac.jp/~aihara/lisp06/hiki.cgi?%C2%E86%B2%F3%BD%C9%C2%EA

課題1

(defun average (ls)
  (let ((sum 0))
	(dolist (x ls (/ sum (length ls)))
	  (setq sum (+ sum x)) )))

(average '(282 299 282 286 291 295 283 280))
->1149/4


課題2

;;データ
(setq data '((Jan . 50) (Feb . 30) (Mar . 55) (Apr . 98) (May . 120)
	(Jun . 100) (Jul . 80) (Aug . 18) (Sep . 70) (Oct . 105)
	(Nov . 85) (Dec . 170) ))

2.1

>(mapcar #'(lambda (x) (print (cdr x))) data)
;;以下出力
50 
30 
55 
98 
120 
100 
80 
18 
70 
105 
85 
170 
(50 30 55 98 120 100 80 18 70 105 85 170)

2.2

>(sort data #'> :key #'cdr)
((Dec . 170) (May . 120) (Oct . 105) (Jun . 100) (Apr . 98) (Nov . 85) (Jul . 80) (Sep . 70) (Mar . 55) (Jan . 50) (Feb . 30) (Aug . 18))

2.3

>(apply #'+ (mapcar #'cdr data))
981


課題3
クラスを使ってるっぽい(?)けどCLOSは知らないので勝手に構造体でGO

;;データ
(defstruct book v1 v2 v3)

(setf books
	  (list (make-book :v1 '(Kaze no Uta wo kike) :v2 '(Murakami haruki) :v3 '(novel))
			(make-book :v1 '(Mezon Ikkoku) :v2 '(Takahashi Rumiko) :v3 '(comics))
			(make-book :v1 '(Izu no Odoriko) :v2 '(Kawabata Yasunuari) :v3 '(novel))
			(make-book :v1 '(Common Lisp) :v2 '(Guy L Steele) :v3 '(technical lisp))
			(make-book :v1 '(Tom Sawyer) :v2 '(Mark Twain) :v3 '(novel) )))

3.1

(defun list-authors (ls)
  (labels ((rec (s acc)
	   (cond ((endp s) (reverse acc))
		  (t
		    (rec (cdr s) (cons (book-v1 (car s)) acc)) ))))
    (rec ls nil) ))

>(list-authors books)
((Kaze no Uta wo kike) (Mezon Ikkoku) (Izu no Odoriko) (Common Lisp) (Tom Sawyer))

;;別解
>(mapcan #'(lambda (x) (list (book-v1 x))) books)
((Kaze no Uta wo kike) (Mezon Ikkoku) (Izu no Odoriko) (Common Lisp) (Tom Sawyer))

3.2

(defun list-novel-books (ls)
  (let ((novelp #'(lambda (x) (eq 'novel (car (book-v3 x))))))
	(labels ((rec (s acc)
		   (cond ((endp s) (reverse acc))
			 (t (rec (cdr s)
				 (if (funcall novelp (car s)) (cons (car s) acc) acc) )))))
	  (rec ls nil) )))

>(list-novel-books books)
(#S(book v1 (Kaze no Uta wo kike) v2 (Murakami haruki) v3 (novel)) #S(book v1 (Izu no Odoriko) v2 (Kawabata Yasunuari) v3 (novel)) #S(book v1 (Tom Sawyer) v2 (Mark Twain) v3 (novel)))


;;別解
>(mapcan #'(lambda (x) (if (eq 'novel (car (book-v3 x))) (list x))) books)
(#S(book v1 (Kaze no Uta wo kike) v2 (Murakami haruki) v3 (novel)) #S(book v1 (Izu no Odoriko) v2 (Kawabata Yasunuari) v3 (novel)) #S(book v1 (Tom Sawyer) v2 (Mark Twain) v3 (novel)))


課題4

(defun do-length (ls)
  (do ((i 0 (1+ i)))
	  ((null (nth i ls)) i) ))

>(setq test '(1 2 3 4 5 6))
>(do-length test)
6

doの記憶が曖昧になっててちょっと苦戦した


課題5

(defun nth-loop (ls)
  (let ((r 0))
   (loop for x in ls count r) )))

xyzzyだとloopが完璧に実装されていない(?)ようなのでCLISPで書いた。
Common Lispのloopってこんなに色んな書き方があったのか!
loopについてもっと勉強しないと。


課題6
パス


先生終わりました!