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-12

L-99 (21)

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

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

P21

解答
;; Common Lisp
(defun insert-at (item list n)
  (do ((l list (cdr l))
       (c 1 (1+ c))
       (retlist '() (if (= c n)
			(return `(,@retlist ,item ,@l))
			`(,@retlist ,(car l)))))
      ((endp l) retlist)))

;; Scheme
(define insert-at
  (lambda (itm ls n)
    (call/cc
     (lambda (return)
       (let loop ((l ls) 
		  (c 1) 
		  (rl '()))
	 (cond ((null? l) 
		rl)
	       ((= c n) 
		(return `(,@rl ,itm ,@l)))
	       (else
		(loop (cdr l) 
		      (+ c 1) 
		      `(,@rl ,(car l))))))))))

これを作ってる最中に今迄作成した解答の無駄な部分に

気が付いた。

今回のinsert-atや、splitなどは、結果が判明した時点

で残りのCDRをくっつけて返せば良かったではないか。

ということで、returnとか、call/ccを使ってみた。