Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-01-17

L-99 (8)

| 23:38 | L-99 (8) - わだばLisperになる を含むブックマーク はてなブックマーク - L-99 (8) - わだばLisperになる

L-99 8問目に挑戦 - L-99:Ninety-Nine Lisp Problems

P08

解答
;;; Common Lisp
(defun compress (list)
  (if (consp list)
    (if (and (equal (car list) (cadr list))
	     (consp (cdr list)))
      (compress (cdr list))
      (append (list (car list))
	      (compress (cdr list))))))

;; doを使ってみた版
(defun compress (list)
  (do ((l list (cdr l))
       (ret '() (if (and (consp (cdr l))
			 (equal (car l) (cadr l)))
		  ret
		  (append ret (list (car l))))))
      ((null l) ret)))

;;; Scheme
(define compress
  (lambda (l)
    (let ((clcar
	   (lambda (l)
	     (if (pair? l)
		 (car l)
		 '())))
	  (clcadr
	   (lambda (l)
	     (if (pair? l)
		 (if (pair? (cdr l))
		     (cadr l))
		 '()))))
      (letrec ((compress1
		(lambda (l)
		  (if (pair? l)
		      (if (and (pair? (cdr l))
			       (equal? (clcar l) (clcadr l)))
			  (compress1 (cdr l))
			  (append (list (car l))
				  (compress1 (cdr l))))
		      '()))))
	(compress1 l)))))

Scheme版が妙に長いのは、Common Lispのcarとcadrと同

じように、(car '())としたときにnilが返るような

clcarと、clcadrを定義してみたため。Gaucheだと拡張

機能で、(list-ref ls 1 '())のように書けるらしい。

なんとなく補助関数を全部関数の中に無理に纏めて書い

たりするのは変だったりするんだろうと思ったりはして

いる冬。