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 |

2008-05-18

cCLan

| 05:27 | cCLan - わだばLisperになる を含むブックマーク はてなブックマーク - cCLan - わだばLisperになる

久し振りにcclanのページをみたら、表記がcCLanとなっていた。(前から?)

もしや、と思って確認してみたら、CTANや、CPANに範をとったプロジェクトとのこと。

http://sourceforge.net/projects/cclan/

知らなかった…。

しかし、CLRFI(SRFIの真似)といい、cCLanといい、最初から共有を目指したプロジェクトがあまり芳しい成果をあげていないように見えるのはなぜなんだろう…。

ArcでL-99 (P59 左右で高さのバランスのとれた二分木)

| 05:09 | ArcでL-99 (P59 左右で高さのバランスのとれた二分木) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P59 左右で高さのバランスのとれた二分木) - わだばLisperになる

ここでいう左右で高さのバランスのとれた二分木とは、左右の木た高さの差が±1までの二分木とのこと。

本来バックトラックで解くところですが、全通り生成しております。

そして、hbal-treeで条件を満した木を選り分けているのですが、最初から条件を満した木を生成してしまっているため、意味のないことになっております…。

;(each x (firstn 5 (hbal-tree 3)) (prn x))
;>>>
;(x (x (x nil nil) (x nil nil)) (x (x nil nil) (x nil nil)))
;(x (x (x nil nil) nil) (x (x nil nil) (x nil nil)))
;(x (x nil (x nil nil)) (x (x nil nil) (x nil nil)))
;(x (x (x nil nil) (x nil nil)) (x (x nil nil) nil))
;(x (x (x nil nil) nil) (x (x nil nil) nil))

(def hbal-tree (h)
  (keep hbal-tree-p gen-tree-h.h))

(def gen-tree-h (h)
  (case h
    0 '(())
    1 '((x () ()))
    (with (h-1 (gen-tree-h (- h 1))
           h-2 (gen-tree-h (- h 2)))
      (map (fn (tree) `(x ,@tree))
           `(,@(comb2 h-1 h-1)
             ,@(comb2 h-1 h-2)
             ,@(comb2 h-2 h-1))))))

(def hbal-tree-p (tree)
  (let (_ left right) tree
    (>= 1 (abs (- tree-height.left 
                  tree-height.right))))

(def tree-height (tree)
  (let (_ left right) tree
    (if tree
        (+ 1 (max tree-height.left
                  tree-height.right))
        0)))

CLOSでL-99 (P22 指定した範囲の数列のリスト)

| 03:52 | CLOSでL-99 (P22 指定した範囲の数列のリスト) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P22 指定した範囲の数列のリスト) - わだばLisperになる

色々な型に対応しつつ、コードの重複を避けるように考えているのですが、いまいちCLOS流というのが掴めていません…。

今回は、フロントに総称関数を置いて共通部分は、関数に括り出すという感じにしてみました。

;(range 4 9)
;=> (4 5 6 7 8 9)

;(mapc #'princ (range #\あ #\お))
;=> あぃいぅうぇえぉお

(defgeneric RANGE (start end)
  (:documentation
   "P22 (*) Create a list containing all integers within a given range."))

(defmethod RANGE ((start integer) (end integer))
  (RANGE1 start end #'values))

(defmethod RANGE ((start character) (end character))
  (let ((start (char-code start))
        (end (char-code end)))
    (RANGE1 start end #'code-char)))

(defun RANGE1 (start end fn)
  (declare (integer start end))
  (if (< start end)
      (loop :for i :from start :to end :collect (funcall fn i))
      (loop :for i :from start :downto end :collect (funcall fn i))))

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20080518