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-02-04

L-99 (17)

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

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

P17

解答
;; Common Lisp
(defun split (list n)
  (do ((l list (cdr l))
       (c 0 (1+ c))
       (retlist '(() ()) 
		(let ((first  (car retlist))
		      (second (cadr retlist)))
		  (if (< c n)
		      `((,@first ,(car l)) ,second)
		      `(,first (,@second ,(car l)))))))
      ((endp l) retlist)))

;; Scheme
(define split
  (lambda (ls n)
    (letrec ((split1
	      (lambda (l p c rl)
		(if (null? l)
		    rl
		    (split1 (cdr l) 
			    p 
			    (+ c 1)
			    (let ((1st (car rl))
				  (2nd (cadr rl)))
			      (if (< c p)
				  `((,@1st ,(car l)) ,2nd)
				  `(,1st (,@2nd ,(car l))))))))))
      (split1 ls n 0 '(() ())))))

doばかり使っていたら、なんとなくdoに親近感が湧いて

きてしまった。末尾再帰で書くのとdoでbodyを使わない

で書くのとは感覚的に似ている気がする。