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

L-99 (L-99.62B)

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

L-99 P62Bに挑戦 - L-99:Ninety-Nine Lisp Problems

頂点をレベル1として、指定した階層のノードをリスト

にして返す関数の作成がお題。

P62B

解答

;; Lisp Machine Lisp
(defun atlevel (level tree)
  (cond ((null tree) '() )
	((= 1 level) `(,(car tree)))
	('T
	 `(,@(atlevel (1- level) (second tree))
	   ,@(atlevel (1- level) (third tree))))))

;; Common Lisp
(defun atlevel (level tree)
  (labels ((frob (level tree cont)
	     (cond ((endp tree) (funcall cont '() ))
		   ((= 1 level) (funcall cont `(,(car tree))))
		   ('T
		    (frob (1- level) 
			  (second tree) 
			  #'(lambda (l)
			      (frob (1- level)
				    (third tree)
				    #'(lambda (r)
					(funcall cont `(,@l ,@r))))))))))
    (frob level tree #'values)))

;; Scheme
(define (atlevel level tree)
  (let frob ((level level)
	     (tree tree)
	     (cont values))
    (cond ((null? tree) (cont '() ))
	  ((= 1 level) (cont `(,(car tree))))
	  (else
	   (frob (- level 1) 
		 (cadr tree) 
		 (lambda (l)
		   (frob (- level 1)
			 (caddr tree)
			 (lambda (r)
			   (cont `(,@l ,@r))))))))))