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

CADRでSICP Exercise 1.1

| 17:57 | CADRでSICP Exercise 1.1 - わだばLisperになる を含むブックマーク はてなブックマーク - CADRでSICP Exercise 1.1 - わだばLisperになる

CADRでSICP Exercise 1.1.に挑戦 - Structure and Interpretation of Computer Programs

今回から1.1から順にSICPの問題に挑戦。

Exercise 1.1
インタプリタに式を入力して結果を観察。
10
-> 10.

(+ 5 3 4)
-> 12.

(- 9 1)
-> 8.

(+ (* 2 4) (- 4 6))
-> 6.

(defvar a 3)
-> NIL

(defvar b (+ a 1))
-> NIL

(= a b)
-> NIL

(if (and (> b a) (< b (* a b)))
    b
  a)
-> 4.

(cond ((= a 4) 6)
      ((= b 4) (+ 6 7 a))
      ('T 25))
-> 16.

(* (cond ((> a b) a)
	 ((< a b) b)
	 ('T -1))
   (+ a 1))
-> 16.

Lisp Machine Lisp固有と思われるところ:

・defvarが値をセットした時にNILを返すところ。

Maclispもそうなのかと思って試してみたら、Maclispは、

変数名を返す。Gaucheでも、SBCLでもそう。この辺は、

言語仕様なのか、処理系依存なのか調べないと分からな

い…けど…まあ…良いか(´▽`*)


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

L-99 (62)

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

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

今回のお題は、P61の逆で、葉っぱじゃなくて節を数え

よとのこと。

P62

解答
;; Lisp Machine Lisp
(defun internals (tree)
  (if (null tree)
      '()
    (if (leafp tree)
	'()
      `(,(car tree)
	,@(internals (cadr tree))
	,@(internals (caddr tree))))))

;; Common Lisp
(defun internals (tree)
  (labels ((cpass (tree cont)
	     (if (endp tree)
		 (funcall cont '() )
		 (if (leafp tree)
		     (funcall cont '() )
		     (cpass (second tree)
			    #'(lambda (l)
				(cpass (third tree)
				       #'(lambda (r)
					   (funcall cont `(,(car tree) ,@l ,@r))))))))))
    (cpass tree #'values)))

;; Scheme
(define (internals tree)
  (let cpass ((tree tree)
	      (cont values))
    (if (null? tree)
	(cont '() )
	(if (leaf? tree)
	    (cont '() )
	    (cpass (cadr tree)
		   (lambda (l)
		     (cpass (caddr tree)
			    (lambda (r)
			      (cont `(,(car tree) ,@l ,@r))))))))))

L-99 (61A)

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

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

P61Aもまた訂正。前の回答では、単なるflattenになっ

てました。そうだと思ってました( ´)Д(`)

P61A

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

;; Common Lisp
(defun leaves (tree)
  (labels ((cpass (tree cont)
	     (if (endp tree)
		 (funcall cont '() )
		 (if (leafp tree)
		     (funcall cont `(,(car tree)))
		     (cpass (second tree)
			    #'(lambda (l)
				(cpass (third tree)
				       #'(lambda (r)
					   (funcall cont `(,@l ,@r))))))))))
    (cpass tree #'values)))

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

L-99 (訂正L-99.61)

| 14:30 | L-99 (訂正L-99.61) - わだばLisperになる を含むブックマーク はてなブックマーク - L-99 (訂正L-99.61) - わだばLisperになる

L-99 P61に挑戦を訂正 - L-99:Ninety-Nine Lisp Problems

P62の回答を作成しようと問題を読んでいて問題の意味

を取り違えていたことに気付いた。

葉っぱと節の定義を良く把握していなかったため、葉っ

ぱと節を区別しないで、実装していた(:.;゜;Д;゜;.:)

やり直しました。

P61

解答
;; Lisp Machine Lisp
(defun leafp (tree)
  (and tree
       (car tree)
       (atom (car tree))
       (null (cadr tree))
       (null (caddr tree))))

(defun count-leaves (tree)
  (if (null tree)
      0
    (if (leafp tree)
	1
      (+ (count-leaves (cadr tree))
	 (count-leaves (caddr tree))))))

;; Common Lisp
(defun leafp (tree)
  (and tree
       (car tree)
       (atom (car tree))
       (endp (cadr tree))
       (endp (caddr tree))))

(defun count-leaves (tree)
  (labels ((cpass (tree cont)
	     (if (endp tree)
		 (funcall cont 0)
		 (if (leafp tree)
		     (funcall cont 1)
		     (cpass (second tree)
			    #'(lambda (l)
				(cpass (third tree)
				       #'(lambda (r)
					   (funcall cont (+ l r))))))))))
    (cpass tree #'values)))

;; Scheme
(define (leaf? tree)
  (and (not (null? tree))
       (not (null? (car tree)))
       (not (pair? (car tree)))
       (null? (cadr tree)))
       (null? (caddr tree)))

(define (count-leaves tree)
  (let cpass ((tree tree)
	      (cont values))
    (if (null? tree)
	(cont 0)
	(if (leaf? tree)
	    (cont 1)
	    (cpass (cadr tree)
		   (lambda (l)
		     (cpass (caddr tree)
			    (lambda (r)
			      (cont (+ l r))))))))))
;