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

L-99 (61A)

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

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

二分木の内容をリストにするというお題。

継続渡しスタイルで書いてみた。

残念ながら、CADRでそのまま試すとPDL-Overflow(スタッ

クオーバーフロー)になってしまうので、Lisp Machine

Lispでは、普通に書いてみた。

P61A

;; Lisp Machine Lisp
(defun leaves (tree)
  (if (null tree)
      '()
    `(,(car tree) 
      ,@(leaves (cadr tree))
      ,@(leaves (caddr tree)))))

;; Common Lisp
(defun leaves (tree)
  (labels ((cpass (tree cont)
	     (if (endp tree)
		 (funcall cont '())
		 (cpass (cadr tree) 
			#'(lambda (m)
			    (cpass (caddr tree) 
				   #'(lambda (n)
				       (funcall cont `(,(car tree) ,@m ,@n)))))))))
    (cpass tree #'values)))

;; Scheme
(define (leaves tree)
  (let cpass ((tree tree)
	      (cont values))
    (if (null? tree)
	(cont '())
	(cpass (cadr tree) 
	       (lambda (m)
		 (cpass (caddr tree) 
			(lambda (n)
			  (cont `(,(car tree) ,@m ,@n)))))))))